当前位置: 首页 > news >正文

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)

五、三大模块协作实战:一个抽奖系统

需求:

  1. 从 user.json 读取用户列表(含注册时间)。

  2. 过滤 30 天内注册的新用户。

  3. 随机抽出 3 名幸运用户,发奖券。

  4. 把中奖记录保存为 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% 的脚本需求。把它们组合起来,你可以轻松写出日志收集器、配置中心、抽奖活动、压测脚本……
希望本文能成为你的“小抄”,也欢迎留言分享实战案例!

http://www.lryc.cn/news/586025.html

相关文章:

  • FastGPT革命:下一代语言模型的极速进化
  • 淘宝商品评论API接口操作详解
  • MCP选型指南:AWS vs Azure vs GCP vs 国内云厂商深度对比
  • 基于 Python 的数据分析技术综述
  • 自动化运维工具jenkins问题
  • 集成语音感知与云平台的多任务智能楼宇控制系统
  • 详解缓存淘汰策略:LRU
  • Go语言生态成熟度分析:为何Go还无法像Java那样实现注解式框架?
  • Markdown语法的基础学习
  • 管理端口: 一个简单的锤子架子
  • Linux->基础IO
  • 【深度学习】 1 Deep Learning
  • 【Elasticsearch】昂贵算法与廉价算法
  • 四、深度学习——CNN
  • 【SpringAI】7. 基于 milvus 的向量检索
  • Pandas-数据查看与质量检查
  • 华为 GaussDB :技术特性、应用局限与市场争议
  • TensorFlow2 study notes[2]
  • 【嵌入式硬件实例】-555定时器实现倍压电路
  • 【408考研知识点全面讲解计算机学科专业基础综合(408)】——数据结构之排序
  • 依赖注入的逻辑基于Java语言
  • 【第五节】部署http接口到ubuntu server上的docker内
  • Eplan API Scripts
  • Transforms
  • Spring Boot 整合 OAuth2 详细教程(适用于 2025 年 Spring Boot 3.x)
  • 力扣-19. 删除链表的倒数第N个节点
  • 什么是 Bootloader?怎么把它移植到 STM32 上?
  • 【6.1.3 漫画分布式锁】
  • 线程属性设置全攻略
  • 14. 请谈一下浏览器的强缓存和协商缓存