当在“with:”块中使用GzipFile实例时,出现“GzipFile实例没有'__exit__'属性”的错误。

3

我需要用Python处理一个.gz文件。

我使用以下代码将文件名传递给Python脚本:

infile = sys.argv[1]

with gzip.open(infile, 'rb') as f:
    logfile = f.read()

这给了我:

with gzip.open(infile, 'rb') as f:
AttributeError: GzipFile instance has no attribute '__exit__'

如果我手动解压缩.gz文件,然后将其传递给我的Python脚本,一切都正常工作。
logfile = open(infile, 'r').read()

注意:我使用的是Python 2.6.6(r266:84292,2016年8月18日,15:13:37)。我没有权限在这台计算机上更新Python。我该如何使用Python 2.6处理一个gzipped文本文件?


1
2.6.6是2010年发布的版本。它真的,真的非常古老,所以它落后于当前版本也就不足为奇了。 - Charles Duffy
2个回答

5
gzip模块的上下文管理器支持是问题3860

它在Python 3.1 alpha 1(3.x系列)和2.7 alpha 1(2.x系列)中得到修复。在您使用的2.6.6版本中仍存在此问题。


当然,你可以通过不使用上下文管理器语法来解决这个问题:

import sys, gzip

logfile = gzip.open(sys.argv[1], 'rb').read()

除非您更新Python(或者如果安装了多个解释器,则使用更高版本的解释器),否则无法使用“with”语法。当然,您仍然可以使用gzip文件;您只需要显式关闭处理程序即可。 - Charles Duffy
4
@Alan,虽然如此,任何拥有2010年软件堆栈的VPS都将充满安全风险。我会非常、非常谨慎地使用它。 - Charles Duffy

2

这篇回答强调了使用contextlib来调用close方法。

with contextlib.closing(gzip.open(inputFileName,'rb')) as openedFile:
    # processing code 
    # for line in openedFile:
    # ...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接