Python 零基础教程

Python 文件的打开与关闭

在 Python 中,打开和关闭文件是处理数据的基础。这是你的程序与计算机文件系统存储的数据进行交互的方式。

理解不同的打开模式(如读取、写入和追加)对于控制你访问或修改文件内容的方式至关重要。同时,在操作完成后正确关闭文件也同样重要,这能防止数据损坏并确保系统资源得到释放。

1. 文件打开模式

当你使用 Python 打开文件时,需要指定一个模式(Mode)。模式会告诉 Python 你打算对该文件做什么。以下是最常用模式的详细说明:

  • 读取模式 ('r'):用于从文件中读取数据。如果文件不存在,Python 会抛出 FileNotFoundError 错误。在该模式下,你不能向文件写入任何内容。
    • 场景举例:你有一个名为 my_document.txt 的文档,你想读取其中的文字并显示在屏幕上。
  • 写入模式 ('w'):用于向文件写入数据。如果文件已存在,其原有内容将被彻底覆盖;如果文件不存在,Python 会创建一个新文件。
    • 场景举例:你想创建一个名为 report.txt 的新报告并写入数据。如果该文件原本就有内容,旧内容会被清空。
  • 追加模式 ('a'):用于在现有文件的末尾添加数据。如果文件不存在,会创建一个新文件。文件原有的内容会被保留。
    • 场景举例:你有一个 application.log 日志文件,你想在末尾添加新的日志记录而不删除旧记录。
  • 独占创建模式 ('x'):用于创建一个新文件,但仅当文件不存在时才有效。如果文件已经存在,Python 会抛出 FileExistsError 错误。
    • 场景举例:你想创建配置文件 settings.ini,但不希望意外覆盖掉已经存在的配置。
  • 二进制模式 ('b'):用于处理非文本文件,如图片或音频。它可以与其他模式组合使用(例如 'rb' 表示读取二进制文件,'wb' 表示写入二进制文件)。
  • 文本模式 ('t'):用于处理文本文件。如果你不指定模式,这是默认选项。它可以组合使用(如 'rt''wt')。
  • 更新模式 ('+'):允许你同时读取和写入文件。必须结合其他模式使用(例如 'r+' 表示读写现有文件,'w+' 表示创建新文件用于读写)。

2. 使用 open() 函数打开文件

在 Python 中,我们使用 open() 函数来打开文件。它主要接收两个参数:

  1. 文件路径(字符串类型)。
  2. 打开模式(字符串类型)。
# 示例:以读取模式打开文件
file = open("my_document.txt", "r")

# 示例:以写入模式打开文件
file = open("report.txt", "w")

# 示例:以追加模式打开文件
file = open("application.log", "a")

# 示例:以二进制读取模式打开图片
file = open("image.jpg", "rb")

2.1 处理 FileNotFoundError 异常

当以读取模式 ('r') 或更新模式 ('r+') 打开文件时,处理文件不存在的情况非常重要。

try:
    file = open("不存在的文件.txt", "r")
    # 对文件进行操作
except FileNotFoundError:
    print("错误:未找到文件 '不存在的文件.txt'。")

3. 关闭文件

当你完成文件操作后,必须关闭它。关闭文件可以释放被占用的系统资源(如内存和文件句柄),并确保所有写入的数据都已安全保存到磁盘。

3.1 close() 方法

你可以手动调用 close() 方法来关闭文件。

file = open("my_document.txt", "r")
# 对文件进行操作
file.close()

3.2 with 语句(推荐做法)

with 语句提供了一种更优雅、更安全的方式来处理文件。它会在代码块执行完毕后自动关闭文件,即使过程中发生了错误也不例外。

with open("my_document.txt", "r") as file:
    # 在这个缩进块内对文件进行操作
    content = file.read()
    
# 文件在这里会被自动关闭,无需手动调用 close()
print(content)
注意:使用 with 语句是 Python 文件处理的最佳实践,因为它能百分之百保证资源被正确释放。

3.3 为什么关闭文件很重要?

  1. 资源管理:操作系统对同时打开的文件数量有限制。如果不关闭文件,可能会耗尽资源导致程序崩溃。
  2. 数据完整性:写入数据时,内容通常先缓存在内存中。关闭文件能强制将缓存刷入磁盘,防止数据丢失。
  3. 文件访问锁定:有些系统在文件打开时会禁止其他程序访问。关闭文件后,其他程序才能正常使用它。

4. 实践示例

4.1 示例 1:读取文件

try:
    with open("my_document.txt", "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print("错误:找不到文件 'my_document.txt'。")

如果 my_document.txt 内容为 "这是一个示例文档。",输出将是:这是一个示例文档。

4.2 示例 2:写入文件

with open("report.txt", "w") as file:
    file.write("这是一份示例报告。\n")
    file.write("它包含重要信息。\n")

这将创建(或覆盖)report.txt,内容如下:

这是一份示例报告。
它包含重要信息。

4.3 示例 3:追加内容

with open("application.log", "a") as file:
    file.write("日志条目:发生了一个事件。\n")

这会在文件末尾添加新行,而不会改动原有内容。

4.4 示例 4:独占创建

try:
    with open("new_file.txt", "x") as file:
        file.write("这是一个新文件。\n")
except FileExistsError:
    print("错误:文件 'new_file.txt' 已经存在。")