【问题标题】:python: read lines from compressed text filespython:从压缩文本文件中读取行
【发布时间】:2012-05-20 22:44:14
【问题描述】:

在不完全提取文件的情况下,使用 python 从 gz 压缩的文本文件中读取一行是否容易?我有一个大约 200mb 的 text.gz 文件。当我提取它时,它变成了 7.4gb。这不是我必须阅读的唯一文件。对于整个过程,我必须阅读 10 个文件。虽然这将是一个连续的工作,但我认为在不提取全部信息的情况下这样做是一件明智的事情。我什至不知道这是可能的。如何使用python完成?我需要逐行读取文本文件。

【问题讨论】:

    标签: python large-files compression


    【解决方案1】:

    使用gzip.GzipFile

    import gzip
    
    with gzip.open('input.gz','rt') as f:
        for line in f:
            print('got line', line)
    

    注意:gzip.open(filename, mode)gzip.GzipFile(filename, mode) 的别名。 我更喜欢前者,因为它看起来类似于用于打开未压缩文件的with open(...) as f:

    【讨论】:

    • 对于python3,您必须指定要在'rt'中打开的文件,因为'r'默认为二进制读取。
    • 要读取整个文件,只需使用f.read()
    • 当你有一个几千兆字节的文件时,f.read()(将整个文件读入内存)正是你想要避免的。
    【解决方案2】:

    您可以在 python 中使用标准的 gzip 模块。只需使用:

    gzip.open('myfile.gz')
    

    像打开其他文件一样打开文件并读取其行。

    更多信息在这里:Python gzip module

    【讨论】:

    • 出于好奇,这会将整个文件加载到内存中吗?或者它是否足够聪明,可以根据需要加载行?
    • @Sachin_ruk 这不会加载它只是打开它的文件。为了真正从文件中加载数据,你需要执行 f.readline() 来一次读取一行。或f.readlines(N),其中N 是您要读取的行数。
    【解决方案3】:

    您是否尝试过使用gzip.GzipFile?参数类似于open

    【讨论】:

      【解决方案4】:

      gzip 库(显然)使用gzip,这可能有点慢。您可以通过对pigzgzip 的并行化版本)的系统调用来加快速度。缺点是您必须安装pigz,并且在运行期间它会占用更多内核,但它更快并且不会占用更多内存。然后对文件的调用变为os.popen('pigz -dc ' + filename) 而不是gzip.open(filename,'rt')。 pigz 标志是-d 用于解压缩,-c 用于标准输出输出,然后可以被os.popen 抓取。

      以下代码接收一个文件和一个数字(1 或 2),并计算文件中不同调用的行数,同时测量代码所用的时间。在unzip-file.py中定义如下代码:

      #!/usr/bin/python
      import os
      import sys
      import time
      import gzip
      
      def local_unzip(obj):
          t0 = time.time()
          count = 0
          with obj as f:
              for line in f:
                  count += 1
          print(time.time() - t0, count)
      
      r = sys.argv[1]
      if sys.argv[2] == "1":
          local_unzip(gzip.open(r,'rt'))
      else:
          local_unzip(os.popen('pigz -dc ' + r))
      

      使用/usr/bin/time -f %M 调用这些函数,它会测量我们得到的 28G 文件上进程的最大内存使用量:

      $ /usr/bin/time -f %M ./unzip-file.py $file 1
      (3037.2604110240936, 1223422024)
      5116
      
      $ /usr/bin/time -f %M ./unzip-file.py $file 2
      (598.771901845932, 1223422024)
      4996
      

      显示使用基本相同的最大内存,系统调用大约快五倍(10 分钟对比 50 分钟)。还值得注意的是,根据您在文件中每行读取的操作可能不是限制因素,在这种情况下您选择的选项并不重要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-15
        • 2012-07-14
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-16
        • 1970-01-01
        相关资源
        最近更新 更多