读取大文件时,为了避免占用过多内存,通常会采用分块读取的方式。以下是几种处理大文件的常见方法:
使用 for
循环逐行读取文件,这种方法高效且占用内存小。
# 逐行读取文件
with open("large_file.txt", mode="r", encoding="utf-8") as file:
for line in file:
# 处理每一行数据
print(line.strip()) # 去掉换行符
优点:一次只读取一行,适合处理超大文件。
应用场景:日志处理、逐行分析数据。
如果需要按块读取(而不是按行),可以使用 read(size)
方法。
# 按块读取文件
chunk_size = 1024 # 每次读取 1KB
with open("large_file.txt", mode="r", encoding="utf-8") as file:
while True:
chunk = file.read(chunk_size) # 读取指定大小的块
if not chunk:
break
# 处理每个块
print(chunk)
优点:适合按大小分块处理数据,例如传输数据、按块处理数据流。
readlines
分批读取)可以将文件拆分成小批次读取。
# 按行批量读取
def read_in_chunks(file_path, chunk_size=100):
with open(file_path, mode="r", encoding="utf-8") as file:
lines = []
for line in file:
lines.append(line.strip())
if len(lines) == chunk_size: # 批量大小
yield lines
lines = []
if lines: # 处理最后一批数据
yield lines
# 使用生成器读取文件
for chunk in read_in_chunks("large_file.txt", chunk_size=10):
print(chunk)
优点:分批读取并处理,内存占用可控。
应用场景:数据批量处理。
mmap
内存映射mmap
将文件映射到内存中,支持随机访问,适合处理特别大的文件。
import mmap
# 使用 mmap 读取文件
with open("large_file.txt", mode="r", encoding="utf-8") as file:
with mmap.mmap(file.fileno(), length=0, access=mmap.ACCESS_READ) as mmap_obj:
# mmap 对象支持直接操作
for line in iter(mmap_obj.readline, b""): # 按行读取
print(line.decode("utf-8").strip())
优点:高效的文件访问方式,支持随机访问;对于极大文件尤其有用。
注意:需要文件是二进制模式打开,但可以解码为文本。
对于多核处理器,可以将文件分成多个片段并行读取。
from threading import Thread
# 读取某段文件
def process_file_part(file_path, start, size):
with open(file_path, mode="r", encoding="utf-8") as file:
file.seek(start)
chunk = file.read(size)
print(chunk)
# 分段读取文件
file_path = "large_file.txt"
file_size = 10 * 1024 # 假设文件大小
chunk_size = 2 * 1024 # 每块 2KB
threads = []
for i in range(0, file_size, chunk_size):
thread = Thread(target=process_file_part, args=(file_path, i, chunk_size))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
优点:能充分利用多核 CPU,加快读取和处理速度。
注意:确保分块不会截断一行内容。
对于图像、视频等二进制文件,可以按字节流读取。
# 按字节流读取文件
chunk_size = 1024 # 每次读取 1KB
with open("large_file.bin", mode="rb") as file: # 二进制模式
while chunk := file.read(chunk_size):
# 处理每个字节流块
print(chunk)
应用场景:处理非文本文件,如音频、视频、图片。
根据需求选择合适的方式:
mmap
):高效随机访问,适合极大文件。