9
文件与 IO
Files, CSV, JSON, pathlib
程序跑在内存里,一关就没——所以要把结果写进文件。最常见三种:文本、CSV(表格)、JSON(结构化数据)。Python 都有标准库,不用装第三方。
读写文本文件
# 写:模式 "w" 覆盖写,"a" 追加,"r" 只读(默认)
with open("note.txt", "w", encoding="utf-8") as f:
f.write("第一行\n")
f.write("第二行\n")
# 读
with open("note.txt", "r", encoding="utf-8") as f:
content = f.read() # 整个读成一个字符串
print(content)
# 逐行读(大文件友好,不一次性塞进内存)
with open("note.txt", encoding="utf-8") as f:
for line in f:
print(line.strip())
CSV 与 JSON
import csv, json
# CSV:表格数据,Excel 能直接打开
with open("people.csv", "w", newline="", encoding="utf-8-sig") as f:
w = csv.writer(f)
w.writerow(["姓名", "年龄"])
w.writerow(["小明", 18])
w.writerow(["小红", 20])
# 读 CSV:DictReader 把每行读成字典
with open("people.csv", encoding="utf-8-sig") as f:
for row in csv.DictReader(f):
print(row["姓名"], row["年龄"])
# JSON:结构化数据,跨语言通用
data = {"name": "小明", "hobbies": ["读书", "跑步"]}
with open("me.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# ensure_ascii=False 才能正常写中文
with open("me.json", encoding="utf-8") as f:
loaded = json.load(f)
print(loaded["name"]) # 小明
Excel 与 pickle:两种"非文本"文件
CSV 是纯文本,人人能开;但老板要 .xlsx、程序要把整个 Python 对象存盘,这时候就轮到 openpyxl 和标准库 pickle 上场了。
openpyxl 读写真正的 Excel(.xlsx)
pip install openpyxl # 第三方库,以官网最新稳定版为准
from openpyxl import Workbook, load_workbook
# 写:新建一个工作簿,往单元格塞数据
wb = Workbook()
ws = wb.active
ws["A1"] = "姓名"; ws["B1"] = "成绩"
ws.append(["小明", 95])
ws.append(["小红", 88])
wb.save("students.xlsx")
# 读:把它读回来
wb2 = load_workbook("students.xlsx")
ws2 = wb2.active
for row in ws2.iter_rows(values_only=True):
print(row) # ('姓名', '成绩') / ('小明', 95) / ('小红', 88)
pickle:把整个 Python 对象原样存进文件
import pickle
data = {"nums": [1, 2, 3], "name": "测试"}
# 序列化:对象 -> 字节,写文件
with open("data.pkl", "wb") as f: # 注意二进制模式 wb
pickle.dump(data, f)
# 反序列化:字节 -> 原对象
with open("data.pkl", "rb") as f: # 注意 rb
again = pickle.load(f)
print(again) # {'nums': [1, 2, 3], 'name': '测试'}
应用场景:openpyxl 用于给运营/财务出报表;pickle 用于把训练好的模型、缓存的中间结果在自己的程序间快速存取。
防坑:pickle 千万别加载不信任的文件
pickle 反序列化时会执行里面的代码——加载别人发来的 .pkl 等于执行他的程序,可植入木马。所以:① 只 pickle 自己生成的数据;② 跨语言、跨版本传数据用 JSON,别用 pickle;③ 长期存档也别选 pickle(Python 大版本升级后旧文件可能读不回)。
练习:格式怎么选(点开对答案)
问:要存一个包含 Python 自定义对象的列表,给"自己下次跑脚本"用,选 JSON 还是 pickle?
答:pickle。JSON 只能存 dict/list/str/数字/布尔/None,存不了自定义类实例;pickle 能原样存,但记住只在自己机器上、自己生成的文件之间用。
pathlib:比 os.path 舒服
from pathlib import Path
p = Path("docs") / "report" / "2026.txt" # 用 / 拼路径,跨平台
print(p.exists()) # False
print(p.suffix) # .txt
print(p.name) # 2026.txt
print(p.parent) # docs/report
# 找所有 .py 文件
for f in Path(".").glob("**/*.py"):
print(f)