造数神器 python-faker
造数神器 python-faker
faker简介
项目测试时,为了测试常需要造假数据,经常要尽量的模拟真实环境,通常要费大量手工而且造出来的数据,而且通常手工造出来的看起来也很别扭,费时又费事,有没有更好的办法?有,Faker这个造数神器,可以满足你对模拟数据的所有需求。
Faker是一个神奇的python第三方库,可以帮助我们自动生成各种看似真实的假数据,例如:用户信息类、网络基础信息类、浏览器信息类、文件信息类、数字类、文本加密类、时间信息类、其他类别等。
可以在需要大量测试数据的场景下,通过脚本生成快速生成尽可能接近真实的测试数据,节约造数成本。
docs:https://faker.readthedocs.io/en/master/
github:https://github.com/joke2k/faker
安装与命令行使用
安装
版本:
python3.5+
pip
安装:$ pip3 install Faker
验证是否安装成功
$ faker --version faker 5.6.1
命令行使用
常用命令行参数
命令行参数 | 说明 |
---|---|
-h ,--help
|
显示帮助信息 |
--version
|
显示版本信息 |
-o [output]
|
输出重定向到指定文件 |
-l [LOCALE] ,--lang [LOCALE]
|
指定使用的语言包,不同的语言包随机生成的不一样 |
-r [REPEAT] ,--repeat [REPEAT]
|
指定生成的数量 |
-s [SEP] ,--sep [SEP]
|
在生成结果中插入指定的分隔符 |
-i [INCLUDE ...] ,--include [INCLUDE ...]
|
指定自定义假数据生成器 (这里填你的假数据生成器的包路径,进行一个导包操作) |
常用命令
可以通过命令行调用faker,直接生成伪数据或者将伪数据写入到指定文件,等等。
指定语言包
# 指定语言包,简体中文,zh_CN,生成人物描述信息(profile) $ faker -l zh_CN profile {'job': '保险业务经理/主管', 'company': '天益传媒有限公司', 'ssn': '220106196002131103', 'residence': '河南省广州县上街澳门街P座 643244', 'current_location': (Decimal('-66.54')), 'blood_group': 'AB-', 'website': ['http://www.er.cn/', 'https://www.xiulan.cn/', 'https://www.shen.cn/', 'https://ot.cn/'], 'username': 'vzhu', 'name': '王萍', 'sex''F', 'address': '山东省永安市黄浦齐齐哈尔路O座 451034', 'mail': 'majing@yahoo.com', 'birthdate': datetime.date(1967, 7, 15)}# 生成只有name,sex,birthdate,address的人物描述信息(profile) $ faker -l zh_CN profile name,sex,birthdate,address {'name': '张岩', 'sex': 'F', 'address': '甘肃省武汉县龙潭江街e座 854752', 'birthdate': datetime.date(1939, 12, 6)}# 不指定地区,默认英文,en_US $ faker profile name,sex,birthdate,address {'name': 'Scott Griffin', 'sex': 'M', 'address': '4788 Stanley Motorway\nBellside, NH 64281', 'birthdate': datetime.date(1988, 12, 12)}
指定数量的数据,指定生成结果的分隔符
# 生成五个手机号码,默认分隔符为换行符 $ faker -l zh_CN phone_number -r 5 1320679037718066048764150562301231556611575015903470404 # 指定分割隔符,不指定则默认为换行符 $ faker -l zh_CN phone_number -r 5 -s ',' 18941094668, 15098259791, 14708023002, 13798344417, 15726018159,
生成数据输出到指定文件
$ faker -l zh_CN phone_number -r 100 -s '' -o /faker_demo/phone_number.xls
faker的python使用
经典例子
使用
faker.Faker()
创建和初始化一个faker
生成器,可通过访问你想要的数据类型来命名的属性生成的数据。from faker import Faker# 1.创建和初始化一个faker生成器,地区为中国 fake = Faker('zh_CN')# 生成name假数据 name = fake.name() print(f'Randomly generate fake name, 生成name假数据:{name}')# 生成地址假数据 address = fake.address() print(f'Randomly generate fake address, 生成地址假数据:{address}')# 生成一段废话 text = fake.text() print(f'Randomly generate rubbish, 生成一段废话:{text}')
输出
Randomly generate fake name:李红 Randomly generate fake address:湖北省刚县海陵兴城路E座 381931 Randomly generate rubbish:现在可以类型不断方法更多日本.一般你们发表简介. 次数行业建设对于我的.只是一定社会汽车.大小本站所有软件. 继续什么游戏用户.服务空间之后完成商品记者网上.环境全国而且汽车. 业务无法这里以上成功.评论位置电话可是学习必须自己但是.能够方法法律正在软件城市一定而且. 电子名称可是正在成为加入留言.次数怎么提高程序登录.
常见语言项
目前faker支持78种语言包,Faker可以将语言环境作为可选参数,以返回本地化的数据。
zh_CN - Chinese (China Mainland)
zh_TW - Chinese (China Taiwan)
en_US - English (United States)
fr_FR - French
ko_KR - Korean
ru_RU - Russian
ja_JP - Japanese
多语言环境
v3.0.0
版本后支持支持多种语言环境。locals = ['zh_CN', 'ja_JP', 'ko_KR', 'en_US'] fake = Faker(locals) for _ in range(10):print(fake.name())
输出
안지현 鈴木 真綾 中島 裕樹 刘华 小林 里佳 杜桂芝 魏红梅 赵桂芳 김예지 佐藤 翼
常见造数方法
个别方法具有针对性,与语言项有关。
人物相关 person
fake.name() # 姓名,赵飞
fake.last_name() # 姓,庞
fake.first_name() # 名字,杰# 只有部分语言包有罗马文方法
fake.romanized_name() # 姓名(罗马文),Jing Du
fake.last_romanized_name() # 姓(罗马文),Zhong
fake.first_romanized_name() # 名字(罗马文),Yangfake.name_female() # 姓名(女),Mary Garza
fake.last_name_female() # 姓(女),Crawford
fake.first_name_female() # 名字(女),Catherine
fake.prefix_female() # 称谓(女),英文国家使用较多, Ms./Miss./Mrs.fake.name_male() # 姓名(男),James White
fake.last_name_male() # 姓(男),Garcia
fake.first_name_male() # 名字(男),Michael
fake.prefix_male() # 称谓(女),英文国家使用较多, Mr.
电话相关 phone_nubmber
fake.country_calling_code() # 国际号段,'+229'
fake.msisdn() # 完整手机号码(加了国家和国内区号)
fake.phone_number() # 手机号,'13440672022'
fake.phonenumber_prefix() # 号段,'137'(中文包有该方法)
时间相关 date_time
# 日期字符串(可设置格式和最大日期)
fake.date(pattern="%Y-%m-%d", end_datetime=None) # '1994-09-30'
# 时间字符串(可设置格式和最大日期时间)
fake.time(pattern="%H:%M:%S", end_datetime=None) # '01:13:52'# 出生日期,return的实际是fake.date_time_ad().date()
fake.date_of_birth(tzinfo=None, minimum_age=0, maximum_age=115) # 1946-02-09# 日期对象(可设置限定范围),return的实际是fake.date_between_dates()
fake.date_between(start_date="-30y", end_date="today") # 2003-03-31
# 日期对象(可设置限定范围),return的实际是fake.date_time_between_dates().date()
fake.date_between_dates(date_start=None, date_end=None) # 2021-01-26# 日期时间对象(可设置范围)
fake.date_time_between(start_date="-30y", end_date="now", tzinfo=None) # 2011-09-09 03:05:15
# 日期时间对象(可设置范围)
fake.date_time_between_dates(datetime_start=None, datetime_end=None, tzinfo=None) # 2021-01-26 20:56:13# 未来日期,return的实际是fake.date_between_date(start_date='+1d', end_date=end_date),默认是未来30天的某天
fake.future_date(end_date="+30d", tzinfo=None) # 2021-02-07
# 未来日期时间,return的实际是fake.date_time_between(start_date='+1s', end_date=end_date, tzinfo=tzinfo)
# 默认是当前时间后1秒-30天后的某个时间
fake.future_datetime(end_date="+30d", tzinfo=None) # 2021-02-03 05:59:43# 过去日期,return的实际是fake.date_between(start_date=start_date, end_date='-1d'),默认是过去30天-昨天的某天
fake.past_date(start_date="-30d", tzinfo=None) # 2021-01-21
# 过去日期时间,return的实际是fake.self.date_time_between(start_date=start_date, end_date='-1s', tzinfo=tzinfo)
# 默认是默认是前30天-当前时间前1秒的某个时间
fake.past_datetime(start_date="-30d", tzinfo=None) # 2021-01-04 14:53:27
地址相关 address
province(),district(),city_name(),方法适用中国,但不适用美国及其他一些国家,具体可查看Localized Providers中的方法。
# 地址,address_formats = ("{{province}}{{city}}{{district}}{{street_address}} {{postcode}}",)
fake.address() # '湖北省荆门县安次巢湖街L座 421492'fake.country() # 国家名称,'乌克兰'
fake.country_code(representation="alpha-2") # 国家二字码,三字码(representation="alpha-3"),'BZ' fake.city() # 完整城市名(city_suffixes = ("市", "县")),'福州县'
fake.city_name() # 城市名字(不带市县),哈尔滨
fake.city_suffix() # 城市后缀名(中文简体,city_suffixes = ("市", "县"))fake.district() # 区,'徐汇'
fake.postcode() # 邮编,'761944'
fake.province() # 省,台湾省fake.street_address() # 街道地址(street_suffixes = ("街", "路")),'南昌街e座'
fake.street_name() # 街道名称,'沈阳路'
fake.street_suffix() # 街道后缀名,'街'
fake.building_number() # 楼名,'v座'
条形码 barcode
fake.ean(length=13) # 自定义位数条码,只能选8或者13,'9133134950963'
fake.ean13() # 13位条码,'8190173920161'
fake.ean8() # 8位条码,'12771363'
身份证相关 ssn
fake.ssn(min_age=18, max_age=90) # 身份证号码,'350525197603116544'
字符相关
可以利用这些方法,快速定制特定规则的字符串,在自定义组件中可以灵活使用。
根据text规则生成一个字符串,其中每个占位符都被替换
# 每个(#)替换为随机数字(0至9),每个(?)替换为letters中的随机字符
fake.bothify(text='??####', letters=string.ascii_uppercase) # XF3735# 每个(?)替换为letters中的随机字符
fake.lexify(text='????', letters=string.ascii_letters) # YUVD# 每个(#)替换为随机数字(0至9),每个(%)替换为随机的非零数字(1到9),每个(!)替换为随机数字或空字符串,每个(@)处替换为随机的非零数字或空字符串
fake.numerify(text='# % ! @') # 5 7 7 1
造数原理
在IDE中右键查看
name()
的具体实现逻辑,提示“Cannot find declaration to go on”,没有跳转到具体实现逻辑中。这与Faker的工厂设计模式有关。
上述介绍的几种造数方法实际上都是通过工厂模式,将所有的方法和属性加载到对应的语言包中,也就说Faker的属性和方法实际是在另外一个地方存放着,在使用的时候在拿过来,所以Faker的本身类看起来简洁。
那么外部的语言包都长什么模样?
- 可以看出在外部有一个provider包,包里面对应很多个方法归类包,在往内部层级就是对应每个语言包下的方法。
具体方法的内部表现形式是如何的?
可以发现基本是以元祖的方式存放的原始数据,我们方法运行后最终的结果都是来自于此,大部分方法的实现逻辑是使用
random
这个基本库来实现的。可以看到在
faker.providers.address.Provider
中,provinces
是包含了台湾省、香港特别行政区、澳门特别行政区,国土没争议实锤,哈哈哈!
faker内部运行逻辑
具体源码解析可以参考:https://www.cnblogs.com/pujenyuan/p/12615835.html
providers
默认为
en_US
语言包,providers
分为标准providers
的和本土化providers
,本土化providers
个别方法的会有差异或者有所增加,具体可以查看具体语言包的providers
的实现。
标准组件 Standard Providers
类别 | Standard Providers |
---|---|
faker.providers.BaseProvider
|
BaseProvider |
地址 | address |
汽车 | automotive |
银行 | bank |
条形码 | barcode |
颜色 | color |
公司 | company |
信用卡 | credit_card |
货币 | currency |
时间 | date_time |
文件 | file |
坐标 | location |
网络 | internet |
图书编号 | bookNo |
工作 | job |
图像 | paragraph |
编码相关 | encoding |
人物 | person |
电话号码 | phone |
档案相关 | profile |
python相关 | python |
身份证相关 | ssn |
用户代理相关 | user_agent |
本土化组件 Localized Providers
- 具体实现可查看provider的语言包
- 或参考在线文档:https://faker.readthedocs.io/en/master/locales.html#
第三方组件 Community Providers
第三方贡献的开源的providers组件:https://faker.readthedocs.io/en/master/communityproviders.html
自定义provider
faker
除了内置的provider
方法,还可以根据自身需求定制provider
,通过add_provider()
方法增加自定义组件,满足造数需求,自定义的组件需要继承自 BaseProvider
。
此处例子是仿造faker本身的风格,新建一个自定义组件集合包
customize_providers
,在这个包内创建具体自定义组件,组件放在__init__.py
文件中。
创建自定义组件
#!/usr/bin/env python
# -*- coding:utf-8 -*-import string
from faker.providers import BaseProviderclass Provider(BaseProvider):carrier_formats = ('??', '?#')flight_no_suffix_formats = ('####', '###')flight_no_formats = ('{{carrier}}{{flight_no_suffix}}',)aircraft_codes = ('B###', )ac_reg_formats = ('B####', )bay_formats = ('##', '###', '?#', '?##')def carrier(self):"""航司, @example 'O3':return:"""return self.bothify(self.random_element(self.carrier_formats), string.ascii_uppercase)def flight_no_suffix(self):"""航班号除航司后几位字符, @example '5243':return:"""return self.bothify(self.random_element(self.flight_no_suffix_formats), string.ascii_uppercase)def flight_no(self, carrier=None):"""航班号, @example 'HA5806':param carrier::return:"""pattern = self.random_element(self.flight_no_formats)if carrier:pattern = f'{carrier}####'return self.numerify(pattern)return self.generator.parse(pattern)def aircraft_code(self):"""机型, @example 'B052':return:"""return self.numerify(self.random_element(self.aircraft_codes))def ac_reg(self):"""机号, @example 'B7705':return:"""return self.numerify(self.random_element(self.ac_reg_formats))def bay(self):"""机位, @example 'O9':return:"""return self.bothify(self.random_element(self.bay_formats), string.ascii_uppercase)
运用自定义组件造数
#!/usr/bin/env python
# -*- coding:utf-8 -*-import json
from typing import AnyStr, Dict
from faker import Fakerfrom customize_providers.flight import Provider as FlightProviderfake = Faker('zh_CN')
# 将自定义provider添加至fake
fake.add_provider(FlightProvider)class Flight(object):def __init__(self, carrier: AnyStr = None):"""航班对象:param carrier:"""self.carrier = fake.carrier()if carrier:self.carrier = carrierself.flight_no = fake.flight_no(self.carrier)self.ac_type = fake.aircraft_code()self.ac_reg = fake.ac_reg()self.land_bay = fake.bay()self.off_bay = fake.bay()def get_flight_info(self) -> Dict:return self.__dict__flight = Flight()
flight_info = flight.get_flight_info()
print(json.dumps(flight_info, ensure_ascii=False, indent=4))
输出
{"carrier": "T9","flight_no": "T96621","ac_type": "B462","ac_reg": "B4752","land_bay": "744","off_bay": "B4"
}
随机控制
有些场景下,可能需要生成相同的数据集,可以通过seed()
生成相同的种子,使用相同版本的faker
和seed
调用相同的方法将产生相同的结果。
#!/usr/bin/env python
# -*- coding:utf-8 -*-import json
from typing import AnyStr, Dict
from faker import Fakerfrom customize_providers.flight import Provider as FlightProviderfake = Faker('zh_CN')
# 将自定义provider添加至fake
fake.add_provider(FlightProvider)class Flight(object):def __init__(self, carrier: AnyStr = None):"""航班对象:param carrier:"""self.carrier = fake.carrier()if carrier:self.carrier = carrierself.flight_no = fake.flight_no(self.carrier)self.ac_type = fake.aircraft_code()self.ac_reg = fake.ac_reg()self.land_bay = fake.bay()self.off_bay = fake.bay()def get_flight_info(self) -> Dict:return self.__dict__for i in range(1, 11):# 奇数生成相同的种子,生成相同的航班信息if i % 2:Faker.seed(2)else:Faker.seed()flight = Flight()flight_no = flight.flight_noprint(f'flight_no index-{i}: {flight_no}')
输出
flight_no index-1: CC2449
flight_no index-2: A04487
flight_no index-3: CC2449
flight_no index-4: HD0548
flight_no index-5: CC2449
flight_no index-6: H15823
flight_no index-7: CC2449
flight_no index-8: LK1698
flight_no index-9: CC2449
flight_no index-10: EZ0544
造数神器 python-faker相关推荐
- python造数神器-Faker库
在测试过程中,大家肯定会遇到一个很有意思的问题 -- 如何优雅的快速的造数?大部分人起名字都是张三.李四.王五.赵六之类的,或者会用一些自己喜欢的人物,作品,但是遇到需要批量生成测试数据时,起名字等造 ...
- 推荐一款Python开源库,技术人必备的造数据神器!
1. 背景 在软件需求.开发.测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据.由于现在的业务系统数据多种多样,千变万化.在手动制造数据的 ...
- Python批量造数并利用pymysql写入到数据库之multiprocessing多进程、threading多线程实现方式(学习笔记)
1.导包 import random import string import pymysql import time import multiprocessing # multiprocessing ...
- python操作数据表,循环造数100条数据
python操作数据表,循环造数100条数据, 包括number,varchar. ```sql --先建个临时表 CREATE TABLE tempdata_aa( c1 VARCHAR2(30), ...
- python faker库随机假数据介绍
前言 在数据相关的测试中,我们经常会需要去构造数据,随机生成数据.大部分人的写法会是用random 随机生成: 比如我们要生成随机的姓名,我们要构造下面的一段代码: def random_first_ ...
- pytest装饰器实现批量造数
最近的需求需要造1w多的数据,如何用Python代码实现批量造数呢?强大的pytest装饰器可以再次冲出江湖 今天要介绍的就是pytest-repeat,实现重复执行脚本的目的 1.首先安装插件pyt ...
- DataFactory造数-前期准备工作(DF安装、myodbc32的安装与配置、Oracle客户端的安装与配置)
一.DataFactory的安装 具体步骤稍后补充 二.准备工作 造数-mysql数据库 1.下载安装myodbc32驱动 PS:若安装的DataFactory是较低版本,则myodbc32也应选择较 ...
- jmeter连接数据库查询获取多个参数, 并通过参数化传值,实现jmeter造数
场景: 通过查询数据库, 获取多个参数, 比把这些参数循环插入数据库, 实现jmeter造数 一.数据库连接JDBC驱动下载 我用的是mysql数据库,所以安装时用的mysql-connector-j ...
- 【存储过程造数mysql】
存储过程造数mysql DELIMITER // -- 还是声明分隔符 DROP PROCEDURE IF EXISTS `batch_insert`; -- 若存储过程存在,则删除 CREATE P ...
最新文章
- XPath与多线程爬虫
- 内存查看工具RAMMAP说明
- 使用Spring Cloud休息客户电话
- mysql把某一列的数据更新到另一列中(涉及到多张表的数据)
- android学习笔记---56_activity切换动画与页面切换动画,自定义activity窗口切换动画效果的实现.
- Eclipse 编译C++
- 线性代数及其应用(part2)--特征方程
- china-pub近期免费赠书活动大汇总
- 华硕ARMOURY CRATE奥创安装/风扇快捷键问题
- Excel数据分析高级技巧②——数据透视表(组合/切片器/计算字段/数据透视图/条件格式)
- 探索图片透明度叠加方式
- 2019年任正非给全体华为员工的信
- 如何申请注册Tom企业邮箱,教程详解来袭
- 斐讯E1刷K2版老毛子Padavan,完美实现中继教程
- 通过EasyPOI导入excel数据
- IDEA使用Maven构建Spring+SpringMVC+MyBatis整合项目demo成功执行但控制台Tomcat Locahost log输出No Spring WebApplicationIn
- 美的苏宁“超级带货趴”来袭,养成带货达人,大牌净味冰箱带回家
- 2023最新最新ChatGPT超全面从基础到实战视频教程/有兴趣自己学
- 颜色的前世今生13·RGB显色系统详解(下)
- 知云文献翻译打不开_知云文献翻译 for mac v1.0.1
热门文章
- centos6.6安装RTL8139网卡驱动若干问题
- SMT贴片加工的主要流程解析?
- 台式计算机噪声,台式电脑主机突然发出很大的噪音怎么办呢
- 任务管理器无法结束进程解决办法
- 新狼邮箱服务器,搭建简单的邮件服务器+动态域名在互联网中使用
- 还能如期发布新车吗?法拉第未来两高管离职
- ChirpStack应用服务器的使用
- 关于uni-app的webview
- pytorch每日一学10(torch.set_printoptions())更改打印设置
- MySQL基础 (SQLyog)尚硅谷婷姐 学习笔记整理