第 8 章 · 文件与异常
本章目标:掌握 open() 读写文本与二进制文件;熟练使用 with 上下文管理器;理解 try/except/else/finally;能处理 shop-demo 订单日志与配置文件;了解路径拼接用 pathlib(与 ch09 os 互补)。
学时建议:3~4 小时(含 1 小时跟练)
前置:ch05 函数;建议已完成 ch04 数据结构。
8.1 打开与关闭文件
# 不推荐:需手动 close
f = open("notes.txt", "w", encoding="utf-8")
f.write("第一行\n")
f.close()
# 推荐:with 自动关闭
with open("notes.txt", "a", encoding="utf-8") as f:
f.write("追加一行\n")
| 模式 | 说明 |
|---|---|
r | 只读(默认) |
w | 写入,清空原文件 |
a | 追加 |
x | 新建,已存在则失败 |
b | 二进制,如 rb、wb |
+ | 读写,如 r+ |
文本文件务必指定 encoding="utf-8",避免 Windows 默认编码问题。
8.2 读取方式
with open("catalog.txt", "r", encoding="utf-8") as f:
content = f.read() # 整个文件字符串
with open("catalog.txt", "r", encoding="utf-8") as f:
lines = f.readlines() # 列表,每行含 \n
with open("catalog.txt", "r", encoding="utf-8") as f:
for line in f: # 大文件推荐,省内存
print(line.strip())
| 方法 | 适用 |
|---|---|
read() | 小文件 |
readline() | 逐行 |
迭代 for line in f | 大文件 |
8.3 写入与换行
rows = [
"sku,title,price",
"BK-001,Python 基础,59.9",
"BK-002,Web 开发,79.0",
]
with open("products.csv", "w", encoding="utf-8", newline="") as f:
f.write("\n".join(rows) + "\n")
Windows 写 CSV 时 newline="" 可避免多余空行(配合 csv 模块更佳,见 ch11)。
8.4 pathlib 路径(推荐)
from pathlib import Path
base = Path.home() / "python-learn" / "shop-demo"
base.mkdir(parents=True, exist_ok=True)
log_file = base / "logs" / "order.log"
log_file.parent.mkdir(parents=True, exist_ok=True)
if log_file.exists():
text = log_file.read_text(encoding="utf-8")
| 操作 | pathlib |
|---|---|
| 拼接 | Path("a") / "b" |
| 存在 | .exists() |
| 读文本 | .read_text(encoding="utf-8") |
| 写文本 | .write_text(s, encoding="utf-8") |
8.5 异常体系
try:
price = float(user_input)
except ValueError:
print("请输入合法数字")
except Exception as e:
print("未知错误", e)
else:
print("转换成功", price)
finally:
print("清理资源(可选)")
| 子句 | 执行时机 |
|---|---|
try | 可能出错的代码 |
except | 捕获指定异常 |
else | try 无异常时 |
finally | 无论如何都执行 |
常见内置异常
| 异常 | 典型原因 |
|---|---|
ValueError | 值不合法 |
TypeError | 类型不对 |
FileNotFoundError | 文件不存在 |
KeyError / IndexError | 键/下标 |
ZeroDivisionError | 除零 |
try:
n = int("abc")
except ValueError as err:
print(repr(err))