ZetCode

Python readlines 函数

最后修改时间:2025 年 3 月 26 日

本综合指南探讨了 Python 的 readlines 函数,这是一种逐行读取文件的强大方法。我们将介绍基本用法、内存注意事项、上下文管理器、编码处理和最佳实践。通过实际示例,您将掌握 Python 中基于行的文件读取。

基本定义

readlines 函数从文件对象中读取所有行,并将它们作为字符串列表返回。每个字符串代表文件中的一行,包括末尾的换行符。当您需要单独处理文件的每一行时,此函数特别有用。

与将整个内容作为单个字符串返回的 read 不同,readlines 在行边界处拆分内容。该函数自动处理不同的平台特定的行尾 (Windows, Unix, Mac) 并将它们转换为 \n

基本的 readlines 用法

readlines 最简单的用法是将文件的所有行读取到列表中。列表中的每个元素对应于文件中的一行。

basic_readlines.py
# Open a file and read all lines
with open('example.txt', 'r') as file:
    lines = file.readlines()
    for line in lines:
        print(line.strip())  # Remove newline character

此示例以读取模式打开 'example.txt',使用 readlines 将所有行读取到列表中,然后处理每一行。 strip 方法删除每行中的空格和换行符。

with 语句确保正确的文件关闭。 结果列表中的每一行都以换行符结尾,这就是我们打印时使用 strip 的原因。 此行为与行在实际文件中显示的方式相匹配。

读取特定数量的行

readlines 函数可以接受大小提示参数来限制读取的数据量。 这有助于处理非常大的文件。

readlines_with_hint.py
# Read approximately 1000 bytes worth of lines
with open('large_file.txt', 'r') as file:
    lines = file.readlines(1000)
    print(f"Read {len(lines)} lines")
    for line in lines:
        print(line.strip())

此代码尝试从文件中读取大约 1000 字节的行。 返回的实际行数可能会有所不同,因为 Python 读取完整的行直到达到大小限制。 这对于分块处理大型文件很有用。

大小提示不保证读取的确切字节数 - 它读取完整的行,直到总大小接近提示。 这可以防止部分行读取。 该函数始终返回完整的行,永远不会在中间中断一行。

使用 readlines 处理行

readlines 返回的列表可以像任何 Python 列表一样进行处理。 此示例演示了过滤和转换行。

process_lines.py
# Process lines from a file
with open('data.txt', 'r') as file:
    lines = file.readlines()
    
    # Filter empty lines and comments
    cleaned_lines = [line.strip() for line in lines 
                    if line.strip() and not line.startswith('#')]
    
    # Convert valid lines to uppercase
    upper_lines = [line.upper() for line in cleaned_lines]
    
    print("Processed lines:")
    for line in upper_lines:
        print(line)

此代码读取所有行,然后过滤掉空行和注释(以 # 开头的行)。 剩余的行转换为大写。 列表推导提供了一种简洁的方式来处理行。

该示例展示了 readlines 如何与 Python 的列表处理功能集成。 您可以链接多个转换和过滤器,以直接从文件内容创建强大的数据处理管道。

比较 readlines 与迭代

虽然 readlines 一次将所有行读取到内存中,但直接迭代文件对象对于大型文件来说更节省内存。

readlines_vs_iteration.py
# Memory-efficient line reading
print("Using readlines (all lines in memory):")
with open('large_file.txt', 'r') as file:
    lines = file.readlines()
    for line in lines[:5]:  # Only show first 5 lines
        print(line.strip())

print("\nUsing iteration (memory efficient):")
with open('large_file.txt', 'r') as file:
    line_count = 0
    for line in file:  # Reads one line at a time
        print(line.strip())
        line_count += 1
        if line_count >= 5:
            break

第一种方法将所有行加载到内存中,这对于非常大的文件来说可能存在问题。 第二种方法一次读取一行,使用最少的内存。 文件对象本身在 Python 中是可迭代的。

对于小文件,这两种方法都很好。 对于大文件(几 GB),首选迭代。 当您需要在内存中存储所有行以进行随机访问或多次传递数据时,readlines 很方便。

处理不同的编码

当在文件打开期间指定时,readlines 函数可以使用不同的文件编码。 这对于国际文本文件至关重要。

readlines_encoding.py
# Reading a UTF-8 encoded file
try:
    with open('multilingual.txt', 'r', encoding='utf-8') as file:
        lines = file.readlines()
        for line in lines:
            print(line.strip())
except UnicodeDecodeError:
    print("Error: Could not decode the file with UTF-8 encoding")

# Reading a file with fallback encoding
with open('legacy.txt', 'r', encoding='latin-1', errors='replace') as file:
    lines = file.readlines()
    for line in lines:
        print(line.strip())

第一个示例尝试读取 UTF-8 文件,该文件支持大多数语言。 如果文件包含无效的 UTF-8 序列,则会引发异常。 第二个示例使用 Latin-1 编码,并使用错误替换来处理旧文件。

处理文本文件时,请始终考虑编码。 Python 3 默认为 UTF-8,但许多旧系统使用不同的编码。 errors 参数控制如何处理解码错误(忽略、替换等)。

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程