Python 批量生成随机姓名手机号测试数据:导出 CSV
Python 用 random 批量造中文姓名、11 位手机号、邮箱等测试数据,导出成 CSV 表格,适合后端联调、压测、数据库初始化,附完整代码。
场景痛点
后端接口联调、压测、数据库初始化,需要一批假用户数据。手动填几十行还行,要 1 万条测试数据就疯了。用 Python 写个生成器,从常见姓氏、名字库随机组合姓名,按 1 开头 + 号段生成合法手机号,再加邮箱、年龄、注册时间,一键导出 CSV,直接导入数据库。
用到的库
# 纯标准库 random, csv, faker 可选
# 想更逼真可以 pip install Faker,本示例用纯标准库实现
完整代码
import csv
import random
from datetime import datetime, timedelta
# 常见姓氏和名字库,实际项目可以从文件读更大的字库
SURNAMES = list("赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜")
GIVEN_NAMES = [
"伟", "芳", "娜", "敏", "静", "丽", "强", "磊", "军", "洋",
"勇", "艳", "杰", "娟", "涛", "明", "超", "秀英", "华", "慧",
"子涵", "欣怡", "梓萱", "雨泽", "浩然", "一诺", "思远", "若曦",
]
# 国内手机号号段前缀
PHONE_PREFIX = ["130", "131", "135", "136", "137", "138", "139",
"150", "151", "152", "158", "159",
"176", "177", "178", "180", "181", "185", "186", "187", "188", "189",
"199"]
EMAIL_DOMAINS = ["qq.com", "163.com", "126.com", "gmail.com", "outlook.com", "139.com"]
def random_name():
"""随机生成中文姓名"""
return random.choice(SURNAMES) + random.choice(GIVEN_NAMES)
def random_phone():
"""随机生成 11 位手机号"""
prefix = random.choice(PHONE_PREFIX)
suffix = "".join(random.choices("0123456789", k=8))
return prefix + suffix
def random_email(name_seed):
"""用拼音首字母风格生成邮箱(这里用数字代替,演示)"""
user = f"user{random.randint(10000, 99999)}"
return f"{user}@{random.choice(EMAIL_DOMAINS)}"
def random_birthday():
"""随机生成 1970-2005 年间的生日"""
start = datetime(1970, 1, 1)
end = datetime(2005, 12, 31)
delta = (end - start).days
day = start + timedelta(days=random.randint(0, delta))
return day.strftime("%Y-%m-%d")
def batch_generate(count=1000, out_path="test_users.csv"):
"""批量生成测试用户,导出 CSV"""
rows = []
used_phones = set()
for i in range(count):
name = random_name()
# 手机号去重,避免压测时撞号
phone = random_phone()
while phone in used_phones:
phone = random_phone()
used_phones.add(phone)
rows.append({
"id": i + 1,
"姓名": name,
"手机号": phone,
"邮箱": random_email(name),
"生日": random_birthday(),
"年龄": random.randint(18, 55),
"性别": random.choice(["男", "女"]),
"城市": random.choice(["北京", "上海", "广州", "深圳", "杭州", "成都", "武汉", "西安"]),
})
with open(out_path, "w", encoding="utf-8-sig", newline="") as f:
writer = csv.DictWriter(f, fieldnames=list(rows[0].keys()))
writer.writeheader()
writer.writerows(rows)
print(f"已生成 {len(rows)} 条测试用户,写入 {out_path}")
for r in rows[:5]:
print(r)
def main():
batch_generate(1000, "./test_users.csv")
if __name__ == "__main__":
main()
代码讲解
random.choice(SURNAMES)从姓氏表随机挑一个,再从名字表随机拼,组成中文姓名。- 手机号用真实号段前缀 + 8 位随机数字,符合国内 11 位手机号规则,后端校验格式不会被拒。
used_phones集合保证手机号不重复,压测时同一个号注册多次会出问题。- 生日用
timedelta在一个时间区间里随机取一天,比随机写年月日更安全,不会出现 2 月 30 日这种非法日期。 - CSV 用
utf-8-sig编码,Excel 双击打开中文不乱码。 - 想生成更逼真的姓名、地址、公司,直接装 Faker:
pip install Faker,然后from faker import Faker; fake = Faker("zh_CN"),fake.name()、fake.phone_number()直接用。
运行结果
运行后生成 ./test_users.csv,1000 行测试用户,列包括 id、姓名、手机号、邮箱、生日、年龄、性别、城市。控制台打印前 5 行示例。用 Excel 或 pandas 打开检查格式,直接 mysqlimport 或 pandas 导入数据库。
注意事项
- 本脚本造的手机号是随机号段,可能和真实号段撞号,正式环境别拿来给真实用户发短信。
- 姓名库只列了几十个常用名,生成 1 万条会有大量重复,要更丰富就把百家姓+现代汉语词典名字列表读进来。
- 压测要 10 万条以上数据时,CSV 写法逐行写没问题,瓶颈在生成逻辑本身;用 Faker 会慢一些但更逼真。
- 邮箱这里用 user+随机数字,没做和姓名关联,需要拼音邮箱可以装
pypinyin库把姓名转拼音。 random模块在批量生成时不需要固定种子,要可复现就random.seed(42)。

更新时间:2026-09-14 20:38:54
上一篇:Python 获取当前时间日期并格式化:datetime 常用示例