文章开篇
Python的魅力,犹如星河璀璨,无尽无边;人生苦短、我用Python!
Faker简介
在开发项目中,为了测试需要模拟真实环境并生成数据时,手工造数可能效率低下且结果不自然;
Faker库可以帮助我们快速、高效和自然的生成各种类型的虚假数据;
如例如姓名、地址、电子邮件、电话号码、日期、时间、银行卡号、IP地址等;
官方项目地址见:https://github.com/joke2k/faker
官方文档地址见:https://faker.readthedocs.io/en/master/index.html
安装Faker库
Faker属于第三方Python库,使用前需要额外下载安装,命令如下;
pip install faker
使用Faker包
Faker包支持多种语言和地区,默认情况下为英语;
如果需要生成其他语言或地区的虚假数据,可以在实例化Faker类时指定语言和地区;
介绍几个比较常见的地区代号:
- 简体中文:zh_CN
- 繁体中文:zh_TW
- 美国英文:en_US
- 英国英文:en_GB
- 德文:de_DE
- 日文:ja_JP
- 韩文:ko_KR
- 法文:fr_FR
安装完成后,可以在python文件中导入faker库,示例如下:
# 导入Faker库的方式
from faker import Faker
# 默认实例化,生成en_US美国文化
faker = Faker()
print("生成姓名", faker.name()) # Tina Wright
print("生成手机", faker.phone_number()) # (349)583-8198x71583
print("生成邮箱", faker.email()) # jacobscarolyn@example.net
# 指定地区实例化,生成zh_CN中国文化
faker = Faker(locale="zh_CN")
print("生成姓名", faker.name()) # 李敏
print("生成手机", faker.phone_number()) # 13981229037
print("生成邮箱", faker.email()) # mingyan@example.net
虚拟数据生成方法分类词典
classifier_dict = {
'人物': {
'姓名': 'fake.name()',
'姓名(男)': 'fake.name_male()',
'姓名(女)': 'fake.name_female()',
'姓': 'fake.last_name()',
'名字': 'fake.first_name()',
'名字(男)': 'fake.first_name_male()',
'名字(女)': 'fake.first_name_female()',
},
'地址': {
'地址': 'fake.address()',
'楼名': 'fake.building_number()',
'完整城市名': 'fake.city()',
'城市名字(不带市县)': 'fake.city_name()',
'城市后缀名': 'fake.city_suffix()',
'国家名称': 'fake.country()',
'地区': 'fake.district()',
'邮编': 'fake.postcode()',
'省': 'fake.province()',
'街道地址': 'fake.street_address()',
'街道名称': 'fake.street_name()',
'街道后缀名': 'fake.street_suffix()',
'国家编号': 'fake.country_code(representation="alpha-2")',
},
'条形码': {
'EAN条形码': 'fake.ean(length=13)',
'EAN13条形码': 'fake.ean13()',
'EAN8条形码': 'fake.ean8()'
},
'汽车': {
'牌照': 'fake.license_plate()'
},
'银行': {
'银行所属国家': 'fake.bank_country()',
'基本银行账号': 'fake.bban()',
'国际银行代码': 'fake.iban()'
},
'颜色': {
'颜色名称': 'fake.color_name()',
'颜色十六进制值': 'fake.hex_color()',
'颜色RGB值': 'fake.rgb_color()',
'CSS颜色值': 'fake.rgb_css_color()',
'安全色': 'fake.safe_color_name()',
'安全色十六进制值': 'fake.safe_hex_color()'
},
'公司': {
'商业用词': 'fake.bs()',
'妙句(口号)': 'fake.catch_phrase()',
'公司名称': 'fake.company()',
'公司名称前缀': 'fake.company_prefix()',
'公司名称后缀': 'fake.company_suffix()',
'职位': 'fake.job()'
},
'信用卡': {
'过期年月': 'fake.credit_card_expire(start="now", end="+10y", date_format="%m/%y")',
'完整信用卡信息': 'fake.credit_card_full(card_type=None)',
'信用卡卡号': 'fake.credit_card_number(card_type=None)',
'信用卡提供商': 'fake.credit_card_provider(card_type=None)',
'信用卡安全码': 'fake.credit_card_security_code(card_type=None)'},
'货币': {
'加密货币代码+名称': 'fake.cryptocurrency()',
'加密货币代码': 'fake.cryptocurrency_code()',
'加密货币名称': 'fake.cryptocurrency_name()',
'货币代码+名称': 'fake.currency()',
'货币代码': 'fake.currency_code()',
'货币名称': 'fake.currency_name()'
},
'时间': {
'AM或PM': 'fake.am_pm()',
'世纪': 'fake.century()',
'日期字符串(可设置格式和最大日期)': 'fake.date(pattern="%Y-%m-%d", end_datetime=None)',
'日期(可设置限定范围)': 'fake.date_between(start_date="-30y", end_date="today")',
'日期(可设置最大日期)': 'fake.date_object(end_datetime=None)',
'出生日期': 'fake.date_of_birth(tzinfo=None, minimum_age=0, maximum_age=115)',
'本世纪日期': 'fake.date_this_century(before_today=True, after_today=False)',
'本年代中的日期': 'fake.date_this_decade(before_today=True, after_today=False)',
'本月中的日期': 'fake.date_this_month(before_today=True, after_today=False)',
'本年中的日期': 'fake.date_this_year(before_today=True, after_today=False)',
'日期和时间': 'fake.date_time(tzinfo=None, end_datetime=None)',
'日期和时间(从001年1月1日到现在)': 'fake.date_time_ad(tzinfo=None, end_datetime=None, start_datetime=None)',
'日期时间(可设置限定范围)': 'fake.date_time_between(start_date="-30y", end_date="now", tzinfo=None)',
'本世纪中的日期和时间': 'fake.date_time_this_century(before_now=True, after_now=False, tzinfo=None)',
'本年代中的日期和时间': 'fake.date_time_this_decade(before_now=True, after_now=False, tzinfo=None)',
'本月中的日期和时间': 'fake.date_time_this_month(before_now=True, after_now=False, tzinfo=None)',
'本年中的日期和时间': 'fake.date_time_this_year(before_now=True, after_now=False, tzinfo=None)',
'几号': 'fake.day_of_month()',
'星期几': 'fake.day_of_week()',
'未来日期': 'fake.future_date(end_date="+30d", tzinfo=None)',
'未来日期和时间': 'fake.future_datetime(end_date="+30d", tzinfo=None)',
'iso8601格式日期和时间': 'fake.iso8601(tzinfo=None, end_datetime=None)',
'第几月': 'fake.month()', '月份名称': 'fake.month_name()',
'过去日期': 'fake.past_date(start_date="-30d", tzinfo=None)',
'过去日期和时间': 'fake.past_datetime(start_date="-30d", tzinfo=None)',
'时间(可设置格式和最大日期时间)': 'fake.time(pattern="%H:%M:%S", end_datetime=None)',
'时间间隔': 'fake.time_delta(end_datetime=None)',
'时间(可设置最大日期时间)': 'fake.time_object(end_datetime=None)',
'时区': 'fake.timezone()',
'UNIX时间戳': 'fake.unix_time(end_datetime=None, start_datetime=None)',
'某年': 'fake.year()'
},
'文件': {
'文件扩展名': 'fake.file_extension(category=None)',
'文件名': 'fake.file_name(category=None, extension=None)',
'文件路径': 'fake.file_path(depth=1, category=None, extension=None)',
'MIME类型': 'fake.mime_type(category=None)',
'UNIX设备': 'fake.unix_device(prefix=None)',
'UNIX分区': 'fake.unix_partition(prefix=None)'
},
'坐标': {
'坐标': 'fake.coordinate(center=None, radius=0.001)',
'纬度': 'fake.latitude()',
'经纬度': 'fake.latlng()',
'返回某个国家某地的经纬度': 'fake.local_latlng(country_code="US", coords_only=False)',
'返回地球上某个位置的经纬度': 'fake.location_on_land(coords_only=False)',
'经度': 'fake.longitude()'
},
'网络': {
'企业邮箱(ascii编码)': 'fake.ascii_company_email()',
'企业邮箱+免费邮箱(ascii编码)': 'fake.ascii_email()',
'免费邮箱(ascii编码)': 'fake.ascii_free_email()',
'安全邮箱(ascii编码)': 'fake.ascii_safe_email()',
'企业邮箱': 'fake.company_email()',
'域名': 'fake.domain_name(levels=1)',
'二级域名': 'fake.domain_word()',
'企业邮箱+免费邮箱': 'fake.email()',
'免费邮箱': 'fake.free_email()',
'免费邮箱域名': 'fake.free_email_domain()',
'主机名': 'fake.hostname()',
'图片URL': 'fake.image_url(width=None, height=None)',
'ipv4': 'fake.ipv4(network=False, address_class=None, private=None)',
'ipv4网络等级': 'fake.ipv4_network_class()',
'私有ipv4': 'fake.ipv4_private(network=False, address_class=None)',
'公共ipv4': 'fake.ipv4_public(network=False, address_class=None)',
'ipv6': 'fake.ipv6(network=False)',
'MAC地址': 'fake.mac_address()',
'安全邮箱': 'fake.safe_email()',
'URL中的slug': 'fake.slug()',
'顶级域名': 'fake.tld()', 'URI': 'fake.uri()',
'URI扩展': 'fake.uri_extension()',
'URI页': 'fake.uri_page()',
'URI路径': 'fake.uri_path(deep=None)',
'URL': 'fake.url(schemes=None)',
'用户名': 'fake.user_name()'
},
'图书': {
'ISBN-10图书编号': 'fake.isbn10(separator="-")',
'ISBN-13图书编号': 'fake.isbn13(separator="-")'
},
'文本': {
'单个段落': 'fake.paragraph(nb_sentences=3, variable_nb_sentences=True, ext_word_list=None)',
'多个段落': 'fake.paragraphs(nb=3, ext_word_list=None)',
'单个句子': 'fake.sentence(nb_words=6, variable_nb_words=True, ext_word_list=None)',
'多个句子': 'fake.sentences(nb=3, ext_word_list=None)',
'单个文本': 'fake.text(max_nb_chars=200, ext_word_list=None)',
'多个文本': 'fake.texts(nb_texts=3, max_nb_chars=200, ext_word_list=None)',
'单个词语': 'fake.word(ext_word_list=None)',
'多个词语': 'fake.words(nb=3, ext_word_list=None, unique=False)'
},
'电话': {
'完整手机号码(加了国家和国内区号)': 'fake.msisdn()',
'手机号': 'fake.phone_number()',
'区号': 'fake.phonenumber_prefix()'
},
'个人档案': {
'档案(完整)': 'fake.profile(fields=None, sex=None)',
'档案(简单)': 'fake.simple_profile(sex=None)'},
'身份证': {
'身份证号': 'fake.ssn(min_age=18, max_age=90)'
},
'用户设备/代理/浏览器等属性': {
'安卓': 'fake.android_platform_token()',
'Chrome UA': 'fake.chrome(version_from=13, version_to=63, build_from=800, build_to=899)',
'FireFox UA': 'fake.firefox()',
'IE UA': 'fake.internet_explorer()',
'ios': 'fake.ios_platform_token()',
'Linux': 'fake.linux_platform_token()',
'Linux处理器': 'fake.linux_processor()',
'Mac': 'fake.mac_platform_token()',
'Mac处理器': 'fake.mac_processor()',
'Opera UA': 'fake.opera()',
'Safari UA': 'fake.safari()',
'随机用户代理': 'fake.user_agent()',
'Windows': 'fake.windows_platform_token()'
}
}
实战应用
from faker import Faker
fake = Faker("zh-CN")
for i in range(20):
name = fake.name()
company = fake.company()
job = fake.job()
id_card = fake.ssn(min_age=18, max_age=60)
phone = fake.phone_number()
print('公司:'+ company + ' | 职位:'+ job + ' | 姓名:' + name+ ' | 身份证:' + id_card + ' | 手机号码:' + phone)
# 公司:双敏电子传媒有限公司 | 职位:服装/纺织设计 | 姓名:张秀云 | 身份证:37068220020912490X | 手机号码:15653550740
# 公司:天益信息有限公司 | 职位:人事主管 | 姓名:哈瑜 | 身份证:35040019851025128X | 手机号码:13990390364
# 公司:华远软件传媒有限公司 | 职位:车身/造型设计 | 姓名:左志强 | 身份证:211002197003255493 | 手机号码:15029907380
# 公司:彩虹科技有限公司 | 职位:杂工 | 姓名:尹志强 | 身份证:331102197910247537 | 手机号码:18980518908
# 公司:襄樊地球村信息有限公司 | 职位:工业/产品设计 | 姓名:王阳 | 身份证:350503199203140407 | 手机号码:18943392782
# 公司:海创科技有限公司 | 职位:快递员 | 姓名:高凯 | 身份证:610327197502281140 | 手机号码:15202120026
# 公司:精芯传媒有限公司 | 职位:其他 | 姓名:彭桂香 | 身份证:210402200410127291 | 手机号码:15040148354
# 公司:凌颖信息传媒有限公司 | 职位:软件UI设计师/工程师 | 姓名:何磊 | 身份证:410922198310129740 | 手机号码:15343011571
# 公司:济南亿次元科技有限公司 | 职位:汽车电工 | 姓名:刘丽娟 | 身份证:321183200307106546 | 手机号码:18684057434
# 公司:易动力网络有限公司 | 职位:网店/淘宝客服 | 姓名:王雪梅 | 身份证:532929199504299906 | 手机号码:15540607021
# 公司:明腾网络有限公司 | 职位:供应链主管/专员 | 姓名:皮金凤 | 身份证:140108198203263024 | 手机号码:15509985790
# 公司:凌云网络有限公司 | 职位:后勤 | 姓名:陈芳 | 身份证:320830196403227968 | 手机号码:15900107473
# 公司:维旺明传媒有限公司 | 职位:合规经理 | 姓名:宋想 | 身份证:44050719870612732X | 手机号码:15051973835
# 公司:海创信息有限公司 | 职位:储备经理人 | 姓名:张艳 | 身份证:141129197912072974 | 手机号码:18579376434
# 公司:鑫博腾飞科技有限公司 | 职位:砌筑工 | 姓名:刘超 | 身份证:530425198611079758 | 手机号码:13620924319
# 公司:七喜信息有限公司 | 职位:电声/音响工程师/技术员 | 姓名:周淑华 | 身份证:51070319771223688X | 手机号码:18027995426
# 公司:济南亿次元网络有限公司 | 职位:订单处理员 | 姓名:韦雪梅 | 身份证:511527198911210549 | 手机号码:18214660211
# 公司:新宇龙信息信息有限公司 | 职位:礼仪/迎宾 | 姓名:董丹丹 | 身份证:51050419841205032X | 手机号码:13029593994
# 公司:联通时科网络有限公司 | 职位:技术总监/经理 | 姓名:胡瑜 | 身份证:210804197501016300 | 手机号码:18848038227
# 公司:惠派国际公司网络有限公司 | 职位:固废工程师 | 姓名:池娜 | 身份证:620601197303305650 | 手机号码:15138027012
真实代码封装
1.常用数据生成封装
# -*- coding: utf-8 -*-
"""
@WorkNo : CS4224
@Author : yangkai
@Email : yangkai1@dev.bosc
@Project : PythonWorkspace
@Module : FakerUtils.py
@DateTime: 2024/2/28 12:21
"""
from faker import Faker
import datetime
# 随机姓名
def generate_name1():
fake = Faker("zh_CN")
name_list = [fake.name() for _ in range(10)]
return name_list
# 随机姓名
def generate_name2():
fake = Faker('zh_CN')
return fake.name()
# 随机手机号
def generate_phone_number():
fake = Faker('zh_CN')
return fake.phone_number()
# 随机身份证
def generate_id_number():
fake = Faker('zh_CN')
return fake.ssn(min_age=18, max_age=60)
# 随机银行卡
def generate_card_number():
fake = Faker('zh_CN')
return fake.credit_card_number()
# 随机带邮政编码的地址
def generate_addres():
fake = Faker(locale="zh-CN")
return fake.address()
# 随机生成公司名称
def generate_company():
fake = Faker(locale="zh-CN")
return fake.company()
# 随机生成邮箱
def generate_email():
fake = Faker(locale="zh-CN")
return fake.email()
# 获取职称
def generate_job():
fake = Faker(locale="zh-CN")
return fake.job()
# 获取省份
def generate_province():
fake = Faker(locale="zh-CN")
return fake.province()
# 随机获取城市
def generate_city():
fake = Faker(locale="zh-CN")
return fake.city()
# 随机获取国家
def generate_country():
fake = Faker(locale="zh-CN")
return fake.country()
# 生成一篇文章
def generate_text():
fake = Faker(locale="zh-CN")
return fake.text()
# 生成一个六位随机数
def generate_random_num():
fake = Faker(locale="zh-CN")
return fake.random_int(min=000000, max=999999)
# 当前时间年月日
def generate_now_date():
now_date = (datetime.datetime.now() + datetime.timedelta()).strftime("%Y-%m-%d")
return now_date
# 当前时间后5天
def generate_date_add():
date_add = (datetime.datetime.now() + datetime.timedelta(days=5)).strftime("%Y-%m-%d")
return date_add
# 当前时间年月日时分秒
def generate_ymdhms():
# ymdhms = time.strftime('%Y-%m-%d %H_%M_%S')
ymdhms = (datetime.datetime.now() + datetime.timedelta()).strftime("%Y-%m-%d %H_%M_%S")
return ymdhms
# 自定义年月日格式 年月日 时分秒
def generate_date_time_between():
fake = Faker(locale="zh-CN")
return fake.date_time_between(start_date="-3y", end_date="-1y")
# 自定义时间范围,3年前到1年前之间的
def generate_date_between():
fake = Faker(locale="zh-CN")
return fake.date_between(start_date="-3y", end_date="-1y")
# 获取未来时间 年月日
def generate_future_date():
fake = Faker(locale="zh-CN")
return fake.future_date()
# 获取未来时间,年月日 时分秒
def generate_future_datetime():
fake = Faker(locale="zh-CN")
return fake.future_datetime()
# 随机星期几
def generate_week():
fake = Faker(locale="zh-CN")
return fake.day_of_week()
# 随机上午下午
def generate_am_pm():
fake = Faker(locale="zh-CN")
return fake.am_pm()
if __name__ == '__main__':
name1 = generate_name1()
name2 = generate_name2()
phone_number = generate_phone_number()
id_number = generate_id_number()
card_number = generate_card_number()
address = generate_addres()
company = generate_company()
email = generate_email()
job = generate_job()
province = generate_province()
city = generate_city()
country = generate_country()
text = generate_text()
random_num = generate_random_num()
now_date = generate_now_date()
date_add = generate_date_add()
ymdhms = generate_ymdhms()
date_time_between = generate_date_time_between()
date_between = generate_date_between()
future_date = generate_future_date()
future_datetime = generate_future_datetime()
week = generate_week()
am_pm = generate_am_pm()
print(f'【随机姓名为】:{name1}')
print(f'【随机姓名为】:{name2}')
print(f'【随机手机号】:{phone_number}')
print(f'【随机身份证】:{id_number}')
print(f'【随机银行卡]: {card_number}')
print(f'【随机地址】: {address}')
print(f'【随机公司名称】: {company}')
print(f'【随机生成邮箱】: {email}')
print(f'【获取职称】: {job}')
print(f'【获取省份】: {province}')
print(f'【随机获取城市】: {city}')
print(f'【随机获取国家】: {country}')
print(f'【随机生成文章】: {text}')
print(f'【生成一个六位随机数】: {random_num}')
print(f'【当前时间年月日】:{now_date}')
print(f'【当前时间后5天】:{date_add}')
print(f'【当前时间年月日时分秒】:{ymdhms}')
print(f'【自定义年月日格式 年月日 时分秒】: {date_time_between}')
print(f'【自定义时间范围,3年前到1年前之间的】: {date_between}')
print(f'【获取未来时间 年月日】: {future_date}')
print(f'【获取未来时间,年月日 时分秒】:{future_datetime}')
print(f'【随机星期几】:{week}')
print(f'【随机上午下午】:{am_pm}')
# 输出内容如下:
# 【随机姓名为】:['周建军', '苏莉', '郭淑珍', '石璐', '李杨', '刘丹丹', '陈荣', '张凤兰', '黄洁', '高杰']
# 【随机姓名为】:李玉华
# 【随机手机号】:15196465992
# 【随机身份证】:340400198806249355
# 【随机银行卡]: 675920649463
# 【随机地址】: 重庆市雪梅县房山贵阳街J座 126277
# 【随机公司名称】: 襄樊地球村信息有限公司
# 【随机生成邮箱】: jun97@example.org
# 【获取职称】: 营养师
# 【获取省份】: 江苏省
# 【随机获取城市】: 六盘水市
# 【随机获取国家】: 苏里南
# 【随机生成文章】: 资源积分主要无法提供.不能全部教育威望.
# 得到那个位置报告.作为同时东西能够处理.这么方法会员方法电脑最大帮助.
# 要求孩子商品的话质量活动控制一起.为什游戏出来解决.类型关于只是语言.
# 如此表示方式能够.经营所以北京增加.回复你们完成搜索谢谢.
# 开始建设完成事情需要看到回复.
# 报告是一帖子安全专业资源.下载联系女人自己.
# 的话发展大家.系列没有新闻政府一样大学一切.
# 【生成一个六位随机数】: 772565
# 【当前时间年月日】:2024-02-28
# 【当前时间后5天】:2024-03-04
# 【当前时间年月日时分秒】:2024-02-28 12_47_51
# 【自定义年月日格式 年月日 时分秒】: 2022-06-07 05:20:35
# 【自定义时间范围,3年前到1年前之间的】: 2021-07-16
# 【获取未来时间 年月日】: 2024-03-15
# 【获取未来时间,年月日 时分秒】:2024-03-14 02:04:43
# 【随机星期几】:星期五
# 【随机上午下午】:PM
2.批量创建数据
from faker import Faker
import pandas as pd
from urllib import parse
from pymongo import MongoClient
import pymysql
class Create_Data(object):
def __init__(self):
# 选择中文
fake = Faker('zh_CN')
# 生成数据改变循环体来控制数据量rang(?)
self.data_total = [
[fake.name(), fake.job(), fake.company(), fake.phone_number(), fake.company_email(), fake.address(),
fake.date_time(tzinfo=None)] for x in range(100)]
print(self.data_total)
# 写入excel
def deal_excel(self):
df = pd.DataFrame(self.data_total,
columns=['name', 'job', 'company', 'phone_number', 'company_email', 'address', 'date_time'])
# 保存到本地excel
df.to_excel("data_total.xlsx", index=False)
print("Processing completed to excel")
# 写入txt
def deal_txt(self):
with open('data_total.txt', 'w', errors='ignore', encoding='utf-8') as output:
output.write('name,job,company,phone_number.company_email.address.date_time\n')
for row in self.data_total:
rowtxt = '{},{},{},{}'.format(row[0], row[1], row[2], row[3])
output.write(rowtxt)
output.write('\n')
output.close()
print("Processing completed to txt")
# 写入mongodb
def deal_mongodb(self):
port = 27017
host = 'localhost'
user_name = 'root'
db_name = 'data'
passwd = 'root'
passwd = parse.quote(passwd)
mango_uri = 'mongodb://%s:%s@%s:%s/%s' % (user_name, passwd, host, port, db_name) # 链接时需要指定数据库
conn = MongoClient(mango_uri) # 创建链接
db = conn[db_name] # 连接coder数据库
mongodata = db['data_total']
for val in self.data_total:
mongodata.insert(
{"name": val[0], 'job': val[1], 'company': val[2], 'phone_number': val[3], "company_email": val[4],
'address': val[5], 'date_time': val[6]})
print("Processing completed to mongodb")
# 写入mysql
def deal_mysql(self):
# 打开数据库连接
db = pymysql.connect("localhost", "root", "root", "test2")
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
for val in self.data_total:
sql = "insert into data_total(name,job,company,phone_number,company_email,address,date_time)value ('%s','%s','%s','%s','%s','%s','%s')" % (
val[0], val[1], val[2], val[3], val[4], val[5], val[6])
try:
# 执行sql语句
cursor.execute(sql)
# 执行sql语句
db.commit()
print("insert ok")
except:
# 发生错误时回滚
db.rollback()
# 关闭数据库连接
if __name__ == '__main__':
data = Create_Data()
data.deal_excel()
data.deal_txt()
data.deal_mongodb()
data.deal_mysql()
总结
Python Faker是一个强大的库,可生成各种虚拟数据,适用于开发人员、测试人员和数据分析师。
本文概述了其基本用法、功能和应用场景,并提供示例代码,旨在帮助用户更有效地使用Python Faker提高工作效率。