ZetCode

Python read 函数

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

本综合指南探讨了 Python 的 read 函数,它是 Python 中读取文件内容的主要方法。我们将介绍基本读取、不同的读取模式、处理大型文件以及最佳实践。

基本定义

read 函数是 Python 中文件对象的一个方法。它读取文件的内容并将其作为字符串(文本模式)或字节(二进制模式)返回。该函数可以读取整个文件或指定数量的字节。

read 的主要特点

读取整个文件内容

read 最简单的用法是一次读取整个文件内容。这适用于内存使用不是问题的小文件。

read_entire_file.py
# Open a file and read its entire content
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)

此示例以读取模式 ('r') 打开 'example.txt',使用 read() 读取所有内容,然后将其打印出来。with 语句确保正确关闭文件。 内容在文本模式下作为字符串返回。

请注意,此方法会将整个文件加载到内存中。对于大型文件,如果文件超出可用内存,这可能会效率低下甚至不可能。 在这种情况下,请考虑以块或逐行读取。

读取指定数量的字符

read 函数可以接受一个 size 参数来限制一次读取的数据量。这对于处理大型文件或只需要部分内容时非常有用。

read_specific_amount.py
# Read file in 100-character chunks
with open('large_file.txt', 'r') as file:
    while True:
        chunk = file.read(100)
        if not chunk:  # Empty string means EOF
            break
        print(chunk, end='')

此代码以 100 个字符的块读取 'large_file.txt',直到文件末尾。 循环持续到 read 返回一个空字符串,表示 EOF。 这种方法对于大型文件来说是内存高效的。

size 参数指定要读取的最大字符数(文本模式)或字节数(二进制模式)。 如果在读取完整数量之前到达 EOF,则返回的实际数量可能更少。

读取二进制文件

当处理二进制文件(图像、可执行文件等)时,使用 'rb' 模式。 然后 read 函数返回字节对象而不是字符串。

read_binary_file.py
# Read first 1024 bytes of a binary file
with open('image.jpg', 'rb') as file:
    header = file.read(1024)
    print(f"Read {len(header)} bytes")
    print(f"First byte: {header[0]}")

此示例读取 JPEG 文件的前 1024 个字节。 该内容作为字节对象返回,可以像整数序列 (0-255) 一样访问。 二进制模式可防止数据的任何编码/解码。

二进制文件读取对于非文本文件至关重要,以防止数据损坏。 前面显示的相同分块技术也适用于二进制文件,只是使用字节而不是字符。

使用不同的编码读取

文本文件可以使用各种字符编码。 encoding 参数指定如何将文件的字节解码为文本。

read_with_encoding.py
# Read a file with specific encoding
try:
    with open('example.txt', 'r', encoding='utf-8') as file:
        content = file.read()
        print(content)
except UnicodeDecodeError as e:
    print(f"Encoding error: {e}")

此代码尝试将文件读取为 UTF-8 文本。 如果文件包含无效的 UTF-8 序列,它会捕获 UnicodeDecodeError。 UTF-8 是当今文本文件最常见的编码。

其他常见的编码包括 'ascii'、'latin-1' 和 'utf-16'。 当处理来自不同系统或语言的文件时,encoding 参数至关重要。 始终显式指定编码以确保可靠性。

使用 read 读取行

虽然存在用于面向行的读取的 readlinereadlines,但您也可以使用 read 和字符串分割来处理行。

read_lines.py
# Read and split lines manually
with open('data.txt', 'r') as file:
    content = file.read()
    lines = content.split('\n')
    for line in lines:
        if line:  # Skip empty lines
            print(f"Line: {line}")

此示例读取整个文件内容,然后使用 split('\n') 将其拆分为行。 空行将被跳过。 这种方法比内置的行读取方法更能控制行处理。

请注意,这会将整个文件加载到内存中,因此不适合非常大的文件。 对于大型文件,最好使用 readline 或迭代文件对象。

最佳实践

资料来源

作者

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

列出所有 Python 教程