【问题标题】:GzipFile instance has no attribute '__exit__' when used in a "with:" blockGzipFile 实例在“with:”块中使用时没有属性“__exit__”
【发布时间】:2018-02-11 21:32:13
【问题描述】:

我需要用 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__'

如果我手动 gunzip 我的 gz 文件,然后将其传递给我的 python 脚本,一切正常。

  logfile = open(infile, 'r').read()

【问题讨论】:

  • 问题是什么?您不能将withgzip 一起使用。
  • 看来,这个版本的gzip 不支持上下文管理器(没有__exit__)。这是哪个python/gzip 版本?
  • Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 我无法在此服务器上更新 python。对不起,如果我的问题不明显。如何使用我拥有的 python 处理压缩后的文本文件。
  • 2.6.6 是 2010 年发布的版本。它真的,真的古老,它远远落后于当前也就不足为奇了。

标签: python gzip


【解决方案1】:

This answers 突出显示使用contextlib 调用关闭方法。

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

【讨论】:

    【解决方案2】:

    gzip 模块的上下文管理器支持是 issue 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()
    

    【讨论】:

    • 那么,除非我在这个 VPS 上以某种方式更新 python,否则我无法处理 gz 文件?
    • 你不能使用with 语法,除非你更新了 Python(或者如果安装了多个解释器,则使用更新的解释器)。当然,您仍然可以使用 gzip 文件;你只需要明确地关闭你的句柄。
    • @Alan, ...也就是说,任何拥有 2010 年软件堆栈的 VPS 都将充满安全风险。我会非常非常非常谨慎使用它。
    • 好的,如果有人可以发布示例,我将不胜感激。我正在尝试使用 python 解析 gzip 压缩的日志文件。
    • 有一个例子。在我的回答中。您现在正在评论的内容。 logfile = gzip.open(infile, 'rb').read()
    猜你喜欢
    • 2020-08-07
    • 2015-08-30
    • 2015-12-29
    • 1970-01-01
    • 2015-01-19
    • 2019-05-17
    • 1970-01-01
    • 2016-06-29
    • 2012-10-07
    相关资源
    最近更新 更多