tmpfile和gzip组合问题

2024-05-29 10:01:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我对这个代码有问题:

file = tempfile.TemporaryFile(mode='wrb')
file.write(base64.b64decode(data))
file.flush()
os.fsync(file)
# file.seek(0)
f = gzip.GzipFile(mode='rb', fileobj=file)
print f.read()

我不知道为什么它不打印任何东西。如果我取消注释文件.seek然后出现错误:

^{pr2}$

仅供参考,此版本运行良好:

x = open("test.gzip", 'wb')
x.write(base64.b64decode(data))
x.close()
f = gzip.GzipFile('test.gzip', 'rb')
print f.read()

编辑:针对wrb问题。初始化时不会给我一个错误。Python 2.5.2。在

>>> t = tempfile.TemporaryFile(mode="wrb")
>>> t.write("test")
>>> t.seek(0)
>>> t.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 9] Bad file descriptor

Tags: testreaddatamodeseektempfilefilewrite
2条回答

'wrb'不是有效模式。在

这很好:

import tempfile
import gzip

with tempfile.TemporaryFile(mode='w+b') as f:
    f.write(data.decode('base64'))
    f.flush()
    f.seek(0)
    gzf = gzip.GzipFile(mode='rb', fileobj=f)
    print gzf.read()

一些提示:

  • 不能在wrb模式下.seek(0)或{}gzip文件,wb或{}。GzipFile类__init__仅通过查看wrb的第一个字符将自身设置为READ或{}(本例中将其自身设置为WRITE)。在
  • 当执行f = gzip.GzipFile(mode='rb', fileobj=file)时,真正的文件是file而不是f,在阅读了gzip文件类定义之后,我明白了这一点。在

我的一个有效的例子是:

from tempfile import NamedTemporaryFile

import gzip


with NamedTemporaryFile(mode='w+b', delete=True, suffix='.txt.gz', prefix='f') as t_file:
    gzip_file = gzip.GzipFile(mode='wb', fileobj=t_file)
    gzip_file.write('SOMETHING HERE')
    gzip_file.close()
    t_file.seek(0)

    # Do something here with your t_file, maybe send it to an external storage or:
    print t_file.read()

我希望这能对其他人有用,我花了很多时间才让它发挥作用。在

相关问题 更多 >

    热门问题