1. 标准库是什么? #
- 标准库是随 Python 安装自带的模块集合,无需
pip install 即可 import 使用。
- 由 CPython 官方维护,底层多经过优化,是日常开发和全栈项目的基础设施。
- 与第三方库(如
requests、Django)不同:标准库稳定、版本随 Python 绑定。
- 适合处理时间、JSON、环境变量、日志、正则等「语言级」通用能力。
- 业务框架会在此基础上再封装一层,但读懂标准库有助于排查问题和写脚本。
- 下面按项目使用频率整理最常用模块;其余(
math、itertools 等)用到再查 官方文档 即可。
| 模块 |
项目用途 |
datetime |
时间创建、格式化、加减 |
json |
配置、API 序列化 |
os / sys |
getenv、命令行参数、sys.exit |
logging |
生产日志(替代 print) |
collections |
Counter 计数、defaultdict 分组 |
re |
手机号、邮箱等格式校验 |
functools |
lru_cache、wraps |
typing |
类型注解(IDE 提示) |
secrets / uuid |
token、唯一 ID |
random |
仅测试数据(不能用于密码/token) |
2. datetime #
- 处理日期与时间的标准模块。
- 项目里常用于:订单创建时间、接口返回的时间戳、计算「7 天后到期」、日志里的时间格式等。
datetime:日期 + 时间(年月日时分秒)。
timedelta:时间差,用于加减天数、小时。
timezone:时区;存数据库、对外 API 建议统一用 UTC。
strftime 把对象格式化成字符串(展示、写日志);strptime 把字符串解析成对象(读配置、解析用户输入)。
datetime 对象不能直接 json.dumps,需先转成 ISO 格式字符串。
from datetime import datetime, timedelta, timezone
now = datetime.now()
dt = datetime.strptime("2025-05-21", "%Y-%m-%d")
now.strftime("%Y-%m-%d %H:%M:%S")
deadline = now + timedelta(days=7)
utc = datetime.now(timezone.utc)
3. json #
- JSON 是前后端、配置文件、NoSQL 缓存中最常见的数据交换格式。
json 模块负责 Python 对象与 JSON 字符串/文件之间的互转。
dumps / loads:对象 ↔ 字符串,用于 API 响应体、Redis 存字符串。
dump / load:对象 ↔ 文件,用于读写 config.json。
ensure_ascii=False 可让中文正常显示而非 \uXXXX。
datetime、自定义类不能直接序列化,需先转成字符串或实现自定义编码器。
| 函数 |
方向 |
典型场景 |
dumps / loads |
对象 ↔ 字符串 |
API 响应体、Redis 存字符串 |
dump / load |
对象 ↔ 文件 |
读写 config.json |
import json
obj = {"name": "小明", "age": 18}
json_str = json.dumps(obj, ensure_ascii=False)
print(json_str)
s = '{"name": "小明", "age": 18}'
py_obj = json.loads(s)
print(py_obj)
with open("config.json", encoding="utf-8") as f:
config = json.load(f)
print(config)
4. os、sys、logging #
- 这一组模块解决三类「运行环境」问题:读配置、控制进程、记录日志。
os:与操作系统交互,项目里最常用 os.getenv() 读取环境变量(数据库 URL、API Key),配合 .env 文件,避免密钥写进代码仓库。
sys:sys.argv 获取命令行参数(脚本工具);sys.exit(1) 异常退出;Web 项目里较少直接操作。
logging:生产环境替代 print 做日志;可按级别(INFO、ERROR)过滤,可输出到文件。
- 框架(Django、FastAPI)通常会接管 logging 配置,业务代码用
logger = logging.getLogger(__name__) 即可。
- 目录与路径操作优先用
pathlib(见文件路径章节),不要用 os.system() 执行 shell 命令(有安全风险)。
import os, sys, logging
os.getenv("DATABASE_URL", "")
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info("ok")
logger.error("fail", exc_info=True)
5. collections #
collections 在标准 dict、list 之外提供了几种更省事的容器。
- 项目里最高频的是
Counter 和 defaultdict。
Counter:自动统计元素出现次数,适合词频、标签统计、简单数据分析。
defaultdict:访问不存在的键时自动创建默认值(如空列表),按某字段分组时不必先判断 if key not in groups。
from collections import Counter, defaultdict
Counter(["a", "b", "a"])
groups = defaultdict(list)
users = [{"name": "Alice", "city": "Beijing"}, {"name": "Bob", "city": "Shanghai"}, {"name": "Charlie", "city": "Beijing"}]
for u in users:
groups[u["city"]].append(u)
print(groups)
6. re #
- 正则表达式用于按模式匹配、查找、替换字符串。
- 项目里适合:手机号格式、邮箱格式、日志清洗(合并多余空格)等简单规则。
re.match:从字符串开头匹配(适合校验整串是否符合格式)。
re.search:在字符串任意位置搜索第一个匹配。
re.sub:按模式替换。
- 复杂表单校验、API 入参验证优先用框架自带验证(如 Pydantic、DRF Serializer)。
- 不要用正则解析 HTML 或 JSON(易错且难维护)。
import re
phone = "13812345678"
email = "test@example.com"
text = "这是 一个 有 多个空白 的文本。"
match_result = re.match(r"^\d{11}$", phone)
if match_result:
print(f"手机号匹配成功: {match_result.group()}")
else:
print("手机号匹配失败")
search_result = re.search(r"@\w+", email)
if search_result:
print(f"邮箱@及后续: {search_result.group()}")
else:
print("未找到邮箱@及后续字符串")
replaced_text = re.sub(r"\s+", " ", text)
print(f"替换空白后的文本: {replaced_text}")
7. functools #
functools 提供函数相关的高级工具。
@lru_cache:缓存函数返回值,相同参数再次调用时直接返回缓存结果;适合读配置、计算代价高的纯函数;参数须可哈希,缓存有上限 maxsize。
@wraps:写装饰器时保留被包装函数的 __name__ 和 __doc__,否则调试和文档会显示成 wrapper。
- 装饰器本身(
@require_login 等)在 Web 框架中大量使用,理解 functools.wraps 有助于自己写简单装饰器。
import functools
@functools.lru_cache(maxsize=128)
def load_config(key: str):
"""
根据给定的 key 加载配置,如果已缓存则直接返回缓存内容。
参数:
key (str): 配置项的键名。
返回:
配置的值(这里只是示例,实际应从配置文件或数据库加载)。
"""
config_dict = {
'database_url': 'mysql://user:pass@localhost/db',
'timeout': 30,
'retry': 3,
}
return config_dict.get(key, None)
def my_decorator(func):
"""
一个自定义装饰器示例,装饰任意函数并输出调用信息。
"""
@functools.wraps(func)
def wrapper(*args, **kwargs):
"""
包装函数,调用原始函数并可在调用前后添加自定义逻辑。
"""
print(f'即将调用函数 {func.__name__},参数为: args={args}, kwargs={kwargs}')
result = func(*args, **kwargs)
print(f'函数 {func.__name__} 调用完毕,结果为: {result}')
return result
return wrapper
8. typing #
- 类型注解不改变运行时行为,但能让 IDE 做补全和检查,团队协作时减少传参错误。
- Python 3.10+ 可用
dict | None 代替 Optional[dict]。
- 全栈项目里:函数参数、返回值、Pydantic/FastAPI 模型都会用到;ORM 模型字段也有类型。
- 注解是建议而非强制,未安装类型检查器时错误类型仍可能运行通过。
def get_user(id: int) -> dict | None: ...
def names(users: list[dict]) -> list[str]: ...
9. 安全与 ID #
- 生成不可预测 token 和全局唯一 ID 时,必须用密码学安全的模块,不能用
random。
secrets:生成会话 token、密码重置链接、CSRF token 等;token_urlsafe(32) 生成 URL 安全的随机字符串。
uuid:生成业务主键、订单号、文件名等唯一标识;uuid4() 基于随机数,碰撞概率极低。
- 密码存储必须用 bcrypt / argon2 等专用库加盐哈希,不要用
random、hashlib.md5 或自己拼方案。
import secrets, uuid
print(secrets.token_urlsafe(32))
print(str(uuid.uuid4()))
10. 项目开发要点 #
- 密钥与连接串:
os.getenv + .env,禁止写进仓库。
- 接口时间字段:统一 UTC 或 ISO 8601 字符串,避免各端时区混乱。
- 线上日志:用
logging,本地调试可用 print。
- 统计与分组:
Counter、defaultdict 比手写循环更清晰。
- 安全随机:token 用
secrets;业务 ID 用 uuid;密码用专业哈希库。
11. 总结 #
- 标准库不必全部背下来,掌握本文中的高频模块即可覆盖大部分脚本与后端日常需求。
- 遇到新场景时,先查 官方标准库索引,再考虑是否引入第三方库。