python3 2進数保存
python3で値を保存するとき、以下のようにしています。
python
1a=1 2value=a.to_bytes(1, 'big') 3with open('test.bi' ,'wb') as f: 4 f.write(value) 5 6print(value) ## b'\x01'
しかし、a=1の場合、0b1を保存するだけでいいのに、byte型変換すると1byte分の情報が含まれてしまいます。
要するに、値が0,1だけの場合2進数(1bit)で保存したいのですが、どうしたらいいのでしょうか?
試したこと
python3の2進数変換
python
1i=1 2bin_str = bin(i) 3print(type(bin_str)) ## -> 0b1 (str型に変換される) 4with open('test.bi', 'wb') as f: 5 f.write(bin_num) ## str型ではerrorになる 6 7_int = int(bin_num, 2) ## int型に変換 8value = _int.to_bytes(~~) ## 結局byte型に変換してしまうはめに... 9with open('test.bi', 'wb') as f: 10 f.write(int(bin_num, 2)) ## 1byte保存する結果に
c++のようにメモリを自由に割り当てできる言語じゃないとできないのでしょうか??
誰かご教授願います( ;´Д`)
補足情報(FW/ツールのバージョンなど)
python3.5.2
Pythonについて聞きたいのであれば、紛らわしいので C++ のタグは削除してください。
すみません...
訂正します。
再現しません。
value=a.to_bytes(1, 'big')
の時点でのvalueはどうなっていますか?
あるいは省略した工程はありませんか?
>>> a=1
>>> value=a.to_bytes(1, 'big')
>>> value
b'\x01'
3.6.1で試しましたがprint(value)はb'\x01'ですし、
ファイルに書かれるのも1バイトだけでした
すみません、手違いで2バイト分書いてしまいました。
valueの値はb'\x01'の1byteで出力されました。
これをa=1の場合、1bitで保存する方法はあるのでしょうか?という質問です。
ややこしくなってすみません...
1bitのデータを8個ずつにまとめて1byte単位にすればいいとかそういう話でなく?
データが8の倍数でない時があるので、出来れば1bitずつの保存が望ましいです!
C++ でも Python でもファイルの保存はバイト単位でしかできないと思います。
1bit のデータを保存する場合でも1バイトの保存しか不可能だと思いますよ。
@tiitoiさん
そうなんですね。勉強になります。諦めてバイトで保存できるようにしてみます。
@ozwkさん、@matherさんもありがとうございました。
例えば、15bit 分の情報を保存するとして、2bytes (16bits) のバイナリとして保存するのではなにか問題があるのでしょうか?
0値を0、0以上を1としたマスクデータの生成を考えています。
例えば、000001001 という9bitのデータを後ろに7bit分0を付け加えると元々9bitのデータが16bitに拡張されてしまうので、データの削除処理と冗長な情報量を保存してしまうといった点ですかね...
ストレージの広さを考えれば多少の冗長さは問題ないですし、どうしても気になるなら圧縮だってできますよ
@hayataka2049さん
圧縮についてちょっと調べてみます!
1バイトのファイルを作っても、ディスク上は4kバイトといったブロック1つを使ってしまうので(4kバイトの部分はファイルシステムで変わります)、小さいファイルをたくさん作ろうとする方が実際は無駄なことになりますよ。
回答じゃないのでここで。
圧縮する意味があるとしてもMBの単位を越えてからだとコメントしておきます・・・
# 真面目な話、よほどでかいマスクを作るつもりでなければ何も考えず突っ込んで問題ないと思うのですが……
@quiquiさん
そうなんですね!またしても勉強になります!
ハードウェアの勉強もしておきます。
@hayataka2049さん
多分、kbyteくらいの規模だと思います( 一一)
回答2件
あなたの回答
tips
プレビュー