Python 中如何生成随机字符串(大写字母+数字)?

Python 生成随机字符串:random.choices(string.ascii_uppercase + string.digits, k=n);安全场景用 secrets 模块。本文介绍各种字符集组合与安全注意事项。

最佳实践
Python 中如何生成随机字符串(大写字母+数字)?封面

核心代码:''.join(random.choices(string.ascii_uppercase + string.digits, k=n))。涉及安全(令牌/密码)的场景改用 secrets 模块。

基本生成函数

import random
import string

def generate_random_string(n):
    if not isinstance(n, int) or isinstance(n, bool) or n < 0:
        raise ValueError('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):
    if not isinstance(n, int) or isinstance(n, bool) or n <= 0:
        raise ValueError('安全令牌长度必须为正整数')
    chars = string.ascii_letters + string.digits
    return ''.join(secrets.choice(chars) for _ in range(n))

# 32指随机字节数,输出通常约43个URL安全字符,不是32个字符
secrets.token_urlsafe(32)

其他常用形式

import uuid
str(uuid.uuid4())          # '550e8400-e29b-41d4-a716-446655440000'
uuid.uuid4().hex           # 无横线 32 位
secrets.token_hex(16)      # 16随机字节编码为32个十六进制字符

常见问题(FAQ)

Q:如何排除易混淆字符(0/O、1/l/I)?
A:自定义字符集剔除即可:chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'。

Q:random 和 secrets 有什么区别?
A:random 是伪随机(Mersenne Twister),可预测,不适合安全用途;secrets 用操作系统提供的加密级随机源。

Q:要求至少包含一个数字怎么办?
A:在长度为正且字符集含数字时生成后检查,不满足重试;安全用途整个流程都用 secrets,不能最后改用 random.shuffle。拒绝采样可保持合格字符串中的均匀分布。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台