【问题标题】:Incrementally Read Large Multipart Zipped Text File in Python在 Python 中增量读取大型多部分压缩文本文件
【发布时间】:2013-03-01 20:15:17
【问题描述】:

我有一个非常大的 zip 文件,它被拆分为多个部分作为拆分存档,存档中只有一个文件。我没有足够的资源将这些档案组合在一起或提取它们(原始文本文件将近 1TB)。

我想逐行解析文本文件,最好使用如下内容:

import zipfile
for zipfilename in filenames:
    with zipfile.ZipFile(zipfilename) as z:
        with z.open(...) as f:
            for line in f:
                print line

这可能吗?如果是这样,我该如何阅读文本文件:

  1. 不使用太多内存(将整个文件加载到内存中显然是不可能的)
  2. 无需解压任何 zip 文件
  3. (理想情况下)不合并 zip 文件

提前感谢您的帮助。

【问题讨论】:

  • 哇,这是一个非常大的文本文件,你的 zip 文件有多少部分?为什么这么大?
  • 这是可能的,但我很确定如果你在 Python 中这样做,你还需要一个低温时间室来等待,因为这需要很长时间才能完成。或者得到一个大型集群。
  • 可能会有超过 3500 个零件,而且是巨大的。它是一个研究数据集,包含 1000 万篇左右研究论文的全文内容。
  • @AdamBarthelson,我不需要大部分内容,所以我希望它不会非常低效。我认为可以跳过 99% 的行。
  • 您究竟需要什么信息?

标签: python parsing stream zip


【解决方案1】:

我来打一针。

如果您的 zip 文件是所谓的根据 Zip 文件格式的“拆分档案”,那么您将无法使用 Python 的 zipfile 库或unzip 终端命令来读取它们。

另一方面,如果您正在处理已使用 split 命令或类似的字节拆分设备拆分的单个 zip 存档,您可能能够在运行中提取并读取其内容蟒蛇。

您必须编写一个“类似文件”的自定义类,该类将接受 seek() 和 read() 方法(可能还有其他方法)并在拆分块上执行它们。

seek() 将需要计算要读取的 zip 文件,打开它(如果它不是仍然打开的当前文件)并使用偏移量的差异对其执行 seek()。

read() 将从当前打开的块中读取,处理文件结束条件,这将导致它打开下一个块并完成对它的读取。

编写和测试这个类后,只需调用 ZipFile 构造函数,将类的实例作为“虚拟 zip”文件对象打开即可。

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 2012-07-14
    • 2012-05-20
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多