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() 函数来打开文件。它主要接收两个参数:
- 文件路径(字符串类型)。
- 打开模式(字符串类型)。
# 示例:以读取模式打开文件
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 为什么关闭文件很重要?
- 资源管理:操作系统对同时打开的文件数量有限制。如果不关闭文件,可能会耗尽资源导致程序崩溃。
- 数据完整性:写入数据时,内容通常先缓存在内存中。关闭文件能强制将缓存刷入磁盘,防止数据丢失。
- 文件访问锁定:有些系统在文件打开时会禁止其他程序访问。关闭文件后,其他程序才能正常使用它。
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' 已经存在。")