質問
Pythonでは、文字データ用のファイルのようなバッファに StringIO を使用できます。 メモリマップファイルは基本的にバイナリデータに対して同様の処理を行いますが、次のファイルが必要です。基礎として使用されます。 Pythonには、Javaの ByteArrayOutputStream ?
私が持っているユースケースは、メモリ内にZIPファイルを作成し、 ZipFile にはファイルのようなオブジェクトが必要です。
解決
おそらく io.BytesIO クラスを探しています。バイナリデータをサポートすることを除いて、StringIOとまったく同じように機能します。
from io import BytesIO
bio = BytesIO(b"some initial binary data: \x00\x01")
StringIOはTypeErrorをスローします:
from io import StringIO
sio = StringIO(b"some initial binary data: \x00\x01")
他のヒント
Unicodeデータを StringIO
に入れようとしない限り、 cStringIO
を使用しないように注意してください。
ユニコードを保持するか、またはUnicodeを維持する限り、 StringIO のドキュメントによる8ビットすべてが期待どおりに機能します。おそらく、誰かが f.write(u" asdf")
を実行すると、 StringIO
は特別な処理を実行します(ZipFileは実行しません)。とにかく
import zipfile
import StringIO
s = StringIO.StringIO()
z = zipfile.ZipFile(s, "w")
z.write("test.txt")
z.close()
f = file("x.zip", "w")
f.write(s.getvalue())
s.close()
f.close()
期待どおりに機能し、作成されたアーカイブ内のファイルと元のファイルに違いはありません。
このアプローチが機能しない特定のケースを知っているなら、私はそれについて聞いてみたいと思います:)
構造パッケージをご覧ください: https://docs.python.org/library/struct .html を使用すると、文字列をパックされたバイナリデータとして解釈できます。
これが質問に完全に答えるかどうかはわかりませんが、struct.unpack()を使用してバイナリデータをpythonオブジェクトに変換できます。
import struct
f = open(filename, "rb")
s = f.read(8)
x, y = struct.unpack(">hl", s)
この例では、">"ビッグエンディアンで「h」を読むように指示します。 2バイトのショートを読み取り、" l" 4バイトの長さです。明らかに、これらをバイナリデータから読み取るために必要なものに変更できます...