【造数】Python批量生成测试数据
工程师开发完成后,常常需要制造大批量的伪数据,来测试数据中台的开发效果。利用Excel来造数,小批量的数据还是可以的,想了解Excel造数的朋友,可以看我之前的文章《造数常用的Excel表达式》,遇到大批量数据时,利用Python来造数会更高效。下面简单介绍一下具体的造数思路。
整体思路
确定有多少字段,样本内容,再给每个字段下填充数据用列表形式保存,在利用DataFrame通过字典的方式创建二维表,最后导出一张csv表格。
整体代码
# -*- coding: utf-8 -*-
import pandas as pd
from faker import Faker
import random
import numpy as np
fake = Faker("zh_CN") # 初始化,可生成中文数据
#设置字段
#index = []
for i in range(1,12):
exec('x'+str(i)+'=[]')
#设置样本
prod_cd = ['W00028','W00021','W00022']
prod_nm = ['微信支付','银联扫码支付','转账']
channel = ['APP','网银','短信']
year = ['2019','2020','2021']
#循环生成数据20行,具体多少行可以根据需求修改
for i in range(20):
date = random.choice(year)+fake.date()[4:]
x1.append('1'+str(fake.random_number(digits=8))) # 随机数字,参数digits设置生成的数字位数
x2.append(fake.name())
x3.append(fake.ssn()) # 身份证
x4.append(random.choice('男女'))
x5.append(random.randint(18,25))
x6.append(fake.job())
x7.append(random.randint(0,1000000))
x8.append(random.choice(prod_cd))
x9.append(random.choice(prod_nm))
x10.append(random.choice(channel))
x11.append(date)
#创建数据表
datas = pd.DataFrame({
'user_id':x1,
'name':x2,
'ID_card':x3,
'gender':x4,
'age':x5,
'job':x6,
'salary':x7,
'product_id':x8,
'product':x9,
'channel':x10,
'prt_dt':x11
})
#DataFrame类的to_csv()方法输出数据内容,不保存行索引和列名
datas.to_csv(r'C:\Users\ASUS2021\Desktop\customer.csv',encoding='utf-8',index=False,header=None)
运行结果
利用Python创建伪数据,主要用到的库是faker库。剩余涉及到的知识点:DataFrame类的to_csv()方法
其中还有比较陌生的几个函数:
exec('x'+str(i)+'=[]')
exec函数可以动态运行代码段。fake.random_number(digits=8)
生成随机数字,参数digits设置生成的数字位数。
可能会踩的坑
用Excel双击打开csv,乱码
导出的UTF-8的csv文件,直接用Excel打开可能会出现乱码,这里要解释一下,出现乱码是由于excel默认是gb2312编码或其他形式,需要将其转为utf-8编码形式。
解决办法很简单, 将csv格式文件,用notepad++打开,然后另存为UTF-8格式的csv文件,再用Excel打开,则乱码问题解决。但是调整单元格间距会使分隔符变化,导致下次打开Excel出现问题。解决方法为复制内容到新的Excel中再保存。
Excel打开csv,身份证号,变科学计数法
直接双击打开csv文件,身份证号码默认变成科学计数法,而且这一过程是不可逆的,即使你将单元格格式改为文本,身份证号码也不是原来的那串数字了。
解决办法:
- 新建一个空白Excel文档,【数据】-【从文本/CSV】选择csv文件路径,导入csv文件
- 单击右下角的【转换数据】,加载进入到Power Query编辑器界面。
- 右键【更改类型】-【文本】
- 最后点击主页上的【关闭并上载】,就可以在Excel看到我们的csv数据了。
补充知识点
常用的几个faker库的方法
随机生成名字,地址,邮编,城市,省份等
from faker import Faker
fake = Faker(locale='zh_CN')
print(fake.address()) # 地址
print(fake.name()) # 名字
print(fake.password(special_chars=False)) # 密码
print(fake.ssn()) # 身份证
print(fake.email()) # 邮箱
print(fake.phone_number()) # 手机号码
print(fake.simple_profile()) # 个人信息
faker库的其他方法
伪装IP地址
ipv4()
:随机IP4地址
ipv6()
:随机IP6地址
mac_address()
:随机MAC地址
tld()
:网址域名后缀
uri()
:随机URI地址
uri_extension()
:网址文件后缀
uri_page()
:网址文件(不包含后缀)
uri_path()
:网址文件路径(不包含文件名)
url()
:随机URL地址
user_name()
:随机用户名
isbn10()
:随机ISBN(10位)
isbn13()
:随机ISBN(13位)
伪造自动评论
paragraph()
:随机生成一个段落
paragraphs()
:随机生成多个段落,通过参数nb来控制段落数,返回数组
sentence()
:随机生成一句话
sentences()
:随机生成多句话,与段落类似
text()
:随机生成一篇文章
word()
:随机生成词语
words()
:随机生成多个词语,用法与段落,句子,类似
binary()
:随机生成二进制编码
boolean()
:True/False
language_code()
:随机生成两位语言编码
locale()
:随机生成语言/国际 信息
伪装个人信息
msisdn()
:移动台国际用户识别码,即移动用户的ISDN号码
phone_number()
:随机生成手机号
phonenumber_prefix()
:随机生成手机号段
profile()
:随机生成档案信息
simple_profile()
:随机生成简单档案信息
first_name()
:随机姓
first_name_female()
:女性名
first_name_male()
:男性名
first_romanized_name()
:罗马名
last_name()
:姓
last_name_female()
:女
last_name_male()
:男
last_romanized_name()
:罗马姓氏
name()
:随机生成姓名
name_female()
:男性姓名
name_male()
:女性姓名
romanized_name()
:罗马名
msisdn()
:移动台国际用户识别码,即移动用户的ISDN号码
phone_number()
:随机生成手机号
phonenumber_prefix()
:随机生成手机号段
profile()
:随机生成档案信息
simple_profile()
:随机生成简单档案信息
email()
:随机生成电邮地址
ascii_company_email()
:随机ASCII公司邮箱名
ascii_email()
:随机ASCII邮箱
ascii_free_email()
:随机ASCII免费邮箱
ascii_safe_email()
:随机ASCII安全邮箱
company_email()
:随机公司邮箱
domain_name()
:生成域名
domain_word()
:域词(即,不包含后缀)
free_email()
:免费邮箱
free_email_domain()
:免费邮箱域名
safe_email()
:安全邮箱
ssn()
:生成身份证号
生成浏览器信息
chrome()
:生成Chrome的浏览器user_agent信息
firefox()
:生成FireFox的浏览器user_agent信息
internet_explorer()
:生成IE的浏览器user_agent信息
opera()
:生成Opera的浏览器user_agent信息
safari()
:生成Safari的浏览器user_agent信息
linux_platform_token()
:Linux信息
账户加密伪装
md5()
:随机生成MD5
null_boolean()
:NULL/True/False
password()
:随机生成密码,可选参数:length:密码长度;special_chars:是否能使用特殊字符;digits:是否包含数字;upper_case
:是否包含大写字母;lower_case
:是否包含小写字母
sha1()
:随机SHA1
sha256()
:随机SHA256
地理位置伪装
country()
:国家
province()
:省份
city_suffix()
:市,县
district()
:区
street_address()
:街道地址
street_name()
:街道名
street_suffix()
:街、路
country_code()
:国家编码
postcode()
:邮编
geo_coordinate()
:地理坐标
longitude()
:经度
latitude()
:纬度
am_pm()
:AM/PM
数字随机
numerify()
:生成三位随机数
random_digit()
:生成0~9随机数
random_digit_not_null()
:生成1~9的随机数
random_element()
:生成随机字母
random_int()
:随机数字,默认0~9999,可通过min,max参数修改
random_letter()
:随机字母
random_number()
:随机数字,参数digits设置生成的数字位数
颜色随机
color_name()
:随机颜色名
hex_color()
:随机HEX颜色
rgb_color()
:随机RGB颜色
safe_color_name()
:随机安全色名
safe_hex_color()
:随机安全HEX颜色
公司信息伪装
bs()
:随机公司服务名
company()
:随机公司名(长)
company_prefix()
:随机公司名(短)
company_suffix()
:公司性质
credit_card_expire()
:随机信用卡到期日
credit_card_full()
:生成完整信用卡信息
credit_card_number()
:信用卡号
credit_card_provider()
:信用卡类型
credit_card_security_code()
:信用卡安全码
currency_code()
:货币编码
时间
century()
:随机世纪
date()
:随机日期
date_between()
:随机生成指定范围内日期,参数:start_date
,end_date
date_between_dates()
:随机生成指定范围内日期,用法同上
date_object()
:随机生成从1970-1-1到指定日期的随机日期。
date_this_month()
:随机生成当前月的某一日
date_this_year()
:随机生成今年的某一日
date_time()
:随机生成指定时间(1970年1月1日至今)
date_time_ad()
:生成公元1年到现在的随机时间
date_time_between()
:用法同dates
future_date()
:未来日期
future_datetime()
:未来时间
month()
:随机月份
month_name()
:随机月份(英文)
past_date()
:随机生成已经过去的日期
past_datetime()
:随机生成已经过去的时间
time()
:随机24小时时间
timedelta()
:随机获取时间差
time_object()
:随机24小时时间,time对象
time_series()
:随机TimeSeries对象
timezone()
:随机时区
unix_time()
:随机Unix时间
year()
:随机年份
扩展名伪装
file_extension()
:随机文件扩展名
file_name()
:随机文件名(包含扩展名,不包含路径)
file_path()
:随机文件路径(包含文件名,扩展名)
mime_type()
:随机mime Type
参考资料:
- exec相关可以看官方文档:https://docs.python.org/3/library/functions.html#exec
- 使用faker库生成随机数据:https://blog.csdn.net/adorable_/article/details/111997189
- Excel打开csv后身份证号码处理:https://zhuanlan.zhihu.com/p/388582211
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本