Problem with tmpfile and gzip

I have a problem with this code:

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

I do not know why he does not print anything. If I uncomment the file.seek file, an error will occur:

  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 

Just for information, this version works just fine:

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

EDIT: for wrb problem. This does not give me an error during initialization. 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 
+8
python base64 gzip
source share
2 answers

'wrb' not valid.

This works great:

 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() 
+11
source share

A few tips:

  • You cannot .seek(0) or .read() a gzip file in wrb or wb or w+b mode. The GzipFile __init__ class sets itself to READ or WRITE only by looking at the first wrb character (in this case, set it to WRITE ).
  • When executing f = gzip.GzipFile(mode='rb', fileobj=file) your real file is file not f , I understood this after reading the definition of the GzipFile class.

A working example for me was:

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

I hope this can be useful for someone out there, spending a lot of time to get it working.

0
source share

All Articles