tmpfile和gzip组合问题

时间:2010-04-09 12:08:02

标签: python gzip base64

我对此代码有疑问:

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()

我不知道为什么它不打印任何东西。如果我取消注释file.seek,则会发生错误:

  File "/usr/lib/python2.5/gzip.py", line 263, in _read
    self._read_gzip_header()
  File "/usr/lib/python2.5/gzip.py", line 162, in _read_gzip_header
    magic = self.fileobj.read(2)
IOError: [Errno 9] Bad file descriptor

仅供参考,此版本可以正常使用:

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

2 个答案:

答案 0 :(得分:11)

'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()

答案 1 :(得分:1)

一些提示:

  • 您无法在.seek(0)模式下.read()wrbwbw+b的gzip文件。仅通过查看__init__的第一个字符(在这种情况下将其自身设置为READ),GzipFile类WRITE即可将自己设置为wrbWRITE
  • 执行f = gzip.GzipFile(mode='rb', fileobj=file)时,您的真实文件是file而不是f,在理解了GzipFile类定义之后,我明白了。

对我来说,一个可行的例子是:

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()

我希望这对外面的人有用,我花了很多时间使它起作用。