当读写大文件时,如果文件较大,会一次性全部读取到内存中,容易造成内存不足,所以呢需要对大文件进行批量读写。
1、生成大数据文件
参考博文:python测试写入文件时一次打开open和多次打开open的效率_IT之一小佬的博客-CSDN博客
2、读取大文件
常见方法有yield生成器和open()自带方法生成迭代器对象。
详见博文:使用python读取大文件_python 读取大文件_IT之一小佬的博客-CSDN博客
3、写入大文件
对文件的修改,通常有两种模式,一是直接在原文件中进行修改并直接保存,二是对修改之后的文件存储在一个新文件中进行存储。如果遇到大文件,那么就需要使用模式一了。
3.1 小文件内容写入大文件中
直接将小文件读取到内存中,然后追加写入大文件即可。
3.2 修改大文件中数据
3.2.1 每行数据使用write写入
示例代码:
import time
start_time = time.time()
with open('./data/big_data.txt', 'r', encoding='utf-8') as rf, \
open('./data/new_big_data.txt', 'a', encoding='utf-8') as af:
for line in rf:
if "英语" in line:
line = line.replace('英语', 'English')
print(line)
af.write(line)
print(f"程序耗时:{time.time() - start_time}")
运行结果:
3.2.2 每100行数据使用writelines写入
示例代码:
import time
start_time = time.time()
data_list = []
with open('./data/big_data.txt', 'r', encoding='utf-8') as rf, \
open('./data/new_big_data2.txt', 'a', encoding='utf-8') as af:
for line in rf:
if "英语" in line:
line = line.replace('英语', 'English')
print(line)
data_list.append(line)
if len(data_list) > 100:
af.writelines(data_list)
data_list = []
if len(data_list) > 0:
af.writelines(data_list)
print(f"程序耗时:{time.time() - start_time}")
运行结果:
3.2.3 每1000行数据使用writelines写入
示例代码:
import time
start_time = time.time()
data_list = []
with open('./data/big_data.txt', 'r', encoding='utf-8') as rf, \
open('./data/new_big_data3.txt', 'a', encoding='utf-8') as af:
for line in rf:
if "英语" in line:
line = line.replace('英语', 'English')
print(line)
data_list.append(line)
if len(data_list) > 1000:
af.writelines(data_list)
data_list = []
if len(data_list) > 0:
af.writelines(data_list)
print(f"程序耗时:{time.time() - start_time}")
运行结果:
综上所述:在上面三个示例代码中,可以看出使用writelines方法,选择适当的行数写入效率是最好的。
参考博文: