first commit
This commit is contained in:
+376
@@ -0,0 +1,376 @@
|
||||
from faker import Faker
|
||||
import random
|
||||
from datetime import datetime
|
||||
|
||||
# 初始化Faker生成器(简体中文)
|
||||
fake = Faker("zh_CN")
|
||||
|
||||
# 定义固定值
|
||||
TEAM_ID = 106
|
||||
PLAN_ID = 131
|
||||
|
||||
# 常见民族列表
|
||||
ETHNIC_GROUPS = [
|
||||
"汉",
|
||||
"壮",
|
||||
"满",
|
||||
"回",
|
||||
"苗",
|
||||
"维吾尔",
|
||||
"土家",
|
||||
"彝",
|
||||
"蒙古",
|
||||
"藏",
|
||||
"布依",
|
||||
"侗",
|
||||
"瑶",
|
||||
"朝鲜",
|
||||
"白",
|
||||
"哈尼",
|
||||
"哈萨克",
|
||||
"黎",
|
||||
"傣",
|
||||
"畲",
|
||||
"傈僳",
|
||||
"仡佬",
|
||||
"东乡",
|
||||
"高山",
|
||||
"拉祜",
|
||||
"水",
|
||||
"佤",
|
||||
"纳西",
|
||||
"羌",
|
||||
"土",
|
||||
"仫佬",
|
||||
"锡伯",
|
||||
"柯尔克孜",
|
||||
"达斡尔",
|
||||
"景颇",
|
||||
"毛南",
|
||||
"撒拉",
|
||||
"布朗",
|
||||
"塔吉克",
|
||||
"阿昌",
|
||||
"普米",
|
||||
"鄂温克",
|
||||
"怒",
|
||||
"京",
|
||||
"基诺",
|
||||
"德昂",
|
||||
"保安",
|
||||
"俄罗斯",
|
||||
"裕固",
|
||||
"乌兹别克",
|
||||
"门巴",
|
||||
"鄂伦春",
|
||||
"独龙",
|
||||
"塔塔尔",
|
||||
"赫哲",
|
||||
"珞巴",
|
||||
]
|
||||
|
||||
# 疾病列表(健康状态)
|
||||
HEALTH_CONDITIONS = [
|
||||
"无",
|
||||
"近视",
|
||||
"弱视",
|
||||
"鼻炎",
|
||||
"哮喘",
|
||||
"过敏体质",
|
||||
"蛀牙",
|
||||
"肥胖",
|
||||
"发育迟缓",
|
||||
"ADHD",
|
||||
"缺铁性贫血",
|
||||
"维生素缺乏",
|
||||
"易感冒体质",
|
||||
"偏瘦",
|
||||
"过敏(花粉)",
|
||||
"过敏(尘螨)",
|
||||
"过敏(牛奶)",
|
||||
"消化不良",
|
||||
"多动症",
|
||||
"抽动症",
|
||||
"癫痫",
|
||||
"小儿麻痹",
|
||||
"乙肝病毒携带",
|
||||
]
|
||||
|
||||
# 艺术特长
|
||||
ART_TALENTS = [
|
||||
"无",
|
||||
"钢琴",
|
||||
"小提琴",
|
||||
"绘画",
|
||||
"书法",
|
||||
"舞蹈",
|
||||
"声乐",
|
||||
"戏剧表演",
|
||||
"摄影",
|
||||
"编程",
|
||||
"动画制作",
|
||||
"模型制作",
|
||||
"手工艺术",
|
||||
]
|
||||
|
||||
# 体育特长
|
||||
SPORTS_TALENTS = [
|
||||
"无",
|
||||
"游泳",
|
||||
"篮球",
|
||||
"足球",
|
||||
"乒乓球",
|
||||
"羽毛球",
|
||||
"田径",
|
||||
"武术",
|
||||
"跆拳道",
|
||||
"空手道",
|
||||
"轮滑",
|
||||
"滑板",
|
||||
"自行车",
|
||||
"健美操",
|
||||
]
|
||||
|
||||
# 科技特长
|
||||
TECH_TALENTS = [
|
||||
"无",
|
||||
"机器人编程",
|
||||
"电子制作",
|
||||
"3D打印",
|
||||
"人工智能",
|
||||
"网页设计",
|
||||
"科学实验",
|
||||
"天文观测",
|
||||
"植物培养",
|
||||
"动物观察",
|
||||
"航模制作",
|
||||
]
|
||||
|
||||
# 职业列表
|
||||
OCCUPATIONS = [
|
||||
"医生",
|
||||
"教师",
|
||||
"工程师",
|
||||
"程序员",
|
||||
"设计师",
|
||||
"建筑师",
|
||||
"销售经理",
|
||||
"会计",
|
||||
"律师",
|
||||
"公务员",
|
||||
"记者",
|
||||
"警察",
|
||||
"消防员",
|
||||
"厨师",
|
||||
"商人",
|
||||
"自由职业",
|
||||
"个体经营者",
|
||||
"银行职员",
|
||||
"人力资源",
|
||||
"市场营销",
|
||||
]
|
||||
|
||||
# 公司类型
|
||||
WORKPLACES = [
|
||||
"国有企业",
|
||||
"民营企业",
|
||||
"外资企业",
|
||||
"合资企业",
|
||||
"政府机关",
|
||||
"事业单位",
|
||||
"学校",
|
||||
"医院",
|
||||
"设计事务所",
|
||||
"律师事务所",
|
||||
"科技公司",
|
||||
"互联网公司",
|
||||
"金融机构",
|
||||
"建筑公司",
|
||||
"零售企业",
|
||||
]
|
||||
|
||||
# 小学名称
|
||||
PRIMARY_SCHOOLS = [
|
||||
"第一实验小学",
|
||||
"第二实验小学",
|
||||
"育才小学",
|
||||
"阳光小学",
|
||||
"希望小学",
|
||||
"和平小学",
|
||||
"实验小学分校",
|
||||
"新世纪小学",
|
||||
"东方小学",
|
||||
"先锋小学",
|
||||
"星光小学",
|
||||
"明德小学",
|
||||
]
|
||||
|
||||
|
||||
def generate_id_num(birthday):
|
||||
"""生成符合规则的身份证号"""
|
||||
# 生成前6位(地区码,使用真实的地区码)
|
||||
region_codes = [
|
||||
"110101",
|
||||
"110105",
|
||||
"110106",
|
||||
"110107",
|
||||
"310112",
|
||||
"330102",
|
||||
"440106",
|
||||
"440304",
|
||||
]
|
||||
|
||||
# 出生日期码(8位)
|
||||
birth_code = birthday.replace("-", "")
|
||||
|
||||
# 顺序码(3位)
|
||||
sequence_code = str(random.randint(101, 998))
|
||||
|
||||
# 生成校验码(1位)
|
||||
base = (
|
||||
region_codes[random.randint(0, len(region_codes) - 1)]
|
||||
+ birth_code
|
||||
+ sequence_code
|
||||
)
|
||||
weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
|
||||
checksum_map = {
|
||||
0: "1",
|
||||
1: "0",
|
||||
2: "X",
|
||||
3: "9",
|
||||
4: "8",
|
||||
5: "7",
|
||||
6: "6",
|
||||
7: "5",
|
||||
8: "4",
|
||||
9: "3",
|
||||
10: "2",
|
||||
}
|
||||
|
||||
total = 0
|
||||
for i in range(17):
|
||||
total += int(base[i]) * weight[i]
|
||||
checksum = checksum_map[total % 11]
|
||||
|
||||
return base + checksum
|
||||
|
||||
|
||||
def generate_student_data():
|
||||
"""生成单个学生数据"""
|
||||
# 基础信息
|
||||
sex = random.choice(["男", "女"])
|
||||
|
||||
# 生日 (2010-2015年出生)
|
||||
birthday = fake.date_between(start_date="-15y", end_date="-8y").strftime("%Y-%m-%d")
|
||||
|
||||
# 生成符合规则的身份证号
|
||||
id_num = generate_id_num(birthday)
|
||||
|
||||
# 计算年龄(仅用于展示)
|
||||
birth_year = int(birthday[:4])
|
||||
current_year = datetime.now().year
|
||||
age = current_year - birth_year
|
||||
|
||||
# 生成学生信息
|
||||
data = {
|
||||
"teamId": TEAM_ID,
|
||||
"stuName": fake.name(), # 学生姓名
|
||||
"idNum": id_num, # 身份证号
|
||||
"formerName": random.choices(
|
||||
["无", fake.last_name() + fake.first_name()], weights=[0.8, 0.2]
|
||||
)[
|
||||
0
|
||||
], # 曾用名
|
||||
"sex": sex, # 性别
|
||||
"nation": random.choice(ETHNIC_GROUPS), # 民族
|
||||
"birthday": birthday, # 生日
|
||||
"finishSchool": random.choice(PRIMARY_SCHOOLS), # 毕业学校
|
||||
"file": None, # 文件
|
||||
"hkadr": fake.province()
|
||||
+ "/"
|
||||
+ fake.city()
|
||||
+ "/"
|
||||
+ fake.district(), # 户口所在地
|
||||
"homeAddress": fake.address(), # 家庭住址
|
||||
"health": random.choice(HEALTH_CONDITIONS), # 健康状况
|
||||
"artisticSpecialty": random.choice(ART_TALENTS), # 艺术特长
|
||||
"artisticAchievements": "无", # 艺术成就
|
||||
"technologicalSpecialty": random.choice(TECH_TALENTS), # 科技特长
|
||||
"technologicalAchievements": "无", # 科技成就
|
||||
"sportsSpecialty": random.choice(SPORTS_TALENTS), # 体育特长
|
||||
"sportsAchievements": "无", # 体育成就
|
||||
"planId": PLAN_ID, # 计划ID
|
||||
"imageUrl": "", # 图片URL
|
||||
"schoolCode": "G" + id_num[:-1], # 学籍号
|
||||
"age": age, # 年龄(仅用于展示)
|
||||
"email": fake.email() if random.random() > 0.7 else "", # 邮箱
|
||||
"height": str(random.randint(130, 170)), # 身高
|
||||
"weight": str(random.randint(25, 60)), # 体重
|
||||
"measurements": f"{random.randint(60, 90)},{random.randint(60, 90)},{random.randint(60, 90)}", # 三围
|
||||
}
|
||||
|
||||
# 生成监护人信息
|
||||
guardian_prefix = fake.last_name()
|
||||
|
||||
# 监护人1 - 通常为父母之一
|
||||
relationship_choices = ["父亲", "母亲", "爷爷", "奶奶", "外公", "外婆"]
|
||||
relationship = random.choice(relationship_choices[:2]) # 主要选择父母
|
||||
|
||||
data.update(
|
||||
{
|
||||
"guardian1Name": guardian_prefix
|
||||
+ ("先生" if relationship == "父亲" else "女士"), # 监护人1姓名
|
||||
"guardian1Relationship": relationship, # 关系
|
||||
"guardian1IdCardNumber": generate_id_num(
|
||||
fake.date_between(start_date="-55y", end_date="-25y").strftime(
|
||||
"%Y-%m-%d"
|
||||
)
|
||||
), # 身份证号
|
||||
"guardian1Contact": fake.phone_number(), # 联系方式
|
||||
"guardian1Occupation": random.choice(OCCUPATIONS), # 职业
|
||||
"guardian1Workplace": random.choice(WORKPLACES), # 工作单位
|
||||
}
|
||||
)
|
||||
|
||||
# 监护人2 - 可能是另一位家长或其他人
|
||||
if relationship == "父亲":
|
||||
guardian2_relationship = "母亲"
|
||||
else:
|
||||
guardian2_relationship = random.choices(
|
||||
["父亲", "爷爷", "奶奶", "外公", "外婆", "其他亲属"],
|
||||
weights=[0.7, 0.1, 0.1, 0.05, 0.05, 0.1],
|
||||
)[0]
|
||||
|
||||
data.update(
|
||||
{
|
||||
"guardian2Name": guardian_prefix
|
||||
+ (
|
||||
"先生" if guardian2_relationship in ["父亲", "爷爷", "外公"] else "女士"
|
||||
), # 监护人2姓名
|
||||
"guardian2Relationship": guardian2_relationship, # 关系
|
||||
"guardian2IdCardNumber": generate_id_num(
|
||||
fake.date_between(start_date="-55y", end_date="-25y").strftime(
|
||||
"%Y-%m-%d"
|
||||
)
|
||||
), # 身份证号
|
||||
"guardian2Contact": (
|
||||
fake.phone_number() if guardian2_relationship != "无" else ""
|
||||
), # 联系方式
|
||||
"guardian2Occupation": (
|
||||
random.choice(OCCUPATIONS) if guardian2_relationship != "无" else ""
|
||||
), # 职业
|
||||
"guardian2Workplace": (
|
||||
random.choice(WORKPLACES) if guardian2_relationship != "无" else ""
|
||||
), # 工作单位
|
||||
}
|
||||
)
|
||||
|
||||
return data
|
||||
|
||||
|
||||
def generate_students():
|
||||
student = generate_student_data()
|
||||
return student
|
||||
|
||||
|
||||
generate_students()
|
||||
Reference in New Issue
Block a user