web-dev-qa-db-ja.com

メモリー内のバイト(BytesIO)を書き込んでから読み取ると、結果が空白になります

python BytesIOクラスを試してみたかった。

実験として、メモリ内のZipファイルに書き込み、そのZipファイルからバイトを読み取ってみました。そのため、ファイルオブジェクトをgzipに渡す代わりに、BytesIOオブジェクトを渡します。スクリプト全体は次のとおりです。

from io import BytesIO
import gzip

# write bytes to Zip file in memory
myio = BytesIO()
g = gzip.GzipFile(fileobj=myio, mode='wb')
g.write(b"does it work")
g.close()

# read bytes from Zip file in memory
g = gzip.GzipFile(fileobj=myio, mode='rb')
result = g.read()
g.close()

print(result)

ただし、bytesに対して空のresultオブジェクトを返しています。これはPython 2.7と3.4の両方で発生します。何が欠けていますか?

51
twasbrillig

seek 必要なのは、メモリファイルにイニシャルを書き込んだ後、ファイルの先頭に戻ることです...

myio.seek(0)
81
mgilson

このような同じコンテキストでgzipコンテンツを読み書きするのはどうですか?このアプローチが適切であり、これを読んでいる人に役立つ場合は、この回答を+1してください。そうすれば、このアプローチが正しく理解され、他の人にも役立つでしょうか?

#!/usr/bin/env python

from io import BytesIO
import gzip

content = b"does it work"

# write bytes to Zip file in memory
gzipped_content = None
with BytesIO() as myio:
    with gzip.GzipFile(fileobj=myio, mode='wb') as g:
        g.write(content)
        g.close()
    gzipped_content = myio.getvalue()

print(gzipped_content)
print(content == gzip.decompress(gzipped_content))
0
Gatsby Lee