一、快速掌握Python 中的文件操作知识体系
快速掌握Python 文件操作知识体系
文章目录
- 快速掌握Python 文件操作知识体系
- 🔰 基础层(必须掌握,最核心的文件知识)
- 📈 进阶层(用得多,但新手常忽略)
- Python 文件操作重要语法总结表
- Windows 文件路径写法对照表
- 0⃣ 基础准备:路径与文件位置(容易忽略)
- 定义
- 作用
- 通用语法
- 典型示例(逐行注解)
- 1⃣ 文件的编码(避免中文乱码)
- 定义
- 作用
- 通用语法
- 典型示例(逐行注解)
- 2⃣ 打开模式(读/写/追加/二进制)
- 定义
- 作用
- 常见模式
- 典型示例(逐行注解)
- 3⃣ 读取文件(read / readline / for 逐行)
- 定义
- 作用
- 通用语法
- 典型示例(逐行注解)
- 4⃣ 写入与覆盖(w)
- 定义
- 作用
- 通用语法
- 典型示例(逐行注解)
- 5⃣ 追加写入(a)
- 定义
- 作用
- 典型示例(逐行注解)
- 6⃣ 文件指针(seek / tell)
- 定义
- 作用
- 通用语法
- 典型示例(逐行注解)
- 7⃣ with 上下文(自动关闭)
- 定义
- 作用
- 典型示例(逐行注解)
- 8⃣ 文本 vs 二进制(图片/音频/模型)
- 定义
- 作用
- 典型示例(逐行注解)
- 9⃣ 文件系统操作(os / pathlib)
- 定义
- 作用
- 典型示例(逐行注解)
- 🔟 JSON(结构化数据,前后端通用)
- 定义
- 作用
- 典型示例(逐行注解)
- 1️⃣1️⃣ CSV(表格数据,Excel 友好)
- 定义
- 作用
- 典型示例(逐行注解)
- 1️⃣2️⃣ Pickle(把 Python 对象“原封不动”存成二进制)
- 定义
- 作用
- 典型示例(逐行注解)
- 1️⃣3️⃣ 异常处理(健壮性)
- 定义
- 典型示例(逐行注解)
- 1️⃣4️⃣ 综合小案例(把上面知识串起来)
- ✅ 易错与技巧清单(考试/面试常问)
🔰 基础层(必须掌握,最核心的文件知识)
- 文件路径(绝对/相对路径,
os.getcwd()
) - 文件编码(UTF-8、GBK)
- 打开模式(
r
/w
/a
/rb
/wb
/r+
等) - 文件读取(
read
/readline
/for line in f
) - 文件写入(
write
覆盖写) - 文件追加(
a
模式追加写) - with 上下文(自动关闭文件)
- 文件指针(
seek
/tell
,定位光标)
👉 这些就是 Python 文件操作的基本功,几乎所有教材、考试、项目都会涉及。
📈 进阶层(用得多,但新手常忽略)
- 逐行读取大文件(节省内存,适合大日志/大数据文件)
- 二进制文件操作(图片、音频、视频必须用
rb/wb
) - 文件系统管理(删除、重命名、判断存在、建目录 →
os
/pathlib
) - 异常处理(文件不存在/权限不足 →
try...except
)
Python 文件操作重要语法总结表
语法/写法 | 含义/作用 | 示例代码 |
---|---|---|
open 基本格式 | 打开文件(路径 + 模式 + 编码) | f = open("路径", mode="r", encoding="utf-8") |
关闭文件 | 手动释放资源 | f.close() |
with 上下文 | 自动关闭文件(推荐) | with open("a.txt", "r", encoding="utf-8") as f: |
读取全部 | 一次性读取整个文件 | f.read() |
读取部分 | 读取前 N 个字符 | f.read(10) |
读取一行 | 逐行处理 | f.readline() |
读取所有行 | 返回列表(大文件不推荐) | f.readlines() |
逐行遍历 | 内存友好,适合大文件 | for line in f: |
写入(覆盖) | 覆盖写入 | open("a.txt","w").write("内容") |
写入(追加) | 文件末尾追加内容 | open("a.txt","a").write("内容") |
文件指针位置 | 获取当前位置 | f.tell() |
移动文件指针 | 移动到指定位置 | f.seek(0) |
文本模式 | 默认,处理字符串 | open("a.txt","r",encoding="utf-8") |
二进制模式 | 处理图片/音频等原始字节 | open("a.png","rb") |
Windows 文件路径写法对照表
写法 | 是否正确 | 示例 |
---|---|---|
直接写 \ | ❌ 错误(\U 被当转义) | "C:\Users\me\file.txt" |
双斜杠 \\ | ✅ 正确 | "C:\\Users\\me\\file.txt" |
原始字符串 r"..." | ✅ 正确 | r"C:\Users\me\file.txt" |
用 / | ✅ 正确(推荐跨平台) | "C:/Users/me/file.txt" |
pathlib | ✅ 正确(现代写法) | from pathlib import Path; Path("C:/Users/me/file.txt") |
0⃣ 基础准备:路径与文件位置(容易忽略)
定义
路径就是文件在磁盘里的“地址”;分绝对路径(从盘符或根目录开始)与相对路径(相对于当前工作目录)。
作用
找得到文件,读写才不会报错。
通用语法
- 绝对:
"C:/data/text.txt"
或"/home/user/text.txt"
- 相对:
"data/text.txt"
(相对当前工作目录
)
典型示例(逐行注解)
import os # 导入 os 用于查看当前目录
print(os.getcwd()) # 打印“当前工作目录”,相对路径都以它为起点
# 假设当前目录下有一个 data 目录,里面有 demo.txt
relative_path = "data/demo.txt" # 相对路径:相对于 os.getcwd()
absolute_path = os.path.abspath(relative_path) # 把相对路径变成绝对路径,便于排错
print(absolute_path) # 看看真实完整路径长什么样
小提示:路径写错、工作目录不对,是新手读写失败的第一大原因。不会就先
print(os.getcwd())
。
1⃣ 文件的编码(避免中文乱码)
定义
编码把“字符”↔“字节”互转,常见有 UTF-8(全球通用编码)、GBK 、Big5等。
作用
跨平台/跨软件读写时不乱码。
通用语法
open("路径", mode="r", encoding="utf-8")
"路径"
→ 你要操作的文件路径(例如 "data.txt"
)。
mode="r"
→ 打开模式(r=只读,w=写入,a=追加,rb/wb=二进制)。
encoding="utf-8"
→ 指定编码方式(防止中文乱码,常用 utf-8)。
典型示例(逐行注解)
# 读取 UTF-8 文本文件
with open("data/demo.txt", "r", encoding="utf-8") as f: # r=只读;encoding 指定为 UTF-8content = f.read() # 一次性读出全部文本为字符串print(content) # 打印看看内容是否正常
# with 结束会自动关闭文件,无需 f.close()
2⃣ 打开模式(读/写/追加/二进制)
定义
打开模式决定能不能读、能不能写、是否覆盖、是否二进制。
作用
根据需求选择正确模式,避免覆盖或读不到。
常见模式
"r"
:只读(文件必须存在)"w"
:写入(会清空原文件)"a"
:追加(在末尾继续写)"rb"/"wb"/"ab"
:二进制读/写/追加(图片、音频、模型等)"r+"
:读写(必须存在)"w+"
:写读(先清空)"a+"
:追加读写(指针在末尾,写完读需要seek
)
典型示例(逐行注解)
# 追加日志,不覆盖历史
with open("logs/app.log", "a", encoding="utf-8") as f: # a=append 追加f.write("程序启动成功\n") # 手动加换行符 \n
3⃣ 读取文件(read / readline / for 逐行)
定义
把磁盘中的内容读到内存。
作用
读取配置、分析日志、加载数据集。
通用语法
f.read() # 全部
f.readline() # 一行
f.readlines() # 所有行(列表,不太省内存)
典型示例(逐行注解)
# 小文件:一次性读完
with open("data/small.txt", "r", encoding="utf-8") as f:text = f.read() # 返回整个文件内容(字符串)print(text)# 大文件:逐行读取,省内存
with open("data/big.txt", "r", encoding="utf-8") as f:for line in f: # 文件对象可直接迭代,一次一行line = line.rstrip("\n") # 去掉行尾换行符,避免多空行print(line)
4⃣ 写入与覆盖(w)
定义
把内存数据写到文件(会清空原内容)。
作用
生成/更新文件、导出结果。
通用语法
open("路径", "w", encoding="utf-8").write("文本")
典型示例(逐行注解)
# 覆盖写入
with open("output/result.txt", "w", encoding="utf-8") as f:f.write("第一行\n") # 每次 write 不会自动换行f.write("第二行\n") # 需要手动加 \n
5⃣ 追加写入(a)
定义
在文件末尾继续写,不覆盖已有内容。
作用
写日志、逐步积累数据。
典型示例(逐行注解)
with open("output/result.txt", "a", encoding="utf-8") as f:f.write("追加一行时间戳: 2025-08-27 14:00\n") # 一直往后加
6⃣ 文件指针(seek / tell)
定义
指针是文件内部的“光标位置”,决定从哪读/写。
作用
随机访问;a+
写完想读就必须 seek
回去。
通用语法
f.tell() # 当前位置(字节/字符位置)
f.seek(offset, whence) # 移动指针:whence=0开头,1当前,2末尾
典型示例(逐行注解)
# 在 a+ 下写完再读:必须把指针移回
with open("output/seek_demo.txt", "a+", encoding="utf-8") as f:f.write("hello\n") # 末尾追加print(f.tell()) # 当前在文件末尾f.seek(0) # 回到开头print(f.readline().strip()) # 现在可以读到第一行
7⃣ with 上下文(自动关闭)
定义
with open(...) as f:
语法会在代码块结束时自动关闭文件。
作用
避免忘记 close()
导致资源泄露或写入未落盘。
典型示例(逐行注解)
# with 是最佳实践:干净、可靠
with open("data/auto_close.txt", "w", encoding="utf-8") as f:f.write("这行写完就会自动关闭文件\n") # 出错也会正确清理资源
8⃣ 文本 vs 二进制(图片/音频/模型)
定义
文本模式处理字符串;二进制模式处理原始字节(bytes)。
作用
图片、音频、Pickle 文件都必须用 b 模式。
典型示例(逐行注解)
# 复制图片:二进制按块读写
chunk_size = 64 * 1024 # 每次读 64KB,避免一次性读完
with open("assets/logo.png", "rb") as src: # rb = 二进制只读with open("backup/logo_copy.png", "wb") as dst: # wb = 二进制写入(覆盖)while True:chunk = src.read(chunk_size) # 读一块字节if not chunk: # 为空表示到文件末尾breakdst.write(chunk) # 写入目标文件
9⃣ 文件系统操作(os / pathlib)
定义
不仅要读内容,也常常要判断、重命名、删除、建目录。
作用
配合读写完成“文件生命周期管理”。
典型示例(逐行注解)
import os
from pathlib import Path# 目录确保存在
Path("output").mkdir(parents=True, exist_ok=True) # 不存在就创建,已存在不报错# 判断/重命名/删除
print(os.path.exists("output/result.txt")) # True/False
os.rename("output/result.txt", "output/final.txt") # 改名
os.remove("output/final.txt") # 删除文件
🔟 JSON(结构化数据,前后端通用)
定义
JSON 是“字典/列表”的文本表示,最常用的数据交换格式。
作用
把 Python 对象无损保存到文本;跨语言通用。
典型示例(逐行注解)
import jsondata = {"name": "张三", "age": 20, "skills": ["Python", "SQL"]} # 普通字典# 写入 JSON 文件(中文不转义,缩进 4 格)
with open("data/user.json", "w", encoding="utf-8") as f:json.dump(data, f, ensure_ascii=False, indent=4) # 更美观、更易读# 读取 JSON 文件为 Python 对象
with open("data/user.json", "r", encoding="utf-8") as f:obj = json.load(f) # 恢复成字典/列表print(obj["name"]) # 访问字段:张三
1️⃣1️⃣ CSV(表格数据,Excel 友好)
定义
逗号分隔的纯文本表格格式。
作用
导入/导出 Excel 或数据分析用表格。
典型示例(逐行注解)
import csv# 写 CSV(Windows 一定加 newline="",否则会多空行)
with open("data/users.csv", "w", newline="", encoding="utf-8") as f:writer = csv.writer(f) # 创建写入器writer.writerow(["姓名", "年龄"]) # 写表头(一行)writer.writerow(["张三", 20]) # 写一行数据writer.writerow(["李四", 22]) # 再写一行# 读 CSV(逐行解析成列表)
with open("data/users.csv", "r", encoding="utf-8") as f:reader = csv.reader(f) # 创建读取器for row in reader: # 每一行是一个 listprint(row) # ['姓名', '年龄'] ...
1️⃣2️⃣ Pickle(把 Python 对象“原封不动”存成二进制)
定义
序列化:把任意 Python 对象转成字节;反序列化:从字节还原对象。
作用
保存模型、缓存复杂数据结构(注意只给自己/可信环境用)。
典型示例(逐行注解)
import pickleobj = {"a": 1, "b": [1, 2, 3]} # 任意对象(可嵌套)# 保存为二进制
with open("data/cache.pkl", "wb") as f: # wb=二进制写pickle.dump(obj, f) # 序列化到文件# 读取并还原
with open("data/cache.pkl", "rb") as f: # rb=二进制读restored = pickle.load(f) # 反序列化print(restored) # {'a': 1, 'b': [1, 2, 3]}
1️⃣3️⃣ 异常处理(健壮性)
定义
文件可能不存在/占用/权限不足,用 try…except
兜底不崩。
典型示例(逐行注解)
try:with open("data/not_exists.txt", "r", encoding="utf-8") as f:print(f.read()) # 试图读取一个不存在的文件
except FileNotFoundError: # 精确捕获:文件未找到print("文件不存在,请检查路径或文件名!") # 友好提示
1️⃣4️⃣ 综合小案例(把上面知识串起来)
需求:读取一份原始文本,去掉空行与首尾空白,统计行数、字数、字符数,
写回“清洗后的文本”,并把统计信息同时保存到 JSON 和 CSV。
import os
import json
import csv
from pathlib import Path# 1) 准备输入输出路径
inp = Path("data/raw.txt") # 原始文本
out_text = Path("output/clean.txt") # 清洗后的文本
out_json = Path("output/stats.json") # 统计信息(JSON)
out_csv = Path("output/stats.csv") # 统计信息(CSV)# 2) 确保 output 目录存在
out_text.parent.mkdir(parents=True, exist_ok=True) # 没有就创建# 3) 逐行读取 + 清洗 + 统计
clean_lines = [] # 存放清洗后的行
line_count = word_count = char_count = 0 # 三个统计量归零with open(inp, "r", encoding="utf-8") as f: # 以 UTF-8 逐行读取for line in f: # 一次读一行,省内存line = line.strip() # 去掉首尾空白(含换行)if not line: # 空行直接跳过continueclean_lines.append(line) # 收集保留的行line_count += 1 # 行数 +1word_count += len(line.split()) # 简单按空格切分统计词数char_count += len(line) # 字符数(含中文按字符计)# 4) 写回清洗后的文本
with open(out_text, "w", encoding="utf-8") as f: # 覆盖写入for line in clean_lines:f.write(line + "\n") # 逐行写出,补上换行# 5) 统计信息 -> JSON
stats = {"lines": line_count, "words": word_count, "chars": char_count}
with open(out_json, "w", encoding="utf-8") as f:json.dump(stats, f, ensure_ascii=False, indent=4) # 漂亮地写 JSON# 6) 统计信息 -> CSV(表格友好)
with open(out_csv, "w", newline="", encoding="utf-8") as f:writer = csv.writer(f)writer.writerow(["指标", "数值"]) # 表头writer.writerow(["行数", line_count])writer.writerow(["单词数(粗略)", word_count])writer.writerow(["字符数", char_count])print("处理完成:")
print(f" 清洗文本:{out_text}")
print(f" 统计JSON:{out_json}")
print(f" 统计CSV :{out_csv}")
✅ 易错与技巧清单(考试/面试常问)
- Windows CSV 多空行:写 CSV 时一定
newline=""
。 - a+ 读不到:
a+
写完读之前f.seek(0)
。 - 编码不明:优先用 UTF-8;不确定时试
encoding="utf-8", errors="ignore"
临时兜底。 - 大文件:不要
read()
/readlines()
一次性全读,改用for line in f
。 - 目录不存在:先
Path(...).mkdir(parents=True, exist_ok=True)
。 - 二进制文件:必须
rb/wb
,绝不能在文本模式下处理图片/音频/模型。