讲解

读写文件从内置函数 open 开始:f = open('data.txt', 'r', encoding='utf-8') 打开文件,f.read() 读全部,f.close() 关闭。但手动 close 容易被异常跳过导致资源泄漏,所以标准写法是 with 语句:with open(...) as f: 缩进块里随便用,出块时文件自动关闭——异常中断也照样关。with 是 Python 管理资源的通用机制(上下文管理器),文件、网络连接、锁都用它。

读写模式:'r' 读(默认,文件不存在抛 FileNotFoundError)、'w' 写(不存在则创建,存在则清空!)、'a' 追加、'b' 加在后面表示二进制('rb' 读图片等)。中文文件务必显式写 encoding='utf-8',否则 Windows 上默认编码可能不是 UTF-8,读写中文直接乱码或报错。读文件三种粒度:read() 全部(大文件慎用)、readlines() 按行成列表、以及最推荐的「直接迭代文件对象」——for line in f: 逐行读,内存友好,每行末尾带换行符,记得 strip。

路径处理别用字符串拼接,用标准库 pathlib:Path('data') / 'logs' / 'a.txt' 自动处理分隔符,跨平台无忧。Path 对象还有一堆便利方法:exists() 判断存在、read_text()/write_text() 一步读写文本(内部自动关闭文件)、mkdir(parents=True, exist_ok=True) 建目录、glob('*.py') 找文件、suffix 取后缀、stem 取主名。小文件读写用 Path.read_text/write_text 两行搞定,是最现代省心的写法。

示例

以下代码会在当前目录创建演示文件,运行完可以自己删掉:

from pathlib import Path

# write_text / read_text:小文件两行搞定
path = Path('demo_notes.txt')
path.write_text('第一行:Python\n第二行:文件读写\n第三行:with 语句\n', encoding='utf-8')
print('读回来:')
print(path.read_text(encoding='utf-8'))

# with + 迭代:逐行处理大文件的标准姿势
print('逐行读取:')
with open(path, 'r', encoding='utf-8') as f:
    for lineno, line in enumerate(f, start=1):
        print(f'  {lineno}: {line.strip()}')

# 'a' 追加模式
with open(path, 'a', encoding='utf-8') as f:
    f.write('追加的第四行\n')
print('追加后行数:', len(path.read_text(encoding='utf-8').splitlines()))

# Path 的便利方法
print('存在吗:', path.exists(), ',后缀:', path.suffix, ',主名:', path.stem)

# 二进制模式读自己(任何文件都是字节)
with open(path, 'rb') as f:
    raw = f.read()
print('字节数:', len(raw), ',前 6 字节:', raw[:6])

# glob 找文件
print('当前目录的 txt 文件:', [p.name for p in Path('.').glob('*.txt')])

# 收尾:清理演示文件
path.unlink()
print('演示文件已删除:', not path.exists())

常见坑

  • 用 'w' 打开已有文件:内容瞬间清空,不可恢复。想追加用 'a',写之前想清楚。
  • 忘记关闭文件:裸 open 不 close,数据可能还在缓冲区没落盘,程序崩溃就丢。一律 with。
  • 不写 encoding:Windows 默认编码不是 UTF-8,中文读写乱码。所有文本文件操作显式 encoding='utf-8'。
  • 用字符串拼路径:'dir' + '/' + name 在 Windows 上就裂了。pathlib 的 / 运算符跨平台,还能直接 .exists()。

小结

with open 自动关文件,'r'/'w'/'a'/'b' 模式分清,中文必写 encoding='utf-8';逐行迭代读大文件;路径交给 pathlib。下一节学习体面地面对错误:异常处理。