将 io.BytesIO 对象传递给 gzip.GzipFile 并写入 GzipFile

tim*_*kro 5 gzip bytesio python-3.x

我基本上想做的正是文档中的内容gzip.GzipFile

\n\n
\n

调用 GzipFile 对象\xe2\x80\x99s close() 方法不会关闭 fileobj,因为您可能希望在压缩数据后附加更多材料。这还允许您传递一个为写入而打开的 io.BytesIO 对象作为 fileobj,并使用 io.BytesIO object\xe2\x80\x99s getvalue() 方法检索结果内存缓冲区。

\n
\n\n

对于普通文件对象,它可以按预期工作。

\n\n
>>> import gzip\n>>> fileobj = open("test", "wb")\n>>> fileobj.writable()\nTrue\n>>> gzipfile = gzip.GzipFile(fileobj=fileobj)\n>>> gzipfile.writable()\nTrue\n
Run Code Online (Sandbox Code Playgroud)\n\n

gzip.GzipFile但在传递对象时我无法设法获取可写对象io.BytesIO

\n\n
>>> import io\n>>> bytesbuffer = io.BytesIO()\n>>> bytesbuffer.writable()\nTrue\n>>> gzipfile = gzip.GzipFile(fileobj=bytesbuffer)\n>>> gzipfile.writable()\nFalse\n
Run Code Online (Sandbox Code Playgroud)\n\n

我是否必须打开io.BytesIO显式内容才能进行写入?我该怎么做?或者返回的文件对象和 我没有想到的open(filename, "wb")返回的对象之间是否有区别?io.BytesIO()

\n

Mar*_*ers 11

是的,您需要显式地将GzipFile模式设置为'w';否则它会尝试从文件对象获取模式,但对象BytesIO没有.mode属性:

>>> import io
>>> io.BytesIO().mode
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: '_io.BytesIO' object has no attribute 'mode'
Run Code Online (Sandbox Code Playgroud)

只需明确指定模式:

gzipfile = gzip.GzipFile(fileobj=fileobj, mode='w')
Run Code Online (Sandbox Code Playgroud)

演示:

>>> import gzip
>>> gzip.GzipFile(fileobj=io.BytesIO(), mode='w').writable()
True
Run Code Online (Sandbox Code Playgroud)

原则上,BytesIO对象在模式下打开'w+b',但GzipFile只会查看文件模式的第一个字符。