【问题标题】:Fast reading of gzip (text file) using io.BufferedReader in Python 3在 Python 3 中使用 io.BufferedReader 快速读取 gzip(文本文件)
【发布时间】:2019-02-10 18:59:50
【问题描述】:

我正在尝试使用 gzip 模块有效地读取和解析压缩文本文件。这个link 建议用io.BufferedReader 包装gzip 文件对象,如下所示:

import gzip, io
gz = gzip.open(in_path, 'rb')
f = io.BufferedReader(gz)
     for line in f.readlines():
         # do stuff
gz.close()

要在 Python 3 中执行此操作,我认为必须使用 mode='rb' 调用 gzip。所以结果是line 是一个二进制字符串。但是,我需要 line 成为文本/ascii 字符串。有没有更有效的方法可以使用BufferedReader 将文件作为文本字符串读取,还是我必须在 for 循环中解码line

【问题讨论】:

  • 旁注:不要这样做for line in f.readlines():。这不必要地立即将文件放入list 行中,迭代list,然后将其丢弃。这意味着您无缘无故地需要与文件(未压缩)大小成比例的内存。只需执行for line in f:,然后根据需要懒惰地获取线路。

标签: python python-3.x gzip bufferedreader


【解决方案1】:

您可以使用io.TextIOWrapper 将二进制流无缝包装到文本流中:

f = io.TextIOWrapper(gz)

或者正如@ShadowRanger 指出的那样,您可以简单地以文本模式打开gzip 文件,以便gzip 模块将为您应用io.TextIOWrapper 包装器:

for line in gzip.open(in_path, 'rt'):
    # do stuff

【讨论】:

  • 除非你甚至不需要明确地这样做,因为你可以只传递一个'rt' 的模式(并且可以选择传递一个指定的encoding),这将有gzip.open 做所有为您完成包装工作。
  • 确实我忘记了。然后相应地更新。谢谢。
猜你喜欢
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多