怎样实现模拟数据生成脚本

wen 实用脚本 27

本文目录导读:

怎样实现模拟数据生成脚本

  1. Python实现(最常用)
  2. JavaScript实现
  3. 安装依赖
  4. 使用说明

我来帮你实现一个通用的模拟数据生成脚本,以下是几种常见语言的实现方式:

Python实现(最常用)

import random
import json
from datetime import datetime, timedelta
from faker import Faker
class DataGenerator:
    def __init__(self, locale='zh_CN'):
        self.fake = Faker(locale)
    def generate_user(self):
        """生成单个用户数据"""
        return {
            'id': random.randint(10000, 99999),
            'name': self.fake.name(),
            'email': self.fake.email(),
            'phone': self.fake.phone_number(),
            'age': random.randint(18, 80),
            'gender': random.choice(['男', '女']),
            'address': self.fake.address(),
            'salary': round(random.uniform(5000, 50000), 2),
            'create_time': self.fake.date_time_between(
                start_date='-365d', 
                end_date='now'
            ).strftime('%Y-%m-%d %H:%M:%S')
        }
    def generate_orders(self, num_orders=10):
        """生成订单数据"""
        orders = []
        for i in range(num_orders):
            order = {
                'order_id': f'ORD{datetime.now().strftime("%Y%m%d")}{i:04d}',
                'user_id': random.randint(10000, 99999),
                'product_name': random.choice([
                    '笔记本电脑', '手机', '平板', '耳机', '键盘'
                ]),
                'quantity': random.randint(1, 5),
                'price': round(random.uniform(100, 9999), 2),
                'status': random.choice(['待支付', '已支付', '已发货', '已完成', '已取消']),
                'order_date': self.fake.date_time_between(
                    start_date='-30d', 
                    end_date='now'
                ).strftime('%Y-%m-%d %H:%M:%S')
            }
            orders.append(order)
        return orders
    def generate_student_scores(self, num_students=5):
        """生成学生成绩数据"""
        subjects = ['语文', '数学', '英语', '物理', '化学']
        students = []
        for i in range(num_students):
            student = {
                'student_id': f'2024{i+1:04d}',
                'name': self.fake.name(),
                'class': random.choice(['A班', 'B班', 'C班']),
                'scores': {
                    subject: random.randint(60, 100) 
                    for subject in subjects
                }
            }
            student['total_score'] = sum(student['scores'].values())
            student['average_score'] = round(student['total_score'] / len(subjects), 1)
            students.append(student)
        return students
    def generate_transactions(self, num_transactions=10):
        """生成交易数据"""
        transactions = []
        start_date = datetime.now() - timedelta(days=30)
        for i in range(num_transactions):
            date = start_date + timedelta(
                days=random.randint(0, 30),
                hours=random.randint(0, 23),
                minutes=random.randint(0, 59)
            )
            transaction = {
                'transaction_id': f'TXN{date.strftime("%Y%m%d%H%M%S")}{i:03d}',
                'amount': round(random.uniform(10, 10000), 2),
                'type': random.choice(['收入', '支出']),
                'category': random.choice([
                    '餐饮', '交通', '购物', '娱乐', '医疗', '教育'
                ]),
                'payment_method': random.choice([
                    '微信支付', '支付宝', '银行卡', '现金'
                ]),
                'merchant': self.fake.company(),
                'timestamp': date.strftime('%Y-%m-%d %H:%M:%S')
            }
            transactions.append(transaction)
        return transactions
def save_to_json(data, filename):
    """保存为JSON格式"""
    with open(filename, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
    print(f"数据已保存至 {filename}")
def save_to_csv(data, filename, fields=None):
    """保存为CSV格式(简单实现)"""
    if fields is None:
        fields = list(data[0].keys())
    with open(filename, 'w', encoding='utf-8') as f:
        f.write(','.join(fields) + '\n')
        for item in data:
            row = []
            for field in fields:
                value = str(item.get(field, ''))
                if ',' in value:
                    value = f'"{value}"'
                row.append(value)
            f.write(','.join(row) + '\n')
    print(f"数据已保存至 {filename}")
# 使用示例
if __name__ == "__main__":
    # 安装依赖:pip install faker
    generator = DataGenerator()
    # 生成不同类型的测试数据
    users = [generator.generate_user() for _ in range(5)]
    orders = generator.generate_orders(5)
    students = generator.generate_student_scores(3)
    transactions = generator.generate_transactions(5)
    # 保存数据
    save_to_json({'users': users, 'orders': orders}, 'test_data.json')
    save_to_csv(users, 'users.csv')
    # 打印示例数据
    print("\n=== 用户数据示例 ===")
    for user in users:
        print(f"用户: {user['name']}, 年龄: {user['age']}, 邮箱: {user['email']}")
    print("\n=== 订单数据示例 ===")
    for order in orders:
        print(f"订单: {order['order_id']}, 商品: {order['product_name']}, 金额: {order['price']}")

JavaScript实现

const faker = require('faker/locale/zh_CN');
class DataGenerator {
    constructor() {
        this.faker = faker;
    }
    generateUser() {
        return {
            id: Math.floor(Math.random() * 90000) + 10000,
            name: this.faker.name.findName(),
            email: this.faker.internet.email(),
            phone: this.faker.phone.phoneNumber(),
            age: Math.floor(Math.random() * 62) + 18,
            gender: Math.random() > 0.5 ? '男' : '女',
            address: this.faker.address.streetAddress(),
            salary: parseFloat((Math.random() * 45000 + 5000).toFixed(2)),
            createTime: this.faker.date.between('2023-01-01', '2024-01-01')
        };
    }
    generateOrders(count = 10) {
        const orders = [];
        for (let i = 0; i < count; i++) {
            orders.push({
                orderId: `ORD${Date.now()}${i.toString().padStart(4, '0')}`,
                userId: Math.floor(Math.random() * 90000) + 10000,
                productName: this.faker.commerce.productName(),
                quantity: Math.floor(Math.random() * 5) + 1,
                price: parseFloat(this.faker.commerce.price(100, 9999)),
                status: ['待支付', '已支付', '已发货', '已完成', '已取消'][Math.floor(Math.random() * 5)]
            });
        }
        return orders;
    }
    generateStudentScores(count = 5) {
        const subjects = ['语文', '数学', '英语', '物理', '化学'];
        const students = [];
        for (let i = 0; i < count; i++) {
            const scores = {};
            let totalScore = 0;
            subjects.forEach(subject => {
                scores[subject] = Math.floor(Math.random() * 41) + 60;
                totalScore += scores[subject];
            });
            students.push({
                studentId: `2024${(i + 1).toString().padStart(4, '0')}`,
                name: this.faker.name.findName(),
                class: ['A班', 'B班', 'C班'][Math.floor(Math.random() * 3)],
                scores: scores,
                totalScore: totalScore,
                averageScore: parseFloat((totalScore / subjects.length).toFixed(1))
            });
        }
        return students;
    }
}
// 使用示例
const generator = new DataGenerator();
const users = Array.from({length: 5}, () => generator.generateUser());
const orders = generator.generateOrders(5);
console.log('生成的用户数据:', JSON.stringify(users, null, 2));
console.log('生成的订单数据:', JSON.stringify(orders, null, 2));
// 保存到文件(Node.js环境)
const fs = require('fs');
fs.writeFileSync('test_data.json', JSON.stringify({users, orders}, null, 2));
console.log('数据已保存至 test_data.json');

安装依赖

Python:

pip install faker

JavaScript:

npm install faker

使用说明

  1. 选择合适的模板:根据你的数据类型选择对应的生成函数
  2. 自定义字段:可以修改生成逻辑,添加或删除字段
  3. 控制数量:通过参数控制生成数据的数量
  4. 保存格式:支持JSON、CSV等格式输出

这个脚本可以生成用户数据、订单数据、交易数据、学生成绩等多种常见的测试数据,适合用于开发测试、数据库填充、接口测试等场景。

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