本文目录导读:

- 方法一:使用Python + Faker库(推荐)
- 方法二:简单Python脚本(无需额外库)
- 方法三:Bash Shell脚本(Linux/Mac)
- 方法四:高级数据生成(带数据验证)
- 安装依赖
- 快速使用命令
- 推荐方案
我来介绍几种批量生成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
快速使用命令
-
Python一行命令(如果已安装faker):
python -c "from test_generator import TestDataGenerator; TestDataGenerator().generate_batch('personal', 1000, 'output.csv')" -
Bash脚本执行:
chmod +x generate_csv.sh ./generate_csv.sh 5000
推荐方案
- 快速测试:使用方法二(简单Python脚本)
- 生产级数据:使用方法一(Faker库)
- 批量多种数据:使用方法四(类封装)
- Linux/Mac环境:使用方法三(Shell脚本)
根据你的实际需求选择合适的方案即可!