使用 with...open... 可以从一个文件中读取数据,这是所有 Python 开发者都非常熟悉的操作。
但是如果你使用不当,也会带来很大的麻烦。
比如当你使用了 read 函数,其实 Python 会将文件的内容一次性的全部载入内存中,如果文件有 10 个G甚至更多,那么你的电脑就要消耗的内存非常巨大。
# 一次性读取
with open("big_file.txt", "r") as fp:
content = fp.read()
对于这个问题,你也许会想到使用 readline 去做一个生成器来逐行返回。
def read_from_file(filename):
with open(filename, "r") as fp:
yield fp.readline()
可如果这个文件内容就一行呢,一行就 10个G,其实你还是会一次性读取全部内容。
最优雅的解决方法是,在使用 read 方法时,指定每次只读取固定大小的内容,比如下面的代码中,每次只读取 8kb 返回。
def read_from_file(filename, block_size = 1024 * 8):
with open(filename, "r") as fp:
while True:
chunk = fp.read(block_size)
if not chunk:
break
yield chunk
上面的代码,功能上已经没有问题了,但是代码看起来代码还是有些臃肿。
借助偏函数 和 iter 函数可以优化一下代码
from functools import partial
def read_from_file(filename, block_size = 1024 * 8):
with open(filename, "r") as fp:
for chunk in iter(partial(fp.read, block_size), ""):
yield chunk
本文探讨了在Python中处理大型文件的技巧,避免一次性加载整个文件到内存中导致的问题。介绍了如何通过生成器逐块读取文件,以及如何利用偏函数和iter函数优化代码,实现高效且优雅的大文件处理。
2518

被折叠的 条评论
为什么被折叠?



