← 返回题目列表

Python 中 open 的常见文件打开模式有哪些?r、w、a、x、b、t、+ 分别是什么意思?

高频 简单 第 3 / 27 题 更新于 2026/07/27
open文件模式文件读写

简化版

open() 的模式决定文件是读、写、追加还是独占创建,也决定按文本还是二进制处理。常见模式有 r 读、w 覆盖写、a 追加写、x 独占创建,b 表示二进制,t 表示文本,+ 表示读写都允许。

详细版

Python 文件打开模式可以拆成几组来看:

模式字符含义常见风险
r只读,文件必须存在文件不存在会抛 FileNotFoundError
w只写,文件不存在则创建,存在则清空很容易误清空旧文件
a追加写,写入位置在文件末尾不适合修改文件中间内容
x独占创建,文件存在则失败适合避免覆盖已有文件
b二进制模式读写对象是 bytes
t文本模式,默认值读写对象是 str,涉及编码和换行转换
+更新模式,可读可写文件指针位置要特别小心

常见组合:

open("data.txt", "r", encoding="utf-8")     # 文本读取
open("data.txt", "w", encoding="utf-8")     # 覆盖写入
open("data.txt", "a", encoding="utf-8")     # 追加写入
open("data.bin", "rb")                      # 二进制读取
open("data.bin", "wb")                      # 二进制写入
open("data.txt", "x", encoding="utf-8")     # 文件不存在时才创建
open("data.txt", "r+", encoding="utf-8")    # 读写,不清空文件

面试回答时要重点强调两点:

  • w 会截断已有文件,这是最常见的线上事故来源之一;
  • 文本文件建议显式指定 encoding,不要依赖操作系统默认编码。

完整版教学

一、为什么文件打开模式要拆开理解

很多同学背文件模式时容易把 rbw+a+ 当成一堆独立字符串记忆,其实它们是组合出来的。

open() 的模式大致由三类信息组成:

  1. 文件访问意图:读、写、追加、创建;
  2. 数据形态:文本还是二进制;
  3. 是否允许更新:只读/只写,还是既读又写。

所以 rb 不是一个神秘模式,它就是 r + b,表示“以二进制方式读取”。w+b 就是 w + b + +,表示“以二进制方式读写,并且打开时清空文件”。

二、r、w、a、x 的区别

r 是读取模式。文件必须已经存在,否则会抛异常。它适合读配置、读日志、读数据文件。

with open("config.txt", "r", encoding="utf-8") as f:
    content = f.read()

w 是覆盖写模式。文件不存在会创建,文件存在会先清空。它适合生成全新的输出文件,但不适合“往已有文件后面加内容”。

with open("result.txt", "w", encoding="utf-8") as f:
    f.write("new result")

a 是追加模式。写入内容会追加到文件末尾,适合日志场景。

with open("app.log", "a", encoding="utf-8") as f:
    f.write("started\n")

x 是独占创建模式。文件不存在时创建,文件已存在时抛 FileExistsError。它适合“不能覆盖旧文件”的场景。

with open("report.txt", "x", encoding="utf-8") as f:
    f.write("first version")

三、文本模式和二进制模式的区别

文本模式默认是 t,可以省略。文本模式读写的是 str,Python 会根据编码把磁盘上的字节转换成字符串。

with open("note.txt", "r", encoding="utf-8") as f:
    text = f.read()

二进制模式使用 b,读写的是 bytes,不会做字符编码转换。

with open("image.png", "rb") as f:
    data = f.read()

什么时候必须用二进制?图片、压缩包、音视频、模型文件、任意非文本协议数据,都应该用 rb / wb。否则文本模式可能尝试解码字节,轻则报错,重则内容被换行转换破坏。

四、加号模式为什么容易踩坑

+ 表示既可以读也可以写,比如 r+w+a+

+ 不改变主模式的语义:

  • r+:文件必须存在,不清空;
  • w+:会清空文件,然后可读可写;
  • a+:写入通常追加到末尾。

一个常见坑是 w+

with open("data.txt", "w+", encoding="utf-8") as f:
    f.write("hello")
    f.seek(0)
    print(f.read())

如果忘记 seek(0),写完后文件指针在末尾,直接读会读到空字符串。读写混合时必须关注文件指针位置。

五、面试中怎么回答更像有经验

不要只背模式表,可以补一句工程习惯:

  • 读文本显式写 encoding="utf-8"
  • 写新文件小心 w 的截断行为;
  • 不能覆盖旧文件时用 x
  • 处理图片、压缩包等非文本文件用二进制模式;
  • 读写混用时关注 seek() 和当前位置。

这会让回答从“会背 API”变成“知道生产风险”。

六、常见误区与追问

易错点:文件模式要拆成两层看:基础行为决定读写和是否截断,b/t/+ 决定二进制/文本和是否读写混合。

  • 误区:w 只是打开文件准备写。 w 会先截断已有文件,这是高危点;如果不想覆盖已有文件,应考虑 x 或先检查路径。
  • 追问:a 模式为什么适合追加日志? a 会把写入放到文件末尾,通常不覆盖旧内容;但多进程日志仍要考虑写入原子性、缓冲和日志框架。
  • 误区:文本模式和二进制模式只是返回类型不同。 文本模式会做编码解码和换行转换,二进制模式直接处理 bytes;图片、压缩包、协议数据应使用二进制模式。
  • 追问:r+w+a+ 有什么共同坑? 它们都支持读写,但文件位置和截断/追加语义不同;读写切换时常要 seekflush,否则容易读不到预期内容。
  • 误区:x 没什么用。 x 表示独占创建,目标已存在就失败,适合避免误覆盖配置、锁文件或一次性输出文件。
  • 追问:面试里如何快速区分 w+r+ w+ 会创建或截断文件后读写,r+ 要求文件已存在且不截断;是否截断是最关键区别。

七、加强记忆

把文件模式记成三层:第一层选意图,r 读、w 覆盖、a 追加、x 独占创建;第二层选形态,文本用默认 t,二进制用 b;第三层选是否读写都要,用 +。真正容易出事故的是 w 清空文件、文本模式编码不明确、读写混用忘记移动文件指针。