ZetCode

Python open 函数

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

这份全面的指南将探讨 Python 的 open 函数,它是 Python 中处理文件的主要方法。我们将涵盖文件模式、读取和写入操作、上下文管理器、编码处理和最佳实践。通过实际的例子,你将掌握 Python 中的文件操作。

基本定义

open 函数创建一个文件对象,该对象允许从文件读取或写入文件。它需要一个文件路径并返回一个文件对象。基本语法是 open(file, mode='r', buffering=-1, encoding=None)

文件模式指定文件应该如何打开:'r' 用于读取,'w' 用于写入,'a' 用于追加,'x' 用于独占创建。添加 'b' 以二进制模式打开文件,而 '+' 允许读取和写入。

当尝试以读取模式读取一个不存在的文件时,该函数会引发 FileNotFoundError 异常。在写入模式下,如果文件不存在,它会创建该文件。使用后务必关闭文件以释放系统资源。

基本文件读取

这个例子演示了使用 open 函数读取文件内容的最简单方法。我们将打开一个文本文件并打印其内容。

basic_read.py
# Open a file in read mode
file = open('example.txt', 'r')

# Read the entire file content
content = file.read()

# Print the content
print(content)

# Close the file
file.close()

这段代码以读取模式 ('r') 打开 'example.txt',将其全部内容读取到字符串变量中,打印它,然后关闭文件。没有参数的 read 方法会读取到文件末尾。记住始终关闭文件以防止资源泄漏。

写入文件

这个例子展示了如何创建一个新文件并使用写入模式 ('w') 下的 open 函数向其中写入数据。

file_write.py
# Open a file in write mode
with open('output.txt', 'w') as file:
    file.write('First line of text\n')
    file.write('Second line of text\n')
    file.write('Third line with number: %d\n' % 42)

该代码创建 'output.txt'(如果存在则覆盖),并写入三行文本。我们使用 with 语句,该语句会自动关闭文件。 write 方法完全按照给定的方式写入字符串,因此我们包含 \n 作为换行符。

逐行读取

对于大型文件或处理文本数据时,逐行读取比一次读取整个文件更有效率。

read_lines.py
# Open file and process line by line
with open('data.txt', 'r') as file:
    line_number = 1
    for line in file:
        print(f"Line {line_number}: {line.strip()}")
        line_number += 1

这个例子打开 'data.txt' 并单独处理每一行。文件对象是可迭代的,每次迭代产生一行。 strip 删除前导/尾随空格和换行符。这种方法是内存高效的,因为它不会一次加载整个文件。

追加到文件

追加模式 ('a') 允许将内容添加到现有文件的末尾,而不会覆盖其当前内容。

file_append.py
import datetime

# Append timestamp and message to log file
with open('app.log', 'a') as log_file:
    timestamp = datetime.datetime.now().isoformat()
    log_file.write(f"[{timestamp}] Application started\n")
    log_file.write(f"[{timestamp}] Loading configuration\n")

这段代码将带有时间戳的消息追加到 'app.log'。如果该文件不存在,将会被创建。每次运行程序都会添加新行,而不会影响之前的内容。这非常适合于日志记录场景,你希望保持事件的历史记录。

二进制文件操作

当处理非文本文件(如图像、可执行文件或任何需要字节级准确性的文件)时,二进制模式 ('b') 至关重要。

binary_operations.py
# Copy a binary file (e.g., an image)
with open('source.jpg', 'rb') as source:
    with open('copy.jpg', 'wb') as destination:
        chunk_size = 4096  # 4KB chunks
        while True:
            chunk = source.read(chunk_size)
            if not chunk:
                break
            destination.write(chunk)

这个例子通过以二进制模式 ('rb') 读取和以二进制模式 ('wb') 写入来复制一个 JPEG 文件。我们以块读取和写入,以高效地处理大型文件。二进制模式可以防止任何可能损坏二进制数据的编码/解码或换行符转换。

最佳实践

资料来源

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已经撰写了 1400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 Python 教程