大文件一次性全部读入内存,导致代码运行缓慢,可以尝试按行或者分片读取,使用文件的可迭代方式将文件的内容按行或者按块读入内存,再逐行或者逐块写入新文件,最后用新文件覆盖源文件。
按行读取
主要针对类似txt、csv等有换行的文件
# 方法一:
import os
with open("123.csv") as rf,open(".123.csv","w") as wf:
# 对可迭代对象f逐行操作,防止内存溢出
for line in rf:
# 逐行读取
line=line.replace('str1','str2')
# 对读入的数据进行操作
linex=line.replace("1","A")# 将1替换成A
print(linex)
# 写入缓存文件
wf.write(linex)
# 替换原文件
os.remove("123.csv")
os.rename(".123.csv","123.csv")
# 方法二:
import os
with open("123.csv") as rf,open(".123.csv","w") as wf:
while True:
# 逐行读取
line=rf.readline()
# 对读入的数据进行操作
linex = line.replace("A", "1") # 将A替换成1
print(linex)
# 写入缓存文件
wf.write(linex)
# 到文件结尾则跳出循环
if not line:
break
# 替换原文件
os.remove("123.csv")
os.rename(".123.csv","123.csv")
逐块读取
主要针对类似pcap、bin等不换行的二进制文件等,当然也可以读取csv、txt等文本文件
import os
with open("123.iso","rb") as rf,open(".123.iso","wb") as wf:
while True:
# 逐块读取
block=rf.read(1024)
# 对读入的数据进行操作
blockx = block.replace(b"\x00\x00", b"\xab\xcd") # 将00:00替换成ab:cd
print(blockx)
# 写入缓存文件
wf.write(blockx)
# 到文件结尾则跳出循环
if not block:
break
# 替换原文件
os.remove("123.iso")
os.rename(".123.iso","123.iso")