Python之大文件读取

大文件一次性全部读入内存,导致代码运行缓慢,可以尝试按行或者分片读取,使用文件的可迭代方式将文件的内容按行或者按块读入内存,再逐行或者逐块写入新文件,最后用新文件覆盖源文件。

按行读取

主要针对类似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")