python 五 文件操作 读取大文件

读取大文件时,为了避免占用过多内存,通常会采用分块读取的方式。以下是几种处理大文件的常见方法:


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 和分片处理。

你可能感兴趣的:(python,python,java,前端)