读取大文件时,为了避免占用过多内存,通常会采用分块读取的方式。以下是几种处理大文件的常见方法:
1. 使用迭代读取文件(逐行读取)
使用 for 循环逐行读取文件,这种方法高效且占用内存小。
# 逐行读取文件
with open("large_file.txt", mode="r", encoding="utf-8") as file:
for line in file:
# 处理每一行数据
print(line.strip()) # 去掉换行符
优点:一次只读取一行,适合处理超大文件。
应用场景:日志处理、逐行分析数据。
2. 分块读取文件
如果需要按块读取(而不是按行),可以使用 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)
优点:适合按大小分块处理数据,例如传输数据、按块处理数据流。
3. 使用迭代器(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)
优点:分批读取并处理,内存占用可控。
应用场景:数据批量处理。
4. 使用 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())
优点:高效的文件访问方式,支持随机访问;对于极大文件尤其有用。
注意:需要文件是二进制模式打开,但可以解码为文本。
5. 多线程或多进程并行读取
对于多核处理器,可以将文件分成多个片段并行读取。
示例:使用多线程处理文件
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,加快读取和处理速度。
注意:确保分块不会截断一行内容。
6. 流式处理(适合二进制文件)
对于图像、视频等二进制文件,可以按字节流读取。
# 按字节流读取文件
chunk_size = 1024 # 每次读取 1KB
with open("large_file.bin", mode="rb") as file: # 二进制模式
while chunk := file.read(chunk_size):
# 处理每个字节流块
print(chunk)
应用场景:处理非文本文件,如音频、视频、图片。
总结
根据需求选择合适的方式:
- 逐行读取:适合文本文件和日志文件处理。
- 分块读取:按大小控制内存占用,适合大数据文件。
- 内存映射(
mmap):高效随机访问,适合极大文件。 - 并行读取:提升性能,适合多核 CPU 和分片处理。

被折叠的 条评论
为什么被折叠?



