Python 文件操作:with open() 上下文管理器
处理文件是编程中最常见的任务之一,但在 Python 中直接使用 open() 和 close() 往往埋藏着隐患。如果程序在读取文件的过程中发生崩溃,或者因为逻辑错误提前退出,文件句柄可能无法正确关闭,导致数据丢失或文件被占用。
使用 with open() 上下文管理器是 Python 中处理文件的标准且安全的方式。它会自动管理资源的打开与释放,即使在代码块中抛出异常,也能保证文件被正确关闭。
基础语法与结构
with 语句不仅让代码更简洁,更重要的是它封装了“准备资源”和“清理资源”的逻辑。
输入 以下基本语法结构:
with open('文件路径', '模式', encoding='编码格式') as 变量名:
# 执行文件操作代码
pass
当 Python 执行这段代码时,流程如下:
常用文件模式与参数
在使用 open() 时,选择 正确的模式至关重要。不同的模式决定了你可以对文件进行什么操作。
以下是常用的模式对照表:
| 模式字符 | 全称 | 操作描述 | 文件不存在时 |
|---|---|---|---|
r |
Read | 只读(默认模式) | 报错 |
w |
Write | 写入(覆盖原内容) | 创建新文件 |
a |
Append | 追加(在文件末尾写入) | 创建新文件 |
r+ |
Read/Write | 读写(从文件开头开始) | 报错 |
b |
Binary | 二进制模式(与 r/w/a 组合使用,如 rb) |
依赖于 r/w/a |
实操步骤:读取文本文件
读取文件是最基础的操作。使用 with 语句可以确保读取完毕后文件立即关闭。
-
创建 一个名为
example.txt的文本文件,并输入 一段测试文字。 -
编写 Python 脚本,使用
r模式打开文件:# 打开当前目录下的 example.txt with open('example.txt', 'r', encoding='utf-8') as f: content = f.read() print(content) -
运行 脚本。观察 控制台输出,文件内容会被完整打印出来。
-
验证 文件状态。在代码块执行完毕后,尝试在操作系统中手动删除 该文件。如果操作成功,说明文件已被 Python 正确释放,没有被占用。
进阶读取技巧:
如果文件很大,直接使用 read() 会占用大量内存。使用 逐行读取的方式:
with open('example.txt', 'r', encoding='utf-8') as f:
for line in f:
# strip() 去除行末的换行符
print(line.strip())
实操步骤:写入与覆盖文件
当需要保存数据时,使用 w 模式。请注意,此模式会清空文件原有内容。
-
编写 以下代码,准备写入数据:
data = "这是新写入的内容。\n这是第二行。" # 使用 w 模式,如果文件存在则覆盖,不存在则创建 with open('output.txt', 'w', encoding='utf-8') as f: f.write(data) -
执行 代码。
-
打开 生成的
output.txt文件。确认 文件中仅包含上述变量data的内容。
实操步骤:追加内容到文件
在不覆盖原有内容的基础上增加新数据,必须使用 a 模式。
-
编写 代码向现有的
output.txt追加日志:log_message = "\n[LOG] 操作执行成功。" # 使用 a 模式,文件指针移动到文件末尾 with open('output.txt', 'a', encoding='utf-8') as f: f.write(log_message) -
运行 脚本。
-
检查
output.txt,确认 新的日志信息出现在原有文本的最后一行之后。
异常处理与容错
虽然 with 语句能保证文件关闭,但它不能自动处理“文件不存在”或“权限不足”等错误。为了增强程序的健壮性,需要结合 try...except 使用。
-
编写 具备容错能力的读取代码:
file_path = 'non_existent_file.txt' try: with open(file_path, 'r', encoding='utf-8') as f: print(f.read()) except FileNotFoundError: print(f"错误:找不到文件 {file_path},请检查路径。") except PermissionError: print(f"错误:没有权限读取文件 {file_path}。") except Exception as e: print(f"发生未知错误:{e}") -
运行 代码。观察 程序并没有直接崩溃报错,而是打印 了友好的错误提示信息。
处理二进制文件
对于图片、音频或视频等非文本文件,必须使用 二进制模式(b)。
-
准备 一张名为
image.png的图片。 -
编写 复制图片的脚本:
# 读取原图片(二进制模式 rb) with open('image.png', 'rb') as source_file: image_data = source_file.read() # 写入新图片(二进制模式 wb) with open('image_copy.png', 'wb') as target_file: target_file.write(image_data) -
执行 脚本。
-
对比
image.png和image_copy.png,确认两者大小一致且均可正常查看。

暂无评论,快来抢沙发吧!