【发布时间】:2018-09-20 00:05:13
【问题描述】:
我是使用生成器的新手,并且已经阅读了一些内容,但需要一些帮助来处理大块文本文件。我知道已经涵盖了这个主题,但是示例代码的解释非常有限,如果人们不理解发生了什么,就很难修改代码。
我的问题很简单,我有一系列包含人类基因组测序数据的大型文本文件,格式如下:
chr22 1 0
chr22 2 0
chr22 3 1
chr22 4 1
chr22 5 1
chr22 6 2
文件长度在 1Gb 到 ~20Gb 之间,太大而无法读入 RAM。因此,我想一次读取 10000 行的块/箱中的行,以便我可以对这些箱大小的最后一列进行计算。
基于此链接here 我写了以下内容:
def read_large_file(file_object):
"""A generator function to read a large file lazily."""
bin_size=5000
start=0
end=start+bin_size
# Read a block from the file: data
while True:
data = file_object.readlines(end)
if not data:
break
start=start+bin_size
end=end+bin_size
yield data
def process_file(path):
try:
# Open a connection to the file
with open(path) as file_handler:
# Create a generator object for the file: gen_file
for block in read_large_file(file_handler):
print(block)
# process block
except (IOError, OSError):
print("Error opening / processing file")
return
if __name__ == '__main__':
path='C:/path_to/input.txt'
process_file(path)
在“process_block”中,我希望返回的“block”对象是一个 10000 个元素长的列表,但不是吗?第一个列表是 843 个元素。第二个是2394个元素?
我想取回一个块中的“N”行,但对这里发生的事情感到非常困惑?
这个解决方案here 似乎可以提供帮助,但我还是不明白如何修改它以一次读取 N 行?
这个here 看起来也是一个非常棒的解决方案,但同样,没有足够的背景解释让我理解到足以修改代码。
任何帮助将不胜感激?
【问题讨论】:
-
来自docs for readlines():“如果存在可选的 sizehint 参数,而不是读取到 EOF,整行总计大约 sizehint 字节” 所以
readlines(10000)永远不会会给你10,000行。
标签: python generator large-files chunks