Python 2.6.6处理.gz文件遇GzipFile无__exit__属性问题求助
在Python 2.6中处理gzip压缩文件的解决方案
这个问题我太熟悉了——Python 2.6里的gzip.GzipFile确实没实现上下文管理器协议(也就是缺少__exit__方法),所以直接用with块会报这个错。因为上下文管理器是从Python 2.7开始才被gzip模块支持的,而你又没法升级版本,那咱们就用下面几种办法绕过去:
方法1:手动管理文件的打开与关闭
不用with语句,改用try-finally块确保文件一定会被关闭,避免资源泄漏:
import gzip # 打开gzip文件 gz_file = gzip.GzipFile("your_input.gz", "r") try: # 这里写你的文件处理逻辑,比如逐行读取 for line in gz_file: # 如果是文本文件,记得解码字节串(比如utf-8) text_line = line.decode("utf-8") print(text_line) finally: # 无论是否出错,都关闭文件 gz_file.close()
方法2:用contextlib.closing包装对象
contextlib模块里的closing工具可以帮我们把有close()方法的对象转换成支持上下文管理器的对象,这样就能继续用with块了:
import gzip from contextlib import closing with closing(gzip.GzipFile("your_input.gz", "r")) as gz_file: for line in gz_file: text_line = line.decode("utf-8") # 处理文本内容 process_text(text_line)
closing会在with块结束时自动调用gz_file.close(),和手动try-finally的效果一致,但代码更简洁。
方法3:自定义兼容上下文管理器的Gzip子类
如果你的项目经常需要处理gzip文件,可以写一个子类补全上下文管理器的方法,以后用起来和高版本Python的体验一致:
import gzip class ContextGzipFile(gzip.GzipFile): def __enter__(self): # 确保文件已经打开 if self.fileobj is None: self.open() return self def __exit__(self, exc_type, exc_val, exc_tb): # 退出时关闭文件 self.close() # 之后就可以像Python 2.7+那样用with了 with ContextGzipFile("your_input.gz", "r") as gz_file: for line in gz_file: text_line = line.decode("utf-8") handle_line(text_line)
额外注意
Python 2.6中GzipFile默认以二进制模式打开,所以读取到的是字节串,如果处理的是文本文件,记得根据实际编码(比如utf-8、gbk)调用decode()转换成字符串,避免后续处理出错。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

