gpt4 book ai didi

python - 使用 python 生成器处理大文本文件

转载 作者:太空宇宙 更新时间:2023-11-03 12:26:29 26 4
gpt4 key购买 nike

我刚开始使用生成器,已经阅读了一些内容,但需要一些帮助来处理成 block 的大型文本文件。我知道已经涵盖了这个主题,但是示例代码的解释非常有限,如果不理解正在发生的事情,就很难修改代码。

我的问题相当简单,我有一系列包含以下格式的人类基因组测序数据的大型文本文件:

chr22   1   0
chr22 2 0
chr22 3 1
chr22 4 1
chr22 5 1
chr22 6 2

文件长度在 1Gb 到 ~20Gb 之间,太大而无法读入 RAM。所以我想一次读取 10000 行的 block /容器中的行,以便我可以对这些容器大小的最后一列执行计算。

基于此链接 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个元素?

我想返回一个 block 中的“N”行,但对这里发生的事情感到很困惑?

此解决方案 here似乎它可以提供帮助,但我还是不明白如何修改它以一次读取 N 行?

here看起来也是一个非常好的解决方案,但同样,没有足够的背景解释让我理解到足以修改代码的程度。

真的很感激任何帮助吗?

最佳答案

与其使用文件中的偏移量,不如尝试从循环中构建并生成包含 10000 个元素的列表:

def read_large_file(file_handler, block_size=10000):
block = []
for line in file_handler:
block.append(line)
if len(block) == block_size:
yield block
block = []

# don't forget to yield the last block
if block:
yield block

with open(path) as file_handler:
for block in read_large_file(file_handler):
print(block)

关于python - 使用 python 生成器处理大文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49752452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com