我有一个非常大的文件,4 GB,当我试图读取它时,我的计算机挂起了. 所以我想要一块一块地读,在处理完每一块之后,将处理后的块存储到另一个文件中,然后读取下一块.

有什么方法可以把这些东西做成yield件吗?

我想要lazy method美元.

推荐答案

要编写惰性函数,只需使用yield:

def read_in_chunks(file_object, chunk_size=1024):
    """Lazy function (generator) to read a file piece by piece.
    Default chunk size: 1k."""
    while True:
        data = file_object.read(chunk_size)
        if not data:
            break
        yield data


with open('really_big_file.dat') as f:
    for piece in read_in_chunks(f):
        process_data(piece)

另一种 Select 是使用iter和帮助器函数:

f = open('really_big_file.dat')
def read1k():
    return f.read(1024)

for piece in iter(read1k, ''):
    process_data(piece)

如果文件是基于行的,则文件对象已经是行的懒惰生成器:

for line in open('really_big_file.dat'):
    process_data(line)

Python相关问答推荐

LAB中的增强数组

多处理代码在while循环中不工作

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

Pandas:将多级列名改为一级

在Python中,从给定范围内的数组中提取索引组列表的更有效方法

如何合并两个列表,并获得每个索引值最高的列表名称?

可以bcrypts AES—256 GCM加密损坏ZIP文件吗?

Pandas:计算中间时间条目的总时间增量

Python—转换日期:价目表到新行

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "

Gekko中基于时间的间隔约束

计算机找不到已安装的库'

在Django中重命名我的表后,旧表中的项目不会被移动或删除

高效生成累积式三角矩阵

如何根据一定条件生成段id

删除Dataframe中的第一个空白行并重新索引列

我怎么才能用拉夫分拣呢?

分解polars DataFrame列而不重复其他列值

有了Gekko,可以创建子模型或将模型合并在一起吗?

如何让PYTHON上的Selify连接到现有的Firefox实例-我无法连接到Marionette端口