怎样用脚本批量生成CSV测试数据?

wen 实用脚本 2

本文目录导读:

怎样用脚本批量生成CSV测试数据?

  1. 方法一:使用Python + Faker库(推荐)
  2. 方法二:简单Python脚本(无需额外库)
  3. 方法三:Bash Shell脚本(Linux/Mac)
  4. 方法四:高级数据生成(带数据验证)
  5. 安装依赖
  6. 快速使用命令
  7. 推荐方案

我来介绍几种批量生成CSV测试数据的方法:

使用Python + Faker库(推荐)

import csv
import random
from faker import Faker
from datetime import datetime, timedelta
# 初始化Faker
fake = Faker('zh_CN')  # 中文数据
# 定义生成函数
def generate_test_data(num_rows=1000):
    data = []
    for _ in range(num_rows):
        row = {
            'id': random.randint(10000, 99999),
            'name': fake.name(),
            'email': fake.email(),
            'phone': fake.phone_number(),
            'address': fake.address(),
            'company': fake.company(),
            'job': fake.job(),
            'age': random.randint(18, 80),
            'salary': random.randint(5000, 50000),
            'created_at': fake.date_time_between(
                start_date='-1y', 
                end_date='now'
            ).strftime('%Y-%m-%d %H:%M:%S'),
            'is_active': random.choice([True, False]),
            'score': round(random.uniform(0, 100), 2)
        }
        data.append(row)
    return data
# 保存为CSV
def save_to_csv(data, filename='test_data.csv'):
    if not data:
        return
    # 获取字段名
    fieldnames = data[0].keys()
    with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()
        writer.writerows(data)
    print(f"成功生成 {len(data)} 条数据到 {filename}")
# 使用示例
if __name__ == '__main__':
    # 生成10000条数据
    data = generate_test_data(10000)
    save_to_csv(data, 'large_test_data.csv')
    # 显示前5条
    print("前5条数据示例:")
    for i, row in enumerate(data[:5]):
        print(f"{i+1}. {row}")

简单Python脚本(无需额外库)

import csv
import random
import string
from datetime import datetime, timedelta
def generate_simple_test_data(rows=1000):
    """生成简单的测试数据,无需安装第三方库"""
    # 姓氏和名字列表
    last_names = ['张', '李', '王', '赵', '刘', '陈', '杨', '黄', '周', '吴']
    first_names = ['伟', '芳', '强', '静', '磊', '娜', '军', '娟', '勇', '敏',
                   '华', '丽', '涛', '艳', '明', '超', '秀英', '洋', '鑫', '磊']
    # 域名列表
    domains = ['qq.com', '163.com', 'gmail.com', 'outlook.com', 'company.cn']
    # 地址组件
    cities = ['北京', '上海', '广州', '深圳', '杭州', '成都', '武汉', '南京']
    streets = ['中山路', '人民路', '解放路', '建设路', '和平路']
    def random_phone():
        prefixes = ['138', '139', '150', '151', '152', '186', '187', '188']
        return random.choice(prefixes) + ''.join(random.choices(string.digits, k=8))
    def random_name():
        return random.choice(last_names) + random.choice(first_names)
    def random_email(name):
        return f"{name.lower()}{random.randint(1, 999)}@{random.choice(domains)}"
    def random_address():
        return f"{random.choice(cities)}市{random.choice(streets)}{random.randint(1, 999)}号"
    data = []
    for i in range(rows):
        name = random_name()
        data.append({
            'id': i + 1,
            'name': name,
            'email': random_email(name),
            'phone': random_phone(),
            'address': random_address(),
            'age': random.randint(18, 65),
            'salary': random.randint(5000, 80000),
            'department': random.choice(['技术部', '市场部', '销售部', '人事部', '财务部']),
            'status': random.choice(['在职', '离职', '试用期']),
            'entry_date': (datetime.now() - timedelta(days=random.randint(30, 1000))).strftime('%Y-%m-%d')
        })
    return data
# 保存CSV
def save_to_csv_simple(data, filename='simple_test_data.csv'):
    if not data:
        return
    with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
        writer = csv.DictWriter(f, fieldnames=data[0].keys())
        writer.writeheader()
        writer.writerows(data)
    print(f"成功生成 {len(data)} 条数据到 {filename}")
if __name__ == '__main__':
    # 生成并保存
    data = generate_simple_test_data(5000)
    save_to_csv_simple(data, 'simple_data.csv')

Bash Shell脚本(Linux/Mac)

#!/bin/bash
# 生成CSV测试数据 - shell版本
# 用法: ./generate_csv.sh [行数]
ROWS=${1:-1000}  # 默认1000行
OUTPUT_FILE="test_data_$(date +%Y%m%d_%H%M%S).csv"
# CSV头
echo "id,name,email,age,city,amount,date" > $OUTPUT_FILE
# 数据
for ((i=1; i<=$ROWS; i++))
do
    # 生成随机数据
    ID=$i
    NAME="User_$i"
    EMAIL="user${i}@example.com"
    AGE=$((RANDOM % 50 + 18))
    # 随机城市
    CITIES=("北京" "上海" "广州" "深圳" "杭州")
    CITY=${CITIES[$((RANDOM % 5))]}
    # 随机金额(两位小数)
    AMOUNT=$(awk -v min=100 -v max=10000 'BEGIN{srand(); printf "%.2f", min+rand()*(max-min)}')
    # 随机日期
    YEAR=$((RANDOM % 3 + 2022))
    MONTH=$(printf "%02d" $((RANDOM % 12 + 1)))
    DAY=$(printf "%02d" $((RANDOM % 28 + 1)))
    DATE="${YEAR}-${MONTH}-${DAY}"
    echo "$ID,$NAME,$EMAIL,$AGE,$CITY,$AMOUNT,$DATE" >> $OUTPUT_FILE
done
echo "✅ 成功生成 $ROWS 条数据到 $OUTPUT_FILE"

高级数据生成(带数据验证)

import csv
import random
import hashlib
from faker import Faker
from typing import List, Dict
fake = Faker('zh_CN')
class TestDataGenerator:
    """测试数据生成器类"""
    def __init__(self):
        self.data_types = {
            'personal': self._generate_personal,
            'financial': self._generate_financial,
            'product': self._generate_product,
            'mixed': self._generate_mixed
        }
    def _generate_personal(self) -> Dict:
        """个人信息数据"""
        name = fake.name()
        return {
            'id': fake.uuid4(),
            'username': name.translate(str.maketrans('', '', ' ')).lower(),
            'password_hash': hashlib.sha256(fake.password().encode()).hexdigest(),
            'full_name': name,
            'phone': fake.phone_number(),
            'email': fake.email(),
            'id_card': fake.ssn(),
            'birth_date': fake.date_of_birth(minimum_age=18, maximum_age=80).isoformat(),
            'gender': random.choice(['男', '女']),
            'province': fake.province()
        }
    def _generate_financial(self) -> Dict:
        """金融数据"""
        return {
            'transaction_id': f'TXN{fake.random_int(min=100000, max=999999)}',
            'account': f'{random.choice(["6222", "6217", "6228"])}{"".join([str(random.randint(0,9)) for _ in range(12)])}',
            'amount': round(random.uniform(10, 100000), 2),
            'currency': random.choice(['CNY', 'USD', 'EUR', 'JPY']),
            'status': random.choice(['成功', '失败', '处理中']),
            'timestamp': fake.date_time_this_year().isoformat(),
            'merchant': fake.company(),
            'channel': random.choice(['手机银行', '网银', 'POS', '支付宝', '微信'])
        }
    def _generate_product(self) -> Dict:
        """产品数据"""
        categories = ['电子产品', '服装', '食品', '图书', '家居']
        return {
            'sku': f'SKU{fake.random_int(min=10000, max=99999)}',
            'product_name': fake.catch_phrase(),
            'category': random.choice(categories),
            'price': round(random.uniform(10, 9999), 2),
            'stock': random.randint(0, 1000),
            'rating': round(random.uniform(1, 5), 1),
            'description': fake.text(max_nb_chars=200),
            'create_date': fake.date_this_year().isoformat()
        }
    def _generate_mixed(self) -> Dict:
        """混合数据"""
        return self._generate_personal() | self._generate_financial() | self._generate_product()
    def generate_batch(self, data_type: str, rows: int, output_file: str):
        """批量生成数据"""
        if data_type not in self.data_types:
            raise ValueError(f"不支持的数据类型: {data_type}")
        generator = self.data_types[data_type]
        data = [generator() for _ in range(rows)]
        # 保存CSV
        if data:
            with open(output_file, 'w', newline='', encoding='utf-8-sig') as f:
                fieldnames = data[0].keys()
                writer = csv.DictWriter(f, fieldnames=fieldnames)
                writer.writeheader()
                writer.writerows(data)
            print(f"✅ 成功生成 {rows} 条 {data_type} 类型数据到 {output_file}")
            # 显示统计信息
            print(f"📊 数据大小: {len(data)} 行, {len(fieldnames)} 列")
            print(f"📋 字段: {', '.join(fieldnames)}")
        return data
# 使用示例
if __name__ == '__main__':
    generator = TestDataGenerator()
    # 批量生成不同类型数据
    generator.generate_batch('personal', 1000, '个人数据.csv')
    generator.generate_batch('financial', 500, '金融数据.csv')
    generator.generate_batch('product', 2000, '产品数据.csv')
    generator.generate_batch('mixed', 5000, '混合数据.csv')

安装依赖

Python方法需要安装Faker库:

pip install faker

快速使用命令

  1. Python一行命令(如果已安装faker):

    python -c "from test_generator import TestDataGenerator; TestDataGenerator().generate_batch('personal', 1000, 'output.csv')"
  2. Bash脚本执行

    chmod +x generate_csv.sh
    ./generate_csv.sh 5000

推荐方案

  • 快速测试:使用方法二(简单Python脚本)
  • 生产级数据:使用方法一(Faker库)
  • 批量多种数据:使用方法四(类封装)
  • Linux/Mac环境:使用方法三(Shell脚本)

根据你的实际需求选择合适的方案即可!

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