68

Python では、文字データ用のファイルのようなバッファーにStringIOを使用できます。メモリ マップト ファイルは基本的にバイナリ データに対して同様のことを行いますが、ベースとして使用されるファイルが必要です。Python には、Java のByteArrayOutputStreamと同等の、バイナリ データを対象としたメモリのみのファイル オブジェクトがありますか?

私が持っているユースケースは、メモリ内に ZIP ファイルを作成したいというもので、ZipFileにはファイルのようなオブジェクトが必要です。

4

3 に答える 3

88

おそらく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")
于 2011-09-09T06:34:34.550 に答える
24

Unicode データを に入れようとせずStringIO、使用しないように注意している限り、問題ありませんcStringIO

StringIOのドキュメントによると、Unicode または 8 ビットを維持している限り、すべてが期待どおりに機能します。おそらく、StringIO誰かが何かをするときに特別なことf.write(u"asdf")をします(私の知る限り、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()

期待どおりに機能し、結果のアーカイブ内のファイルと元のファイルに違いはありません。

このアプローチが機能しない特定のケースを知っている場合は、それについて聞いてみたいと思います:)

于 2008-08-24T16:52:29.453 に答える
4

構造体パッケージを見てください: 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 バイトの short を読み取り、"l" は 4 バイトの long を読み取ります。明らかに、これらをバイナリデータから読み取る必要があるものに変更できます...

于 2008-08-24T15:50:54.077 に答える