第 9 章 · 标准库:os / json / datetime / re
本章目标:使用 os 与 pathlib 操作路径与环境变量;用 json 读写配置与 API 数据;掌握 datetime 日期时间计算与格式化;用 re 做日志与文本提取;完成 shop-demo 配置 JSON 与访问日志解析练习。
学时建议:4~5 小时(含 1.5 小时跟练)
前置:ch08 文件与异常。
9.1 os 模块
import os
from pathlib import Path
print(os.getcwd()) # 当前工作目录
# os.chdir("/tmp") # 切换目录(慎用)
env = os.environ.get("USER", "user-demo")
print(env)
data_dir = Path(os.path.expanduser("~/python-learn/shop-demo"))
data_dir.mkdir(parents=True, exist_ok=True)
for name in os.listdir(data_dir):
print(name)
| 函数/属性 | 说明 |
|---|
os.getcwd() | 当前目录 |
os.environ | 环境变量字典 |
os.path.join(a, b) | 拼接路径(旧式,推荐 pathlib) |
os.listdir(path) | 列出目录项 |
os.rename(src, dst) | 重命名 |
# 遍历目录树
for root, dirs, files in os.walk(data_dir):
for fname in files:
if fname.endswith(".log"):
print(Path(root) / fname)
9.2 json 模块
import json
from pathlib import Path
config = {
"shop": "shop-demo",
"currency": "CNY",
"members": ["user-demo", "guest-001"],
"tax_rate": 0.06,
}
path = Path("config.json")
path.write_text(
json.dumps(config, ensure_ascii=False, indent=2),
encoding="utf-8",
)
loaded = json.loads(path.read_text(encoding="utf-8"))
print(loaded["shop"])
| 函数 | 作用 |
|---|
json.dumps(obj) | Python → 字符串 |
json.loads(s) | 字符串 → Python |
json.dump / json.load | 与文件对象配合 |
类型对应
| Python | JSON |
|---|
| dict | object |
| list | array |
| str | string |
| int/float | number |
| True/False | true/false |
| None | null |
# datetime 等需自定义序列化(选修)
def default(o):
if isinstance(o, datetime):
return o.isoformat()
raise TypeError
9.3 datetime 模块
from datetime import datetime, date, timedelta, timezone
now = datetime.now()
today = date.today()
print(now.strftime("%Y-%m-%d %H:%M:%S"))
parsed = datetime.strptime("2026-08-19 10:30:00", "%Y-%m-%d %H:%M:%S")
deadline = parsed + timedelta(days=7)
delta = deadline - now
print(delta.days)
| 类型 | 用途 |
|---|
date | 年月日 |
time | 时分秒 |
datetime | 日期+时间 |
timedelta | 时间差 |
常用格式码
| 码 | 含义 |
|---|
%Y | 四位年 |
%m | 月 |
%d | 日 |
%H | 时(24h) |
%M | 分 |
%S | 秒 |
# UTC 时间(接口常见)
utc_now = datetime.now(timezone.utc)
9.4 re 正则表达式
import re
log = "2026-08-19 10:32:01 GET /api/books status=200 ms=45"
pattern = r"(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*status=(\d+).*ms=(\d+)"
m = re.search(pattern, log)
if m:
ts, status, ms = m.groups()
print(ts, status, ms)
| 函数 | 说明 |
|---|
re.search | 首个匹配 |
re.findall | 所有非重叠匹配 |
re.sub | 替换 |
re.compile | 预编译,重复用 |