Python文件操作之open()函数的打开模式全解析
作者:星河耀银海
本文系统解析Python中open()函数的全部文件打开模式,涵盖基础模式(r/w/a/x)、组合模式(t/b及r+/w+/a+)以及encoding参数的关键作用,感兴趣的小伙伴可以了解下
一、开篇:程序与外部世界的桥梁
程序运行在内存中,一旦退出数据就消失了。要让数据"持久化",就需要文件。Python的open()函数是程序与文件系统的桥梁——它返回一个文件对象,通过这个对象你可以读写文件。
最基本的文件操作:
# 打开文件 → 读写内容 → 关闭文件
f = open("hello.txt", "w", encoding="utf-8") # 以写模式打开
f.write("Hello, World!\n") # 写入内容
f.write("你好,世界!\n")
f.close() # 关闭文件
# 读取刚才写入的文件
f = open("hello.txt", "r", encoding="utf-8") # 以读模式打开
content = f.read() # 读取全部内容
print(content)
f.close()
open()的第二个参数——打开模式(mode)——是文件操作的关键。选错模式可能导致数据丢失、文件损坏或权限错误。这篇文章就来彻底搞懂所有的打开模式。
二、基础模式:读、写、追加
2.1 r —— 读取模式(默认)
# r:只读模式,文件必须存在,从头开始读取
# ✅ 正确使用
with open("hello.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
# ❌ 文件不存在时
# with open("nonexistent.txt", "r") as f:
# pass # FileNotFoundError!
# r模式的特点:
# - 文件指针在开头
# - 不能写入(f.write()会报错)
# - 文件必须存在
2.2 w —— 写入模式
# w:写入模式,文件不存在则创建,存在则清空(危险!)
# 文件不存在——创建新文件
with open("new_file.txt", "w", encoding="utf-8") as f:
f.write("这是新创建的文件\n")
# ⚠️ 文件存在——内容被清空!
with open("new_file.txt", "w", encoding="utf-8") as f:
f.write("旧内容被覆盖了\n") # 原来的内容消失了!
# 验证
with open("new_file.txt", "r", encoding="utf-8") as f:
print(f.read()) # 旧内容被覆盖了
# w模式的特点:
# - 文件存在→清空(谨慎使用!)
# - 文件不存在→创建
# - 只能写入
2.3 a —— 追加模式
# a:追加模式,文件不存在则创建,存在则在末尾追加
# 打开文件,在末尾追加内容
with open("log.txt", "a", encoding="utf-8") as f:
f.write("第一条日志\n")
with open("log.txt", "a", encoding="utf-8") as f:
f.write("第二条日志\n")
with open("log.txt", "a", encoding="utf-8") as f:
f.write("第三条日志\n")
# 读取验证
with open("log.txt", "r", encoding="utf-8") as f:
print(f.read())
# 第一条日志
# 第二条日志
# 第三条日志
# a模式的特点:
# - 文件指针在末尾
# - 写入的内容追加到文件尾
# - 不能读取(f.read()报错)
# - 内容不会被清空——安全!
2.4 x —— 独占创建模式
# x:创建模式,文件不存在则创建,存在则报错
# 相当于"安全的w"——防止意外覆盖已有文件
# 第一次——文件不存在,创建成功
with open("exclusive.txt", "x", encoding="utf-8") as f:
f.write("这个文件是新建的\n")
print("文件创建成功")
# 第二次——文件已存在,报错!
# with open("exclusive.txt", "x", encoding="utf-8") as f:
# pass # FileExistsError!
# x模式的特点:
# - 文件不存在→创建
# - 文件存在→报错(防止覆盖)
# - 只能写入
三、组合模式:文本与二进制
3.1 t —— 文本模式(默认)
# 默认就是文本模式,r 等同于 rt,w 等同于 wt
# 文本模式:
# - 自动处理换行符转换(Windows上\r\n ↔ \n)
# - 需要指定encoding(推荐始终指定)
# - 读写的是str字符串
# - 适合文本文件(.txt, .csv, .json, .html等)
with open("text_demo.txt", "wt", encoding="utf-8") as f:
f.write("文本模式\n")
f.write("自动处理换行符\n")
3.2 b —— 二进制模式
# b:二进制模式,读写bytes而非str
# 不需要encoding参数(因为不进行文本编码)
# 写入二进制数据
with open("binary_demo.bin", "wb") as f:
f.write(b"Hello in bytes\n") # bytes字面量
f.write(bytes([0, 1, 2, 255])) # 字节数组
# 读取二进制数据
with open("binary_demo.bin", "rb") as f:
data = f.read()
print(f"读取了{len(data)}字节")
print(f"前10字节: {data[:10]}")
print(f"十六进制: {data.hex()[:40]}...")
# b模式的特点:
# - 读写bytes对象(不是str)
# - 不进行换行符转换
# - 不进行编码解码
# - 适合:图片、音频、视频、压缩包、可执行文件等
3.3 r+、w+、a+ —— 读写模式
# + 表示同时支持读写
# r+:读写模式,文件必须存在,不截断
with open("test_rw.txt", "w", encoding="utf-8") as f:
f.write("ABCDEFGHIJ") # 先创建一个有内容的文件
with open("test_rw.txt", "r+", encoding="utf-8") as f:
print(f"初始位置: {f.tell()}") # 0 —— 文件开头
print(f"读取5个字符: {f.read(5)}") # ABCDE
print(f"当前位置: {f.tell()}") # 5
f.write("123") # 从位置5开始写入,覆盖
f.seek(0) # 回到开头
print(f"修改后: {f.read()}") # ABCDE123IJ
# w+:读写模式,文件存在则清空
# 很少使用——通常写完之后关闭再用r打开更清晰
# a+:读写模式,写入追加到末尾,读取需要先seek
with open("test_ap.txt", "a+", encoding="utf-8") as f:
f.write("追加内容\n")
f.seek(0) # 要读取需要先移到开头
print(f"当前内容: {f.read()}")
四、打开模式速查表
# 完整模式对照表 """ 模式 文件存在 文件不存在 文件指针 可读 可写 截断 r ✓打开 ✗报错 开头 ✓ ✗ 否 w ✓截断为空 ✓创建 开头 ✗ ✓ 是 a ✓打开 ✓创建 末尾 ✗ ✓ 否 x ✗报错 ✓创建 开头 ✗ ✓ 否 r+ ✓打开 ✗报错 开头 ✓ ✓ 否 w+ ✓截断为空 ✓创建 开头 ✓ ✓ 是 a+ ✓打开 ✓创建 末尾 ✓ ✓ 否 组合方式:mode = (r|w|a|x)[+][b|t] 例如:rb, w+b, at, x+b """ # 💡 选型决策树 # 只需读取 → "r" # 创建新文件(不覆盖已有) → "x" # 覆盖写入或创建 → "w" # 追加内容(日志) → "a" # 需要读写 → "r+"(最常用) # 处理二进制 → 加"b"("rb", "wb"等) # 处理文本 → 默认就是"t",可省略
五、encoding参数的重要性
# ⚠️ 永远不要省略encoding参数!
# ❌ 不指定encoding——使用系统默认编码
# Windows上默认是GBK,Linux上默认是UTF-8
# 导致代码在不同平台上行为不一致
# ✅ 始终指定encoding
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()
# 常见编码:
# utf-8 —— 国际通用,推荐首选
# gbk/gb2312 —— 中文Windows默认
# latin-1 —— 西欧语言
# utf-8-sig —— 带BOM的UTF-8(某些Windows软件使用)
# 检测文件编码(需要第三方库chardet)
# pip install chardet
# import chardet
# with open("unknown.txt", "rb") as f:
# raw = f.read()
# result = chardet.detect(raw)
# print(f"检测到编码: {result['encoding']}")
六、总结
open()的打开模式决定了你能对文件做什么。选对模式是文件操作的第一步。
核心要点:
| 场景 | 推荐模式 |
|---|---|
| 读取文本 | "r", encoding=“utf-8” |
| 写入(覆盖) | "w", encoding=“utf-8” |
| 追加(日志) | "a", encoding=“utf-8” |
| 安全创建 | "x", encoding=“utf-8” |
| 读取图片/音频 | "rb" |
| 写入二进制 | "wb" |
三个好习惯:1) 始终指定encoding 2) 优先用with语句 3) 用"x"代替"w"防止误覆盖。
到此这篇关于Python文件操作之open()函数的打开模式全解析的文章就介绍到这了,更多相关Python open()文件操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
