質問

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バイトの長さです。明らかに、これらをバイナリデータから読み取るために必要なものに変更できます...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top