文章目录

Python 文件操作:with open() 上下文管理器

发布于 2026-04-16 08:15:48 · 浏览 26 次 · 评论 0 条

Python 文件操作:with open() 上下文管理器

处理文件是编程中最常见的任务之一,但在 Python 中直接使用 open()close() 往往埋藏着隐患。如果程序在读取文件的过程中发生崩溃,或者因为逻辑错误提前退出,文件句柄可能无法正确关闭,导致数据丢失或文件被占用。

使用 with open() 上下文管理器是 Python 中处理文件的标准且安全的方式。它会自动管理资源的打开与释放,即使在代码块中抛出异常,也能保证文件被正确关闭。


基础语法与结构

with 语句不仅让代码更简洁,更重要的是它封装了“准备资源”和“清理资源”的逻辑。

输入 以下基本语法结构:

with open('文件路径', '模式', encoding='编码格式') as 变量名:
    # 执行文件操作代码
    pass

当 Python 执行这段代码时,流程如下:

graph TD A["Start: with open()"] --> B["Execute __enter__: open file"] B --> C["Run indented code block"] C --> D{Code block finished or crashed?} D -- Yes --> E["Execute __exit__: close file safely"] E --> F["End"] D -- Exception --> E

常用文件模式与参数

在使用 open() 时,选择 正确的模式至关重要。不同的模式决定了你可以对文件进行什么操作。

以下是常用的模式对照表:

模式字符 全称 操作描述 文件不存在时
r Read 只读(默认模式) 报错
w Write 写入(覆盖原内容) 创建新文件
a Append 追加(在文件末尾写入) 创建新文件
r+ Read/Write 读写(从文件开头开始) 报错
b Binary 二进制模式(与 r/w/a 组合使用,如 rb 依赖于 r/w/a

实操步骤:读取文本文件

读取文件是最基础的操作。使用 with 语句可以确保读取完毕后文件立即关闭。

  1. 创建 一个名为 example.txt 的文本文件,并输入 一段测试文字。

  2. 编写 Python 脚本,使用 r 模式打开文件:

    # 打开当前目录下的 example.txt
    with open('example.txt', 'r', encoding='utf-8') as f:
        content = f.read()
        print(content)
  3. 运行 脚本。观察 控制台输出,文件内容会被完整打印出来。

  4. 验证 文件状态。在代码块执行完毕后,尝试在操作系统中手动删除 该文件。如果操作成功,说明文件已被 Python 正确释放,没有被占用。

进阶读取技巧

如果文件很大,直接使用 read() 会占用大量内存。使用 逐行读取的方式:

with open('example.txt', 'r', encoding='utf-8') as f:
    for line in f:
        # strip() 去除行末的换行符
        print(line.strip())

实操步骤:写入与覆盖文件

当需要保存数据时,使用 w 模式。请注意,此模式会清空文件原有内容。

  1. 编写 以下代码,准备写入数据:

    data = "这是新写入的内容。\n这是第二行。"
    
    # 使用 w 模式,如果文件存在则覆盖,不存在则创建
    with open('output.txt', 'w', encoding='utf-8') as f:
        f.write(data)
  2. 执行 代码。

  3. 打开 生成的 output.txt 文件。确认 文件中仅包含上述变量 data 的内容。


实操步骤:追加内容到文件

在不覆盖原有内容的基础上增加新数据,必须使用 a 模式。

  1. 编写 代码向现有的 output.txt 追加日志:

    log_message = "\n[LOG] 操作执行成功。"
    
    # 使用 a 模式,文件指针移动到文件末尾
    with open('output.txt', 'a', encoding='utf-8') as f:
        f.write(log_message)
  2. 运行 脚本。

  3. 检查 output.txt确认 新的日志信息出现在原有文本的最后一行之后。


异常处理与容错

虽然 with 语句能保证文件关闭,但它不能自动处理“文件不存在”或“权限不足”等错误。为了增强程序的健壮性,需要结合 try...except 使用。

  1. 编写 具备容错能力的读取代码:

    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}")
  2. 运行 代码。观察 程序并没有直接崩溃报错,而是打印 了友好的错误提示信息。


处理二进制文件

对于图片、音频或视频等非文本文件,必须使用 二进制模式(b)。

  1. 准备 一张名为 image.png 的图片。

  2. 编写 复制图片的脚本:

    # 读取原图片(二进制模式 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)
  3. 执行 脚本。

  4. 对比 image.pngimage_copy.png,确认两者大小一致且均可正常查看。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文