Python标准库用起来很方便,但这些坑你踩过吗?

很多人学Python,一上来就猛敲 import,随手调个 datetimeosjson,觉得“标准嘛,肯定稳得很”。结果上线后突然报错:时间差了8小时、文件路径在Windows上好使,在Linux上直接打不开、JSON里中文变乱码……其实不是代码写错了,是没留意标准库的几个关键细节。

时区问题,别只靠 datetime.now()

datetime.now() 返回的是本地时区时间,但本地时区不等于系统默认时区,更不等于你期望的东八区。服务器常设为 UTC,一执行就比北京时间慢8小时。想稳妥,得显式指定时区:

from datetime import datetime
import pytz

# 推荐写法
beijing = pytz.timezone('Asia/Shanghai')
now = datetime.now(beijing)

如果不想引入第三方库,Python 3.9+ 可用 zoneinfo(也是标准库),但注意 Windows 用户得额外装 tzdata 包,否则找不到时区数据。

os.path 拼路径,别手写斜杠

有人写:os.path.join('data', 'user', 'info.txt') 很规范;但有人图省事:'data/user/info.txt',在 macOS 和 Linux 上没问题,一到 Windows 就报错——因为 Windows 认 \/,但某些老脚本或配置解析器会把单斜杠当转义符处理。更隐蔽的是:os.path.join('a/', 'b') 结果是 a/b,但 os.path.join('a/', '/b') 会直接忽略前面的路径,变成 /b(因为遇到绝对路径就重来)。所以拼路径务必统一用 join,且避免开头带 / 的字符串混入。

json.dumps() 默认不支持中文?其实是编码误会

运行:json.dumps({'姓名': '张三'}),输出可能是 {"\u59d3\u540d": "\u5f20\u4e09"}。这不是bug,是默认开启 ensure_ascii=True。日常打印或调试时看着难受,加个参数就行:

import json
data = {'姓名': '张三'}
print(json.dumps(data, ensure_ascii=False)) # 输出:{"姓名": "张三"}

但要注意:如果后续要写入文件,还得配对指定 encoding='utf-8',否则在 Windows 控制台可能显示异常。

别把 random 当真随机,尤其做验证码或抽奖

random.randint()random.choice() 用的是伪随机数生成器(Mersenne Twister),适合模拟、游戏、测试,但不适用于密码学场景。比如生成API密钥、重置令牌、抽奖后台逻辑——这时该用 secrets 模块(Python 3.6+ 标准库):

import secrets

# 安全的随机字符串
token = secrets.token_urlsafe(16) # 如 'DvGy...zXq'

它背后调用的是操作系统级的随机源(/dev/urandom 或 CryptGenRandom),抗预测、防碰撞。

最后提醒一句:不是所有“标准库”都自带

pathlibdataclasseszoneinfo 这些,虽然现在算标准库,但分别从 Python 3.4、3.7、3.9 才开始内置。如果你的项目还要兼容旧版本,得先查文档,别写完才发现用户一运行就报 ModuleNotFoundError