楼层: 首页/ 软件技术/ Python 基础/ 文件与 IO
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)