Skip to content

20|文件读写

程序需要持久化数据时,文件是最直接的载体。配置文件、日志、数据导出、报告生成——这些场景都离不开文件的读写操作。

一、open() 函数

open() 打开文件,返回文件对象:

python
f = open("data.txt", "r", encoding="utf-8")
content = f.read()
f.close()

模式参数:

模式含义
"r"只读(默认)
"w"只写,文件存在则覆盖
"a"追加,写在文件末尾
"x"创建新文件,文件已存在则报错
"b"二进制模式,如 "rb""wb"
"+"读写,如 "r+""w+"

二、with 语句

文件打开后必须关闭,释放系统资源。with 语句自动处理关闭:

python
with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read()
# 离开 with 块时,f.close() 自动调用

with 保证即使代码块内部抛出异常,文件也会被正确关闭。这是处理文件的标准写法。

三、读取方式

read():读取全部

python
with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read()        # 读取整个文件为字符串

大文件不要用 read()——会把整个文件内容加载到内存。

readline():逐行读取

python
with open("data.txt", "r", encoding="utf-8") as f:
    first = f.readline()      # 读取一行(包含末尾换行符)
    second = f.readline()

迭代读取:最常用

python
with open("data.txt", "r", encoding="utf-8") as f:
    for line in f:
        print(line.strip())   # strip() 去掉末尾换行符

文件对象是可迭代的,每次迭代返回一行。这是处理大文件的最佳方式——内存里始终只有当前行。

readlines():读取为列表

python
with open("data.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()     # ['第一行\n', '第二行\n', ...]

四、写入文件

python
# 覆盖写入
with open("output.txt", "w", encoding="utf-8") as f:
    f.write("第一行\n")
    f.write("第二行\n")

# 追加写入
with open("log.txt", "a", encoding="utf-8") as f:
    f.write("新日志\n")

write() 不会自动加换行符,需要手动写 \n

写入多行:

python
lines = ["line1", "line2", "line3"]
with open("output.txt", "w", encoding="utf-8") as f:
    f.write("\n".join(lines))
    f.write("\n")   # 末尾加换行

或:

python
with open("output.txt", "w", encoding="utf-8") as f:
    f.writelines(line + "\n" for line in lines)

五、二进制文件

图片、音频、压缩包等非文本文件用二进制模式:

python
# 读取二进制
with open("image.png", "rb") as f:
    data = f.read()   # data 是 bytes 对象

# 写入二进制
with open("copy.png", "wb") as f:
    f.write(data)

二进制模式不需要指定 encoding

六、编码问题

文件编码不一致是常见错误:

python
# 文件实际是 GBK 编码,按 UTF-8 读会报错
with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read()   # UnicodeDecodeError

解决:

python
# 尝试不同编码
with open("data.txt", "r", encoding="gbk") as f:
    content = f.read()

# 或忽略错误字符
with open("data.txt", "r", encoding="utf-8", errors="ignore") as f:
    content = f.read()

# 或用替代字符
with open("data.txt", "r", encoding="utf-8", errors="replace") as f:
    content = f.read()

Linux 系统默认编码通常是 UTF-8。Windows 上中文系统可能用 GBK,跨平台时要注意。

七、文件指针

文件对象内部有一个指针,标记当前读写位置:

python
with open("data.txt", "r+") as f:
    content = f.read()    # 指针移到末尾
    f.seek(0)             # 指针移回开头
    f.write("OVERWRITE")  # 从开头覆盖写入

seek(0) 把指针移到文件开头。日常脚本中很少需要手动操作指针。

记忆锚点with open(...) as f 是标准写法,自动关闭文件;for line in f 逐行读取,省内存;"r" 读,"w" 覆盖写,"a" 追加;二进制模式用 "rb"/"wb",不要指定编码;编码不一致时尝试 gbk 或加 errors="ignore"write() 不自动加换行符。