Python 中如何生成随机字符串(大写字母+数字)?
Python 生成随机字符串:random.choices(string.ascii_uppercase + string.digits, k=n);安全场景用 secrets 模块。本文介绍各种字符集组合与安全注意事项。
核心代码:''.join(random.choices(string.ascii_uppercase + string.digits, k=n))。涉及安全(令牌/密码)的场景改用 secrets 模块。
基本生成函数
import random
import string
def generate_random_string(n):
chars = string.ascii_uppercase + string.digits # A-Z + 0-9
return ''.join(random.choices(chars, k=n))
print(generate_random_string(10)) # 如 'K3M9X2Q7PL'
string 模块的字符集
string.ascii_uppercase # 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
string.ascii_lowercase # 'abcdefghijklmnopqrstuvwxyz'
string.ascii_letters # 大小写都有
string.digits # '0123456789'
string.hexdigits # '0123456789abcdefABCDEF'
string.punctuation # 标点符号
自由组合:string.ascii_letters + string.digits + '!@#'。
安全场景:secrets 模块
生成密码、API Key、令牌时必须用 secrets(密码学安全随机源):
import secrets
import string
def secure_token(n):
chars = string.ascii_letters + string.digits
return ''.join(secrets.choice(chars) for _ in range(n))
# 或直接生成 URL 安全令牌
secrets.token_urlsafe(32)
其他常用形式
import uuid
str(uuid.uuid4()) # '550e8400-e29b-41d4-a716-446655440000'
uuid.uuid4().hex # 无横线 32 位
secrets.token_hex(16) # 16 字节十六进制
常见问题(FAQ)
Q:如何排除易混淆字符(0/O、1/l/I)?
A:自定义字符集剔除即可:chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'。
Q:random 和 secrets 有什么区别?
A:random 是伪随机(Mersenne Twister),可预测,不适合安全用途;secrets 用操作系统提供的加密级随机源。
Q:要求至少包含一个数字怎么办?
A:生成后检查,不满足就重新生成;或先随机放一个数字再填充其余位置后 shuffle。