摘要

文件操作是 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+✅✅创建保留结尾极少使用

 

更多推荐