Python 三大高频标准库实战指南——json · datetime · random 深度解析
一、前言
在日常脚本、Web、数据乃至运维开发中,json、datetime、random 是最常被 import 的三大标准库。它们看似简单,却隐藏着大量“坑”与“甜点”。本文用 20+ 段可直接运行的代码,带你从“能用”到“用好”。
二、json:结构化数据的高速公路
2.1 最常用 4 个 API
import jsondata = {"name": "Ada", "ts": 1650996631, "vip": True}# 序列化
s = json.dumps(data, ensure_ascii=False, indent=2) # 中文不乱码,缩进 2
print(s)# 反序列化
obj = json.loads(s)
print(obj["name"])# 直接落盘
with open("user.json", "w", encoding="utf-8") as f:json.dump(data, f, ensure_ascii=False, indent=2)# 从文件读回
with open("user.json") as f:obj2 = json.load(f)
2.2 自定义序列化:让 datetime、Decimal 也听话
from datetime import datetime
from decimal import Decimalclass MyEncoder(json.JSONEncoder):def default(self, o):if isinstance(o, datetime):return o.isoformat(sep=" ", timespec="seconds")if isinstance(o, Decimal):return float(o)return super().default(o)now = datetime.now()
money = Decimal("99.90")
record = {"at": now, "amount": money}print(json.dumps(record, cls=MyEncoder))
# {"at": "2025-07-12 21:30:00", "amount": 99.9}
2.3 高性能场景:orjson 的极速体验
pip install orjson
import orjson, datetime, decimalorjson.dumps({"at": datetime.datetime.now()},option=orjson.OPT_NAIVE_UTC | orjson.OPT_SERIALIZE_NUMPY
)
单核序列化速度是标准库 4-7 倍,反序列化 2-3 倍;内存零拷贝,适合日志、RPC。
三、datetime:时间处理的瑞士军刀
3.1 核心对象速记
date:只有年月日,常用
date.today()
获取今天。time:只有时分秒微秒,常用
time.isoformat()
转成字符串。datetime:既有日期又有时间,
datetime.now()
拿当前时间,timestamp()
转时间戳。timedelta:表示时间差,可用
days=
、seconds=
构造,再total_seconds()
取总秒数。timezone:时区对象,
timezone.utc
是 UTC 固定实例。tzinfo:抽象基类,第三方库如 pytz 用它来扩展时区信息。
3.2 本地时间与 UTC 互转
from datetime import datetime, timezone, timedelta# 本地 -> UTC
local = datetime.now() # naive
utc_time = local.astimezone(timezone.utc)
print(utc_time)# UTC -> 东八区
cn = utc_time.astimezone(timezone(timedelta(hours=8)))
print(cn.strftime("%Y-%m-%d %H:%M:%S %Z"))
3.3 解析字符串:strptime vs dateutil
# 标准库
dt = datetime.strptime("2025-07-12 21:30:00", "%Y-%m-%d %H:%M:%S")# 更智能(pip install python-dateutil)
from dateutil.parser import parse
dt2 = parse("2025-07-12 21:30") # 自动推断格式
3.4 时间运算与区间
from datetime import timedeltadeadline = dt + timedelta(days=3, hours=-1)
diff = deadline - datetime.now()
print(f"距离 DDL 还剩 {diff.total_seconds()/3600:.1f} 小时")
3.5 第三方神器:arrow / pendulum
import arrow
arrow.now().shift(days=-1).format("YYYY-MM-DD HH:mm:ss ZZ")
四、random:随机数的正确姿势
4.1 随机值速查表
import randomrandom.random() # 0.0~1.0 浮点
random.randint(1, 10) # 1~10 含端点
random.choice("ABCD") # 单元素
random.choices("ABC", k=3, weights=[1,1,2]) # 带权重
random.sample(range(100), 5) # 不重复抽样
4.2 设置种子:复现实验
random.seed(42)
print([random.randint(0, 9) for _ in range(5)]) # 每次运行结果一致
4.3 生成安全随机数(密码、token)
import secrets, stringalphabet = string.ascii_letters + string.digits
pwd = ''.join(secrets.choice(alphabet) for _ in range(16))
print(pwd)
secrets
模块基于系统熵源,适合生成密码、重置令牌。
4.4 随机打乱 & 概率分布
deck = list(range(52))
random.shuffle(deck)# 高斯分布
random.gauss(mu=0, sigma=1)
五、三大模块协作实战:一个抽奖系统
需求:
从 user.json 读取用户列表(含注册时间)。
过滤 30 天内注册的新用户。
随机抽出 3 名幸运用户,发奖券。
把中奖记录保存为 JSON,带上 UTC 时间戳。
import json, random, datetime as dt
from dateutil import parser as dtparse# 1. 读取用户
with open("user.json", encoding="utf-8") as f:users = json.load(f)# 2. 过滤 30 天内注册
cutoff = dt.datetime.now(dt.timezone.utc) - dt.timedelta(days=30)
new_users = [u for u in users if dtparse.parse(u["reg_time"]) > cutoff]# 3. 随机抽奖
lucky = random.sample(new_users, k=min(3, len(new_users)))# 4. 保存结果
result = {"draw_at": dt.datetime.now(dt.timezone.utc).isoformat(),"winners": lucky
}with open("lottery_result.json", "w", encoding="utf-8") as f:json.dump(result, f, ensure_ascii=False, indent=2)
六、性能 & 工程化 Tips
如果一次性要处理上百兆的 JSON,用 ijson
流式解析,Web 场景直接上 orjson
。
存时间时永远存 UTC,展示层再做本地化,避免 naive 对象带来的时区灾难。
多进程或协程里不要共享同一个 random.Random()
实例,否则会出现重复随机数;可以给每个进程独立 seed,或改用 NumPy 的 Generator
。
写单元测试时,用 freezegun
把当前时间冻结到指定时刻,再用 faker
生成大量假数据,既稳定又高效。
七、结语
掌握 json、datetime、random
的“常规 API + 高阶技巧 + 周边生态”,就能覆盖 80% 的脚本需求。把它们组合起来,你可以轻松写出日志收集器、配置中心、抽奖活动、压测脚本……
希望本文能成为你的“小抄”,也欢迎留言分享实战案例!