10. 标准库简介
os/shutil、glob、argparse、re、datetime、json、urllib、timeit 等「脚本常用」模块速查,并标明生产环境更常见的第三方替代。
10.1 速查心智图
| 你要做 | 先用标准库 | 常见升级 |
|---|---|---|
| 路径与文件 | pathlib + shutil | 云存储 SDK |
| CLI 参数 | argparse | click / typer |
| HTTP | urllib | httpx / requests |
| 定时/日期 | datetime | zoneinfo(3.9+) |
| 表格 | csv | pandas |
10.2 操作系统接口:os / shutil
os:进程、环境变量;路径优先pathlib。- 不要
from os import *:会盖住内置open。
from pathlib import Path
import shutil
src = Path("src.txt")
dst = Path("demo") / "readme.txt"
dst.parent.mkdir(parents=True, exist_ok=True)
shutil.copyfile(src, dst)
print(Path.cwd()) # WindowsPath('C:\\...') 或 PosixPath('/...')(当前工作目录,环境相关)10.3 通配符:glob
import glob
from pathlib import Path
print(glob.glob("*.py")) # ['main.py', ...](取决于当前目录下有哪些 .py)
print([p.name for p in Path(".").rglob("*.py")]) # 递归文件名列表,同上依目录而定10.4 CLI 参数:argparse
import argparse
parser = argparse.ArgumentParser(description="打印文件前 N 行")
parser.add_argument("files", nargs="+")
parser.add_argument("-n", "--lines", type=int, default=10)
args = parser.parse_args()
print(args.files, args.lines) # ['a.txt', 'b.txt'] 10(示例:传给 files 的路径列表与 -n/--lines)10.5 标准流与退出:sys
import sys
print("正常信息") # 正常信息
print("告警:磁盘将满", file=sys.stderr) # 告警:磁盘将满(写到 stderr)
sys.exit(1) # 退出码非 0,shell/CI 会当作失败10.6 正则:re
import re
print(re.findall(r"\bf[a-z]*", "foot fell fastest")) # ['foot', 'fell', 'fastest']
print(re.sub(r"(\b[a-z]+) \1", r"\1", "the the cat")) # the cat
"tea for too".replace("too", "two")10.7 数学 / 随机 / 统计
import math
import random
import statistics
print(math.hypot(3, 4)) # 5.0
print(random.sample(range(100), k=5)) # [72, 15, ...](5 个不重复整数,每次运行不同)
print(statistics.median([1, 3, 5, 7])) # 410.8 极简 HTTP:urllib
from urllib.request import urlopen
with urlopen("https://example.com", timeout=5) as resp:
snippet = resp.read(256)
print(snippet[:64]) # b'<!doctype html>\n<html lang="en">\n<head>\n...'(示例网首页片段)Cookie、重试、连接池:换
httpx/requests。
10.9 日期时间:datetime
from datetime import date, datetime, timedelta, timezone
today = date.today()
print(today.strftime("%Y-%m-%d")) # 2026-05-10(当天日期,随运行日变化)
utc_now = datetime.now(timezone.utc)
print(utc_now.isoformat()) # 2026-05-10T12:34:56.789012+00:00(示例;含微秒与时区)
print(today - timedelta(days=7)) # 2026-05-03(相对 today 减 7 天)10.10 压缩:zlib
import zlib
payload = b"hello python hello world"
compressed = zlib.compress(payload)
assert zlib.decompress(compressed) == payload10.11 微基准:timeit
from timeit import timeit
print(timeit("t=a; a=b; b=t", "a=1; b=2")) # 0.05…(总秒数;默认 number=1_000_000,依 CPU)
print(timeit("a,b = b,a", "a=1; b=2")) # 与上一行同量级浮点数(对比两行快慢)10.12 测试:doctest / unittest
def avg(xs: list[float]) -> float:
"""Return average.
>>> avg([1, 2, 3])
2.0
"""
return sum(xs) / len(xs)
if __name__ == "__main__":
import doctest
doctest.testmod()10.13 数据交换:json / csv / sqlite3
import csv
import io
buf = io.StringIO("name,score\nada,100\n")
reader = csv.DictReader(buf)
print(list(reader)) # [{'name': 'ada', 'score': '100'}]10.14 学习顺序建议
pathlib→ 少写字符串路径拼接。argparse+if __name__ == "__main__"→ 可发布 CLI。datetime+json+re→ 日常胶水三件套。