我刚开始使用生成器,已经阅读过一些相关资料,但需要一些帮助来以块的方式处理大型文本文件。我知道这个主题已经被讨论过,但示例代码的说明非常有限,如果不理解正在发生什么,则很难修改代码。
我的问题相当简单,我有一系列包含人类基因组测序数据的大型文本文件,格式如下:
chr22 1 0
chr22 2 0
chr22 3 1
chr22 4 1
chr22 5 1
chr22 6 2
这些文件的长度在1GB到20GB之间,太大了无法读入内存。因此,我想一次读取10000行的数据块/分段,以便可以对这些块大小中的最后一列执行计算。
根据这个链接,我编写了以下内容:
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' 行数据,但我对这里发生的事情感到非常困惑?
这个解决方案 这里 看起来可以帮助我,但我仍然不理解如何修改它以一次读取 N 行?
这个 这里 也看起来是一个很好的解决方案,但同样地,没有足够的背景说明让我能够理解并修改代码。
任何帮助都将不胜感激!
readlines(10000)
永远不会让你获得10,000行。 - SiHa