2013-08-21 34 views
61

私は、バイナリとしてファイルにこのリストを書くことができますどのようにバイナリファイルに書き込む方法は?

[120, 3, 255, 0, 100] 

のようなものである整数としてバイトのリストを持っていますか?

これは機能しますか?

newFileBytes = [123, 3, 255, 0, 100] 
# make file 
newFile = open("filename.txt", "wb") 
# write to file 
newFile.write(newFileBytes) 
+31

「これは動作しますか?」と尋ねます。あなたはそれを試しましたか? – StephenTG

+0

'TypeError:引数1はリストではなく文字列かバッファでなければなりません。 ' –

答えて

62

これはbytearrayはですまさにです。しかし、bytesstrの別名にすぎないので、Python 2.xでは動作しません。いつものように、インタラクティブなインタプリタで表示するのは、テキストで説明するよりも簡単です。

のPython 3.xの:

>>> bytearray(newFileBytes) 
bytearray(b'{\x03\xff\x00d') 
>>> bytes(newFileBytes) 
b'{\x03\xff\x00d' 

のPython 2.xの:

>>> bytearray(newFileBytes) 
bytearray(b'{\x03\xff\x00d') 
>>> bytes(newFileBytes) 
'[123, 3, 255, 0, 100]' 
+0

組み込み型をうまく使用。 bytearrayが2.6で追加されたことに注意してください。レガシーシステムをサポートしたい場合は、避けるべきです。 – Perkins

+5

@Perkins:2.3で作業する必要がある場合はジェネレータ表現を避け、2.2で作業する必要がある場合は 'str.encode'と' struct.pack'の両方に注意してください。しかし、2.6年は5年ぶりに終了しました。サポートしている3つのOS Xバージョン、CentOS/RHELの以前のメジャーバージョンなどはすべて、それが組み込まれています。2.5または2.1または1.6などをサポートする必要がある場合は、おそらく知っている... – abarnert

+3

Windows上のPython 2では、「bytearray」を書くと「\ n」が '\ r \ n 'に変換され、バイナリデータが不十分になります。ファイル。 – feersum

18

struct.packを使用して、整数値をバイナリバイトに変換し、バイトを書き込みます。例えば。

newFile.write(struct.pack('5B', *newFileBytes)) 

ただし、バイナリファイルは.txtという拡張子を与えません。

この方法の利点は、他のタイプの場合でも効果があります。たとえば、値が255より大きい場合は、代わりに'5i'を使用して完全な32ビット整数を取得できます。あなたがPythonの3.xを使用している場合は、あなたの代わりにbytesを使用することができます(そしてそれは、より良いあなたの意図を合図として、おそらく、するべきである)

newFileByteArray = bytearray(newFileBytes) 
newFile.write(newFileByteArray) 

+0

.txtは、書き込み可能なすべてのデータが印刷可能なアスキー範囲に入っていることを知る方法があれば問題ありません。しかし、例のデータには印刷できない文字が含まれているので、この場合は正しいと思います。 – Perkins

+0

@Perkins私は、値がASCII範囲では256よりもはるかに小さいと仮定していませんでした。それらがあっても、.txtファイルは、バイナリデータには決して適用されない人間にとって理にかなったもののために予約されるべきです。 –

+1

あなたが正しいですが、struct.packは、255以上の値を持つデータを書きたい場合にも使います。これは、bytearrayもchrも大きな整数値を処理できないためです。 – Perkins

7

chr機能を使用し、バイナリに整数< 256へ変換します。だからあなたは次のことを見ている。

newFileBytes=[123,3,255,0,100] 
newfile=open(path,'wb') 
newfile.write((''.join(chr(i) for i in newFileBytes)).encode('ascii')) 
3

あなたは、Python 3の構文を使用して、次のコード例を使用することができます。ここでは

from struct import pack 
with open("foo.bin", "wb") as file: 
    file.write(pack("<IIIII", *bytearray([120, 3, 255, 0, 100]))) 

シェルワンライナーです:Pythonの3.2以上のよう

python -c $'from struct import pack\nwith open("foo.bin", "wb") as file: file.write(pack("<IIIII", *bytearray([120, 3, 255, 0, 100])))' 
1

、あなたも達成することができますこれは、to_bytesネイティブintメソッドを使用して:

newFileBytes = [123, 3, 255, 0, 100] 
# make file 
newFile = open("filename.txt", "wb") 
# write to file 
for byte in newFileBytes: 
    newFile.write(byte.to_bytes(1, byteorder='big')) 

つまり、to_bytesへの1回の呼び出しでは、長さ1の文字列が作成され、その文字はビッグエンディアンの順序で配列されます(長さ1の文字列では些細です)。これは整数値byteを表します。また、1つの一つに、最後の2行を短くすることができます。

newFile.write(''.join([byte.to_bytes(1, byteorder='big') for byte in newFileBytes])) 
0

使用ピクルス、次のように:データを読み込むには

import pickle 
mybytes = [120, 3, 255, 0, 100] 
with open("bytesfile", "wb") as mypicklefile: 
    pickle.dump(mybytes, mypicklefile) 

:輸入ピクルス

あなたのコードは次のようになりますpickle.loadメソッドを使用してください。

関連する問題