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の両方で発生します。何が欠けていますか?
seek
必要なのは、メモリファイルにイニシャルを書き込んだ後、ファイルの先頭に戻ることです...
myio.seek(0)
このような同じコンテキストで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))