Python Tutorials

Python高效逐行读取文件

Spread the love

高效逐行读取文件是任何 Python 程序员的关键技能。无论您是在处理日志、解析数据还是处理配置文件,了解不同的方法及其权衡都是至关重要的。本文探讨了三种常用方法,重点介绍了它们的优缺点,以帮助您选择最适合您特定需求的方法。

目录

使用readlines()

readlines()方法提供了一种直接的方法将文件的全部行读入一个列表中。列表中的每个元素代表一行,包括换行符。


def read_file_readlines(filepath):
    """使用readlines()逐行读取文件并返回一个包含各行的列表。"""
    try:
        with open(filepath, 'r') as file:
            lines = file.readlines()
            return lines
    except FileNotFoundError:
        return None

filepath = 'my_file.txt'  # 请替换为您文件的路径
lines = read_file_readlines(filepath)

if lines:
    for line in lines:
        print(line, end='') #end=''防止额外换行
else:
    print(f"未找到文件 '{filepath}'。")

优点:简单简洁。整个文件一次性读入内存,因此随后访问任何一行都非常快。

缺点:对于大型文件来说,内存消耗很大。换行符(`n`)包含在每一行的末尾。

遍历文件对象

对于大型文件,直接遍历文件对象提供了一种更节省内存的解决方案。此方法一次读取并处理一行,避免将整个文件加载到内存中。


def read_file_iter(filepath):
    """使用迭代逐行读取文件并返回一个包含各行的列表。"""
    try:
        lines = []
        with open(filepath, 'r') as file:
            for line in file:
                lines.append(line)
        return lines
    except FileNotFoundError:
        return None

filepath = 'my_file.txt'
lines = read_file_iter(filepath)

if lines:
    for line in lines:
        print(line, end='')
else:
    print(f"未找到文件 '{filepath}'。")

优点:内存效率高,适用于大型文件。可以在读取整个文件之前开始处理。

缺点:readlines()稍显冗长。换行符(`n`)包含在每一行的末尾。

使用read()splitlines()

file.read()方法将整个文件内容读入单个字符串中。然后,我们可以使用splitlines()方法将此字符串拆分为一个包含各行的列表。请注意,splitlines()默认情况下会删除换行符。


def read_file_read(filepath):
    """使用file.read()逐行读取文件并返回一个包含各行的列表。"""
    try:
        with open(filepath, 'r') as file:
            file_content = file.read()
            lines = file_content.splitlines()
            return lines
    except FileNotFoundError:
        return None

filepath = 'my_file.txt'
lines = read_file_read(filepath)

if lines:
    for line in lines:
        print(line)
else:
    print(f"未找到文件 '{filepath}'。")

优点:相对简单。

缺点:对于大型文件来说,效率低于迭代,因为它在拆分之前会将整个文件读入内存。换行符默认情况下会被splitlines()删除。

方法比较

最佳方法取决于您的特定需求和文件的大小。对于非常大的文件,通常建议使用迭代,因为它内存效率高。对于较小的文件,readlines()的简洁性可能更受青睐。避免对大型文件使用read().splitlines()以防止过度使用内存。

方法 内存效率 速度 换行符处理 简洁性
readlines() 包含
迭代 包含 中等
read().splitlines() 移除 中等

记住始终处理潜在的FileNotFoundError异常。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注