Python 文件操作详解:从入门到实战(r/w/a/r+/w+/a + 全解析)
摘要
文件操作是 Python 开发的核心基础技能,本文系统讲解 Python 中open\(\)函数的 9 种核心打开模式(r/rb、w/wb、a/ab、r+、w+、a+),涵盖文件读写、光标控制、文件修改等实战场景,附完整可运行代码示例,帮助零基础开发者快速掌握文件操作核心逻辑,规避内存溢出、编码错误等常见坑点。
1. 初识 Python 文件操作
Python 通过内置open\(\)函数操作文件,核心逻辑:打开文件→获取文件句柄→句柄操作文件→关闭文件。
核心打开模式
默认模式为r(只读),完整模式列表: r、rb、w、wb、a、ab、r\+、w\+、a\+
基础语法
# 打开文件,获取句柄 文件句柄 = open(文件路径, 模式, 编码格式) # 操作文件(读/写) 文件句柄.操作方法() # 关闭文件(必做,释放资源) 文件句柄.close()
路径说明
-
绝对路径:从磁盘根目录开始(如
C:/Users/xxx/test\.txt),不推荐,移植性差。 -
相对路径:相对于当前代码文件目录(如
test\.txt、\.\./data/test\.txt),推荐使用,移植性强。
2. 只读模式(r、rb)
2.1 r 模式(文本只读)
读取文本文件,需指定encoding(常用utf\-8),只能读,不能写。
代码示例
# 打开文本文件,只读模式,utf-8编码
f = open("test.txt", mode="r", encoding="utf-8")
# 读取全部内容
content = f.read()
print(content)
# 关闭文件
f.close()
2.2 rb 模式(字节只读)
读取非文本文件(图片、视频、音频),返回bytes类型,不能指定 encoding。
代码示例
# 打开图片文件,字节只读模式
f = open("demo.jpg", mode="rb")
# 读取字节数据
content = f.read()
print(content) # 输出:b'\xff\xd8\xff\xe0\x00\x10JFIF...'
f.close()
2.3 常用读取方法
| 方法 | 作用 | 弊端 |
|---|---|---|
read\(\) | 读取文件全部内容 | 大文件易内存溢出 |
read\(n\) | 读取n 个字符 / 字节(r 模式字符,rb 模式字节) | 需手动控制读取长度 |
readline\(\) | 一次读取一行(含换行符\\n) | 需循环读取多行 |
readlines\(\) | 读取所有行,返回列表(每行一个元素) | 大文件易内存溢出 |
for循环 | 逐行读取,内存最优 | 需循环处理每行数据 |
逐行读取(推荐)
f = open("test.txt", mode="r", encoding="utf-8")
# 逐行读取,自动处理换行
for line in f:
print(line.strip()) # strip()去除首尾空格和换行
f.close()
3. 只写模式(w、wb)
3.1 w 模式(文本只写)
清空原文件内容,写入新内容;文件不存在则创建文件,只能写,不能读。
代码示例
# 只写模式,清空原内容或创建文件
f = open("write_test.txt", mode="w", encoding="utf-8")
# 写入内容
f.write("Python文件操作\n")
f.write("只写模式w")
# 刷新缓冲区(强制写入磁盘,养成好习惯)
f.flush()
f.close()
3.2 wb 模式(字节只写)
写入字节数据,无需指定encoding;字符串需转bytes(encode\(\&\#34;utf\-8\&\#34;\))。
代码示例
f = open("byte_write.txt", mode="wb")
# 字符串转字节写入
f.write("字节写入测试".encode("utf-8"))
f.flush()
f.close()
4. 追加模式(a、ab)
4.1 a 模式(文本追加)
不清空原文件,新内容追加到文件末尾;文件不存在则创建,只能写,不能读。
代码示例
# 追加模式,内容写在文件末尾
f = open("append_test.txt", mode="a", encoding="utf-8")
f.write("\n追加一行内容")
f.flush()
f.close()
4.2 ab 模式(字节追加)
字节数据追加,用法同wb,仅写入位置为文件末尾。
5. 读写模式(r+)
最常用读写模式,文件必须已存在,默认光标在开头,可读可写。
核心规则
-
✅ 正确:先读→后写(读完光标在末尾,写入追加到结尾)
-
❌ 错误:先写→后读(开头直接覆盖原内容)
5.1 正确用法(先读后写)
# r+读写模式
f = open("r+_test.txt", mode="r+", encoding="utf-8")
# 先读
content = f.read()
print("原内容:", content)
# 后写(追加到末尾)
f.write("\nr+模式追加内容")
f.flush()
f.close()
5.2 错误用法(先写后读)
f = open("r+_test.txt", mode="r+", encoding="utf-8")
# 先写(覆盖开头内容)
f.write("覆盖开头")
# 后读(读取剩余内容)
content = f.read()
print("读取内容:", content)
f.flush()
f.close()
6. 写读模式(w+)
先清空文件→写入内容→可读取,文件不存在则创建;读取内容永远为空,极少使用。
代码示例
# w+写读模式
f = open("w+_test.txt", mode="w+", encoding="utf-8")
# 清空文件并写入
f.write("w+模式测试")
# 读取内容(为空,光标在末尾)
content = f.read()
print("读取内容:", content) # 输出:空
f.flush()
f.close()
7. 追加读模式(a+)
内容追加到末尾,可读可写;无论先读后读,读取内容均为空,极少使用。
代码示例
# a+追加读模式
f = open("a+_test.txt", mode="a+", encoding="utf-8")
# 追加内容
f.write("a+模式测试")
# 读取内容(为空)
content = f.read()
print("读取内容:", content) # 输出:空
f.flush()
f.close()
8. 文件操作进阶:光标与截断
8.1 seek (n):移动光标
-
作用:将光标移动到n 字节位置(中文 utf-8 占 3 字节,n 需为 3 的倍数)
-
语法:
f\.seek\(偏移量, 参考位置\)-
参考位置:0 = 开头(默认)、1 = 当前、2 = 结尾
-
常用操作
f = open("seek_test.txt", mode="r+", encoding="utf-8")
# 光标移到开头
f.seek(0)
# 光标移到结尾
f.seek(0, 2)
f.close()
8.2 tell ():获取光标位置
返回当前光标所在字节位置。
代码示例
f = open("tell_test.txt", mode="r+", encoding="utf-8")
f.seek(0)
print(f.tell()) # 输出:0
f.write("测试")
print(f.tell()) # 输出:6(2个中文,3*2=6字节)
f.close()
8.3 truncate ():截断文件
删除光标之后的所有内容;truncate\(n\)从开头截断到 n 字节,无参数则从当前光标截断。
代码示例
f = open("truncate_test.txt", mode="r+", encoding="utf-8")
f.seek(6) # 光标移到6字节位置
f.truncate() # 删除6字节后内容
f.close()
9. 文件修改实战
Python不能直接修改文件中间内容,核心逻辑:读原文件→内存修改→删原文件→重命名新文件。
9.1 常规修改(小文件)
一次性读取全部内容,适合小文件。
import os
# 打开原文件和新文件
with open("modify.txt", mode="r", encoding="utf-8") as f1, \
open("modify_new.txt", mode="w", encoding="utf-8") as f2:
# 读取全部内容
content = f1.read()
# 替换内容(修改逻辑)
new_content = content.replace("旧内容", "新内容")
# 写入新文件
f2.write(new_content)
# 删除原文件
os.remove("modify.txt")
# 重命名新文件为原文件名
os.rename("modify_new.txt", "modify.txt")
9.2 逐行修改(大文件,推荐)
逐行读取修改,避免内存溢出,适合大文件。
import os
with open("big_modify.txt", mode="r", encoding="utf-8") as f1, \
open("big_modify_new.txt", mode="w", encoding="utf-8") as f2:
# 逐行读取
for line in f1:
# 逐行修改
new_line = line.replace("旧值", "新值")
f2.write(new_line)
os.remove("big_modify.txt")
os.rename("big_modify_new.txt", "big_modify.txt")
9.3 with 语句(推荐,自动关文件)
无需手动写f\.close\(\),代码块结束自动关闭文件,避免资源泄漏。
# with语句简化写法
with open("test.txt", mode="r", encoding="utf-8") as f:
content = f.read()
print(content)
10. 核心模式对比总结
| 模式 | 可读 | 可写 | 文件不存在 | 原有内容 | 光标位置 | 常用场景 |
|---|---|---|---|---|---|---|
| r | ✅ | ❌ | 报错 | 保留 | 开头 | 读取文本文件 |
| rb | ✅ | ❌ | 报错 | 保留 | 开头 | 读取图片 / 视频 |
| w | ❌ | ✅ | 创建 | 清空 | 开头 | 写入新文件 |
| wb | ❌ | ✅ | 创建 | 清空 | 开头 | 写入字节数据 |
| a | ❌ | ✅ | 创建 | 保留 | 结尾 | 追加日志 / 数据 |
| r+ | ✅ | ✅ | 报错 | 保留 | 开头 | 读写文件(最常用) |
| w+ | ✅ | ✅ | 创建 | 清空 | 结尾 | 极少使用 |
| a+ | ✅ | ✅ | 创建 | 保留 | 结尾 | 极少使用 |
更多推荐

所有评论(0)