[Tutor] GzipFile has no attribute '__exit__'

Dave Angel davea at ieee.org
Mon Nov 16 12:54:49 CET 2009


Stephen Nelson-Smith wrote:
> I'm trying to write a gzipped file on the fly:
>
> merged_log = merge(*logs)
>
> with gzip.open('/tmp/merged_log.gz', 'w') as output:
>     for stamp, line in merged_log:
>         output.write(line)
>
> But I'm getting:
>
> Traceback (most recent call last):
>   File "./magpie.py", line 72, in <module>
>     with gzip.open('/tmp/merged_log.gz', 'w') as output:
> AttributeError: GzipFile instance has no attribute '__exit__'
>
> What am I doing wrong, and how do I put it right?
>
> S.
>
>   
(I get the same result in CPython 2.6, but you should have told your 
python version and OS, just so people can tell you version-specific 
problems.)

In order to use the "with" syntax with an object of a particular class, 
that class has to support the Context Manager protocol, which includes 
both __enter__() and __exit__() methods.  I don't know why the system 
checks first for __exit__(), but there you have it.

GzipFile() class doesn't have such methods (in version 2.6), and 
therefore doesn't support the Context Manager.  So you have to do it the 
"old fashioned" way, with explicit close() method, and a 
try/except/finally.  And unlike regular text files, I don't expect 
you'll find a new file at all usable, if it wasn't properly closed.


Alternatively, you could subclass it, and write your own.  At a minimum, 
the __exit__() method should close() the stream.

DaveA



More information about the Tutor mailing list