数据生成脚本如何写?

wen 实用脚本 42

本文目录导读:

数据生成脚本如何写?

  1. 通用核心原则:随机 + 约束 + 依赖
  2. 场景1:生成“假数据”用于测试/演示(推荐Python + Faker库)
  3. 场景2:生成“关联表数据”用于数据库填充(订单 + 用户)
  4. 场景3:生成“SQL插入脚本”直接用于数据库
  5. 场景4:生成“大量数据”用于性能测试(注重效率)
  6. 场景5:生成“结构化/嵌套数据”(JSON/XML)
  7. 常用工具速查表
  8. 如何写出“好”的数据生成脚本?
  9. 快速启动模板(可复制保存)

写“数据生成脚本”取决于你的具体目的(比如测试数据库、生成报表、训练AI模型、压测API等)以及目标格式(SQL、JSON、CSV、假数据表格)。

下面我从最通用、最实用的角度出发,分场景给出示例和思路,帮你快速上手。


通用核心原则:随机 + 约束 + 依赖

一个好的数据生成脚本通常包含三要素:

  1. 随机性randomfakernumpy.random 库生成变化。
  2. 约束/规则:数据范围(年龄 0-120)、字符长度、格式(手机号、邮箱)。
  3. 依赖关系:用户ID关联订单,城市关联省份(使用映射表或查找字典)。

场景1:生成“假数据”用于测试/演示(推荐Python + Faker库)

这是最常见的需求faker 库几乎可以生成一切:人名、地址、公司、邮箱、文本。

安装pip install faker

示例:生成100条用户数据(JSON格式)

from faker import Faker
import json
import random
fake = Faker('zh_CN')  # 使用中文语言包
def generate_users(count=100):
    users = []
    for i in range(count):
        user = {
            "id": i + 1,
            "name": fake.name(),
            "phone": fake.phone_number(),
            "email": fake.email(),
            "address": fake.address(),
            "age": random.randint(18, 60),
            "job": fake.job(),
            "created_at": fake.date_time_this_decade().isoformat()
        }
        users.append(user)
    return users
# 生成并保存
data = generate_users(100)
with open('fake_users.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=2)
print("生成完成,共100条数据。")

输出片段

[
  {
    "id": 1,
    "name": "李强",
    "phone": "13812345678",
    "email": "liqiang@example.com",
    "address": "北京市朝阳区...",
    "age": 35,
    "job": "软件工程师",
    "created_at": "2023-08-15T14:22:30"
  }
]

场景2:生成“关联表数据”用于数据库填充(订单 + 用户)

需要模拟真实业务关系,每个用户有0~3个订单。

from faker import Faker
import random
from datetime import datetime, timedelta
fake = Faker('zh_CN')
def generate_orders(user_count=10, max_orders_per_user=3):
    orders = []
    order_id = 1
    for user_id in range(1, user_count + 1):
        # 每个用户随机生成0~3个订单
        for _ in range(random.randint(0, max_orders_per_user)):
            amount = round(random.uniform(10.0, 5000.0), 2)
            status = random.choice(['pending', 'paid', 'shipped', 'completed'])
            created = fake.date_time_between(start_date='-30d', end_date='now')
            orders.append({
                "order_id": order_id,
                "user_id": user_id,
                "amount": amount,
                "status": status,
                "created_at": created.isoformat()
            })
            order_id += 1
    return orders
# 使用
user_list = generate_users(10)   # 复用前一个函数
order_list = generate_orders(10)
print(f"生成了 {len(user_list)} 个用户,{len(order_list)} 个订单。")

场景3:生成“SQL插入脚本”直接用于数据库

将生成的数据批量拼接成 INSERT INTO 语句,适合给DBA或迁移使用。

from faker import Faker
import random
fake = Faker('zh_CN')
def generate_sql_insert(rows=10):
    sql_lines = ["INSERT INTO users (name, age, email) VALUES"]
    values = []
    for _ in range(rows):
        name = fake.name().replace("'", "''")  # 防止SQL注入(模拟)
        age = random.randint(18, 60)
        email = fake.email()
        values.append(f"('{name}', {age}, '{email}')")
    sql_lines.append(",\n".join(values) + ";")
    return "\n".join(sql_lines)
# 使用
print(generate_sql_insert(5))

输出

INSERT INTO users (name, age, email) VALUES
('张伟', 28, 'zhangwei@example.com'),
('李娜', 35, 'lina@test.com'),
('王芳', 22, 'wangfang@demo.org'),
('刘洋', 41, 'liuyang@mail.com'),
('陈静', 19, 'chenjing@company.cn');

场景4:生成“大量数据”用于性能测试(注重效率)

当需要百万、千万级数据时,Python一次性加载内存可能不够用,此时用生成器直接写文件

from faker import Faker
import csv
import random
fake = Faker('zh_CN')
def generate_large_csv(filename, row_count=1_000_000):
    with open(filename, 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(['id', 'name', 'phone', 'balance'])
        for i in range(1, row_count + 1):
            # 每10万行打印一次进度
            if i % 100000 == 0:
                print(f"已生成 {i} 行...")
            writer.writerow([
                i,
                fake.name(),
                fake.phone_number(),
                round(random.uniform(0, 100000), 2)
            ])
# 生成100万行数据(大约占用40~50MB磁盘空间)
generate_large_csv('test_data.csv', 1_000_000)
print("CSV文件生成完毕。")

提示:对于超大文件(1亿行以上),建议使用 pandas 分批写入,或直接用 C/Go 写脚本效率更高。


场景5:生成“结构化/嵌套数据”(JSON/XML)

适合给API测试或NoSQL数据库(MongoDB)准备数据。

from faker import Faker
import json
fake = Faker('zh_CN')
def generate_complex_json(count=5):
    result = []
    for _ in range(count):
        person = {
            "personal": {
                "name": fake.name(),
                "age": fake.random_int(18, 65),
                "contacts": {
                    "phone": fake.phone_number(),
                    "email": fake.email()
                }
            },
            "company": {
                "name": fake.company(),
                "position": fake.job(),
                "salary": fake.random_int(5000, 50000)
            },
            "tags": fake.words(nb=3, unique=True),
            "is_active": fake.boolean()
        }
        result.append(person)
    return result
data = generate_complex_json()
with open('complex_data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

常用工具速查表

环境/语言 推荐库/工具 适用场景
Python Faker 万能假数据(推荐)
Python random + string 自定义简单随机值
Python numpy 大量数值型数据(正态分布、时间序列)
SQL MySQL generate_series() (8.0+), PostgreSQL generate_series() 直接在数据库中生成测试数据
JavaScript @faker-js/faker Node.js 后端测试
Java javafaker (DataFaker) Java 项目
Go gofakeit Go 后端/CLI工具
在线工具 Mockaroo, JSON Generator 一次性、图形化、导入导出方便

如何写出“好”的数据生成脚本?

  1. 参数化:把数量、文件名、随机种子(seed)作为变量或命令行参数(argparse)。
  2. 可重复性:设置 random.seed(42),保证每次运行生成相同数据(方便回归测试)。
  3. 边界值:专门插入空值、超长字符串、负值等,用于测试程序健壮性。
  4. 效率:一行一行写文件(csv.writer)避免大内存占用;使用 tqdm 加进度条。

快速启动模板(可复制保存)

import argparse
from faker import Faker
import csv, json, random
def main(format='json', count=100, seed=0):
    fake = Faker('zh_CN')
    random.seed(seed)
    data = []
    for i in range(count):
        data.append({
            "id": i+1,
            "name": fake.name(),
            "value": random.randint(1, 1000)
        })
    if format == 'json':
        with open(f'output_{count}.json', 'w') as f:
            json.dump(data, f, ensure_ascii=False, indent=2)
    elif format == 'csv':
        with open(f'output_{count}.csv', 'w', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=data[0].keys())
            writer.writeheader()
            writer.writerows(data)
    print(f"已生成 {count} 条数据到 output_{count}.{format}")
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--format', choices=['json','csv'], default='json')
    parser.add_argument('--count', type=int, default=100)
    parser.add_argument('--seed', type=int, default=0)
    args = parser.parse_args()
    main(args.format, args.count, args.seed)

运行

python generate.py --format json --count 500 --seed 42

如果你能告诉我具体目标(“我想生成1万条订单表记录,关联1000个用户”“只要英文数据”“要包含省市字段”),我可以给你写更直接能用的代码片段。

抱歉,评论功能暂时关闭!