逐行读取 compressed/deflated (csv) 文件
Reading a compressed/deflated (csv) file line by line
我正在使用以下生成器以内存高效的方式逐行遍历给定的 csv 文件:
def csvreader(file):
with open(file, 'rb') as csvfile:
reader = csv.reader(csvfile, delimiter=',',quotechar='"')
for row in reader:
yield row`
这非常有效,我能够非常好地处理非常大的文件。几千兆字节的 CSV 文件对于 RAM 有限的小型虚拟机实例似乎完全没有问题。
但是,当文件变得太大时,磁盘 space 就会成为问题。 CSV 文件通常似乎具有非常高的压缩率,这使我能够以未压缩大小的一小部分存储文件,但在我可以使用上面的代码处理文件之前,我必须 decompress/inflate 文件和然后 运行 通过我的脚本。
我的问题:有没有办法构建一个高效的生成器来执行上述操作(给定一个文件,生成 CSV 行作为数组),但是通过膨胀文件的一部分来实现,直到到达换行符,然后 运行 通过 csv reader 将其 reader,而无需 deflate/decompress 整个文件?
非常感谢您的考虑!
尝试使用 gzip
只需将 with open(file, 'rb') as csvfile:
替换为 with gzip.open(file, 'rb') as csvfile:
并在脚本顶部添加 import gzip
。
见this SO question for more
如果您from gzip import open
,您根本不需要更改您的代码!
我正在使用以下生成器以内存高效的方式逐行遍历给定的 csv 文件:
def csvreader(file):
with open(file, 'rb') as csvfile:
reader = csv.reader(csvfile, delimiter=',',quotechar='"')
for row in reader:
yield row`
这非常有效,我能够非常好地处理非常大的文件。几千兆字节的 CSV 文件对于 RAM 有限的小型虚拟机实例似乎完全没有问题。
但是,当文件变得太大时,磁盘 space 就会成为问题。 CSV 文件通常似乎具有非常高的压缩率,这使我能够以未压缩大小的一小部分存储文件,但在我可以使用上面的代码处理文件之前,我必须 decompress/inflate 文件和然后 运行 通过我的脚本。
我的问题:有没有办法构建一个高效的生成器来执行上述操作(给定一个文件,生成 CSV 行作为数组),但是通过膨胀文件的一部分来实现,直到到达换行符,然后 运行 通过 csv reader 将其 reader,而无需 deflate/decompress 整个文件?
非常感谢您的考虑!
尝试使用 gzip
只需将 with open(file, 'rb') as csvfile:
替换为 with gzip.open(file, 'rb') as csvfile:
并在脚本顶部添加 import gzip
。
见this SO question for more
如果您from gzip import open
,您根本不需要更改您的代码!