当使用python读取大文件时,我们需要注意避免一次读取文件内容导致内存溢出的问题,所以我们今天就来记录下如何更安全和高效的读取大文件的方法,此前我们学习过python读取文件的方法,可以查看这个笔记:https://sulao.cn/post/182。
1.逐行读取大文件
这个也是之前学到过的,使用readline()方法进行逐行读取,适用于大文本,每行读取完成以后数据就会从内存中释放,避免内存溢出。我们需要注意的时,如果是二进制文件,使用readline()读取就不太实用,有可能一行数据就很大,有些可能整个二进制文件非常大且只有一行,所以这样就还是会导致内存溢出的问题。
介绍完了注意此方法的特点和注意事项,我们来看看具体代码实现
with open('test.log', 'r', encoding='utf-8') as f:
while True:
line = f.readline()
line = line.strip('\n')
if not line:
break
print(line)
主要是使用while循环来读取行,当读取到的行不存在时就会跳出循环。
2.按块大小读取大文件
上次也学习过read()读取方法,我们可以给这个函数设置一个参数来指定每次读取的内容大小,这种方式特别适用于二进制文件的读取。我们来看看具体代码实现,如果是二进制的话读取模式使用rb
chunk_size = 1024
with open('large_test.log', 'rb') as f:
while True:
chunk = f.read(chunk_size)
if not chunk:
break
print(chunk)
还可以直接使用yield关键字返回迭代对象,这样实现了读取的懒加载,这样能够更省内存,代码如下
def read_chunks(file_handle, chunk_size=1024):
while True:
chunk = file_handle.read(chunk_size)
if not chunk:
break
yield chunk
3.自动管理读取大文件
with open('large_test.log', 'r', encoding = 'utf-8') as f:
for line in f:
print(f)
直接迭代获取的文件对象,会自动使用IO缓存和内存管理。
内容版权声明:除非注明,否则皆为本站原创文章。
转载注明出处:https://sulao.cn/post/1121
评论列表