【问题标题】:Reading a compressed/deflated (csv) file line by line [duplicate]逐行读取压缩/放气(csv)文件[重复]
【发布时间】:2015-07-01 07:22:26
【问题描述】:

我正在使用以下生成器以内存高效的方式逐行迭代给定的 csv 文件:

def csvreader(file):
    with open(file, 'rb') as csvfile:
        reader = csv.reader(csvfile, delimiter=',',quotechar='"')
        for row in reader:
            yield row`

这非常有效,我能够非常好地处理非常大的文件。对于 RAM 有限的小型虚拟机实例来说,几 GB 的 CSV 文件似乎完全没有问题。

但是,当文件变得太大时,磁盘空间就会成为问题。 CSV 文件通常似乎具有非常高的压缩率,这允许我以未压缩大小的一小部分存储文件,但在我可以使用上述代码处理文件之前,我必须解压缩/膨胀文件然后运行通过我的脚本。

我的问题:有什么方法可以构建一个高效的生成器来执行上述操作(给定一个文件,将 CSV 行作为数组生成),但是通过膨胀文件的某些部分来实现,直到到达换行符,并且然后通过 csv 阅读器运行它,而不必将文件作为一个整体放气/解压缩?

非常感谢您的考虑!

【问题讨论】:

  • 理想情况下,我也希望有一个相反的解决方案。给定一个数组,以与 CSV 兼容的方式对其进行编码,放气,然后将其附加到现有文件中。虽然我意识到这可能更难做到,但也许有一些方法可以读取压缩文件的标题并使用该压缩方案来压缩给定的字符串?
  • 最好的机会是以GzipFile (docs.python.org/2/library/gzip.html) 的形式打开文件并测试内存消耗。请注意,压缩对文件 I/O 的影响很大。

标签: python python-2.7 gzip


【解决方案1】:

尝试使用gzip

只需将with open(file, 'rb') as csvfile: 替换为with gzip.open(file, 'rb') as csvfile: 并在脚本顶部添加import gzip

this SO question for more

【讨论】:

  • 干杯!我试试这个!
【解决方案2】:

如果您from gzip import open,则根本不需要更改代码!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多