08 标准库核心
大约 3 分钟编程语言Python标准库SRE自动化
08 标准库核心
标准库是 Python 的默认供应链。能用标准库稳定完成的通用任务,通常比引入新依赖更适合长期维护。
1. 标准库地图
| 领域 | 常用模块 |
|---|---|
| 路径与文件 | pathlib、os、shutil、tempfile、filecmp |
| 数据格式 | json、csv、configparser、tomllib、sqlite3 |
| 时间 | datetime、zoneinfo、time、calendar |
| 文本处理 | re、string、textwrap、difflib |
| 集合与迭代 | collections、itertools、functools、heapq |
| 命令行 | argparse、getpass、shlex |
| 子进程 | subprocess、signal |
| 网络 | urllib、socket、ssl、http、ipaddress |
| 加密与随机 | hashlib、hmac、secrets、ssl |
| 并发 | threading、multiprocessing、concurrent.futures、asyncio |
| 测试 | unittest、doctest |
| 调试与性能 | traceback、logging、timeit、cProfile、tracemalloc |
| 类型与数据 | typing、dataclasses、enum、collections.abc |
完整模块索引见官方 Python Standard Library。
2. 路径和文件
from pathlib import Path
root = Path("/var/log/app")
for path in sorted(root.glob("*.log")):
if path.is_file():
print(path.name, path.stat().st_size)路径拼接使用 / 运算符即可,不依赖 Windows 或 Linux 的字符串分隔符。删除文件前先解析绝对路径并检查是否位于允许目录。
3. argparse
import argparse
from pathlib import Path
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description="Count non-empty lines.")
parser.add_argument("path", type=Path)
parser.add_argument("--encoding", default="utf-8")
return parser
args = build_parser().parse_args()
print(args.path, args.encoding)CLI 参数应尽早转换成强类型对象,后续逻辑不要继续处理原始字符串。
4. subprocess
import subprocess
completed = subprocess.run(
["python", "--version"],
check=True,
capture_output=True,
text=True,
)
print(completed.stdout.strip() or completed.stderr.strip())要点:
- 优先传参数列表,不用
shell=True拼接用户输入。 - 使用
check=True让非零退出码显式失败。 - 明确超时,避免子进程永久挂起。
- 输出可能很大时不要无限缓存在内存。
- 环境变量和当前目录要显式控制。
5. JSON、CSV、TOML 与 SQLite
import json
from pathlib import Path
payload = {"service": "api", "healthy": True}
path = Path("status.json")
path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
loaded = json.loads(path.read_text(encoding="utf-8"))
print(loaded["service"])标准库中:
json读取 JSON。csv支持 CSV 方言和流式读写。tomllib只读 TOML;Python 3.11 起可用。sqlite3提供嵌入式关系数据库,适合单机状态、小型工具和测试。
6. 时间与时区
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
utc_now = datetime.now(timezone.utc)
shanghai_now = utc_now.astimezone(ZoneInfo("Asia/Shanghai"))
print(utc_now.isoformat())
print(shanghai_now.isoformat())存储和传输优先使用带时区的 UTC;展示时再转换为本地时区。不要使用会随本地环境变化的无时区时间做跨系统比较。
7. 哈希、随机与密码
import hashlib
import secrets
digest = hashlib.sha256(b"payload").hexdigest()
token = secrets.token_urlsafe(32)
print(digest)
print(token)random 不适用于安全令牌;密码、验证码、会话令牌使用 secrets。密码存储使用专门的强密码哈希算法和参数,不要直接使用 SHA-256。
8. IP 与网络
from ipaddress import ip_address, ip_network
address = ip_address("10.20.30.40")
network = ip_network("10.20.0.0/16")
print(address in network)ipaddress 适合网段判断和规范化。HTTP 请求优先使用组织允许的客户端库;标准库 urllib 足以处理简单任务,但要自行处理重试、代理、证书和连接池边界。
9. 选择标准库的判断
优先标准库:
- 需求简单、接口稳定。
- 部署环境严格限制额外依赖。
- 只需要基础 JSON、日志、CLI、路径、进程和并发能力。
考虑第三方库:
- 需要复杂 HTTP 连接池、重试和认证。
- 需要高性能 DataFrame、科学计算或专用协议。
- 标准库接口会导致大量重复代码和高维护成本。
