Python Faker
[TOC]
在软件需求、开发、测试过程中经常需要使用一些测试数据,针对这种情况,开发者一般要么使用已有的系统数据,要么需要手动制造一些数据。然而手动制造数据需要花费大量精力和工作量,Python Faker 能够协助你完成这方面的工作。
1.什么是 Faker
Faker 是一个 Python 包,也是一个开源的 GITHUB 项目,主要用来创建伪数据。使用 Faker 包,无需再手动生成或者手写随机数来生成数据,只需要调用 Faker 提供的方法,即可完成数据的生成。
2.安装 Faker
- 方法一:使用 Python 包管理工具
pip
进行安装
pip install faker
- 方法二:通过访问 Github项目地址 下载编译安装。
推荐采用方法一。
3.Faker 的使用
Faker 的使用较简单,基本就是引包——初始化——调用方法。
3.1 基础使用步骤
步骤1:在 Python 模块中引用 Faker 包;
步骤2:初始化 Faker。
from faker import Faker
# 省略的代码……
f=Faker(locale='zh_CN')
-
初始化参数locale:
locale
参数是对于将要生成数据的文化属性的一个选项,默认为en_US
,只有使用了相关文化,才能生成相对应的随机信息(比如:名字,地址,邮编,城市,省份等)
3.2 可选择的文化信息(按字母顺序排序)
Faker 支持 39 个国家和地区的语言与文化。
- 'ar_EG' - Arabic (Egypt) / 埃及(阿拉伯语)
- 'ar_PS' - Arabic (Palestine) / 巴勒斯坦(阿拉伯语)
- 'ar_SA' - Arabic (Saudi Arabia) / 沙特阿拉伯(阿拉伯语)
- 'bg_BG' - Bulgarian / 保加利亚(保加利亚语)
- 'cs_CZ' - Czech / 捷克(捷克语)
- 'de_DE' - German / 德国(德语)
- 'dk_DK' - Danish / 丹麦(丹麦语)
- 'el_GR' - Greek / 希腊(希腊语)
- 'en_AU' - English (Australia) / 澳大利亚(英语)
- 'en_CA' - English (Canada) / 加拿大(英语)
- 'en_GB' - English (Great Britain) / 英国(英语)
- 'en_US' - English (United States) / 美国(英语)
- 'es_ES' - Spanish (Spain) / 西班牙(西语)
- 'es_MX' - Spanish (Mexico) / 墨西哥(西语)
- 'et_EE' - Estonian / 爱沙尼亚(爱沙尼亚语)
- 'fa_IR' - Persian (Iran) / 伊朗(波斯语)
- 'fi_FI' - Finnish / 芬兰(芬兰语)
- 'fr_FR' - French / 法国(法语)
- 'hi_IN' - Hindi / 印地语
- 'hr_HR' - Croatian / 克罗地亚(克罗地亚语)
- 'hu_HU' - Hungarian / 匈牙利(匈牙利语)
- 'it_IT' - Italian / 意大利(意大利语)
- 'ja_JP' - Japanese / 日本(日语)
- 'ko_KR' - Korean / 韩国(韩语)
- 'lt_LT' - Lithuanian / 立陶宛(立陶宛语)
- 'lv_LV' - Latvian / 拉脱维亚(拉脱维亚语)
- 'ne_NP' - Nepali / 尼泊尔(尼泊尔语)
- 'nl_NL' - Dutch (Netherlands) / 荷兰(荷兰语)
- 'no_NO' - Norwegian / 挪威(挪威语)
- 'pl_PL' - Polish / 波兰(波兰语)
- 'pt_BR' - Portuguese (Brazil) / 巴西(葡萄牙语)
- 'pt_PT' - Portuguese (Portugal) / 葡萄牙(葡萄牙语)
- 'ru_RU' - Russian / 俄罗斯(俄语)
- 'sl_SI' - Slovene / 斯洛文尼亚(斯洛文尼亚语)
- 'sv_SE' - Swedish / 瑞典(瑞典语)
- 'tr_TR' - Turkish / 土尔其(土尔其语)
- 'uk_UA' - Ukrainian / 乌克兰(乌克兰语)
- 'zh_CN' - Chinese (China) / 汉语(中华人民共和国)
- 'zh_TW' - Chinese (Taiwan) / 汉语(中华人民共和国台湾地区)
然后即可使用系统提供的方法:
一段简单的测试代码
# 代码片段 01
from faker import Faker
f=Faker(locale='zh_CN')
f.name() #生成姓名
f.address() #生成地址
4.常用方法一览
Faker 提供的方法众多,这里进行了初步整理,分为 12 大类。
4.01 行政区划与地理
- country_code():国家编码
- currency_code():货币编码
- country():国家
- province():省份
- district():区
- city_suffix():市,县
- postcode():邮编
- street_address():街道地址
- street_name():街道名
- street_suffix():街、路
- geo_coordinate():地理坐标
- latitude():地理坐标(纬度)
- longitude():地理坐标(经度)
4.02 随机数
- numerify():三位随机数字
- random_digit():0~9随机数
- random_digit_not_null():1~9的随机数
- random_element():随机字母
- random_int():随机数字,默认0~9999,可以通过设置min,max来设置
- random_letter():随机字母
- random_number():随机数字,参数digits设置生成的数字位数
- lexify():替换所有问号(“?”)带有随机字母的事件。
4.03 颜色
- color_name():随机颜色名
- hex_color():随机HEX颜色
- rgb_color():随机RGB颜色
- safe_color_name():随机安全色名
- safe_hex_color():随机安全HEX颜色
4.04 组织
- bs():随机公司服务名
- company():随机公司名(长)
- company_prefix():随机公司名(短)
- company_suffix():公司性质
4.05 日期时间
- am_pm():AM/PM
- century():随机世纪
- date():随机日期
- date_between():随机生成指定范围内日期,参数:start_date,end_date取值:具体日期或者today,-30d,-30y类似
- date_between_dates():随机生成指定范围内日期,用法同上
- date_object():随机生产从1970-01-01到指定日期的随机日期。
- date_this_month():
- date_this_year():
- date_time():随机生成指定时间(1970年01月01日至今)
- 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():随机年份
4.06 文件类
- file_extension():随机文件扩展名
- file_name():随机文件名(包含扩展名,不包含路径)
- file_path():随机文件路径(包含文件名,扩展名)
- mime_type():随机 MIME 类型
- ascii_company_email():随机 ASCII 公司邮箱名
- ascii_email():随机 ASCII 邮箱
- ascii_free_email():
- ascii_safe_email():
- company_email():随机企业邮箱地址
4.07 信息与网络类
- domain_name():生成域名
- domain_word():域词(即,不包含后缀)
- f.image_url():随机URL地址
- ipv4():随机IP4地址
- ipv6():随机IP6地址
- mac_address():随机MAC地址
- tld():网址域名后缀(.com,.net.cn,等等,不包括.)
- uri():随机URI地址
- email():
- free_email():
- free_email_domain():
- f.safe_email():安全邮箱
- uri_extension():网址文件后缀
- uri_page():网址文件(不包含后缀)
- uri_path():网址文件路径(不包含文件名)
- url():随机URL地址
- user_name():随机用户名
- isbn10():随机ISBN(10位)
- isbn13():随机ISBN(13位)
- job():随机职位
4.08 文本类
- paragraph():随机生成一个段落
- paragraphs():随机生成多个段落,通过参数nb来控制段落数,返回数组
- sentence():随机生成一句话
- sentences():随机生成多句话,与段落类似
- text():随机生成一篇文章(不要幻想着人工智能了,至今没完全看懂一句话是什么意思)
- word():随机生成词语
- words():随机生成多个词语,用法与段落,句子,类似
4.09 编码
- binary():随机生成二进制编码
- language_code():随机生成两位语言编码
- boolean():True/False
- locale():随机生成语言/国际 信息
- md5():随机生成MD5
- password():随机生成密码,可选参数:length:密码长度;special_chars:是否能使用特殊字符;digits:是否包含数字;upper_case:是否包含大写字母;lower_case:是否包含小写字母
- sha1():随机SHA1
- sha256():随机SHA256
- uuid4():随机UUID
- null_boolean():NULL/True/False
4.10人物类
- first_name():随机生成西方人名( first name )
- first_name_female():女性名
- first_name_male():男性名
- first_romanized_name():罗马名
- last_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():随机生成简单档案信息
- ssn():生成身份证号
- credit_card_expire():随机信用卡到期日
- credit_card_full():生成完整信用卡信息
- credit_card_number():信用卡号
- credit_card_provider():信用卡类型
- credit_card_security_code():信用卡安全码
4.11 指定类型数据
- pybool():随机生成布尔值
- pydecimal():
- pydict():随机生成字典
- pyfloat():left_digits=5 #生成的整数位数,
right_digits=2 #生成的小数位数,
positive=True #是否只有正数 - pyint():随机生成整数
- pyiterable()
- pylist()
- pyset()
- pystr()
- pystruct()
- pytuple()
4.12 Web 与浏览器类
- 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信息
- user_agent():随机user_agent信息
5.使用中与文化相关的注意事项
不同的文化类,方法是有区别的。
比如,在中文(zh_CN)中的方法,district()#获取区 province()#获取省的方法,在有些包里是没有的,这需要根据所使用文化类的国家特制来。
使用日文包没有province方法
比如,中国的一级行政单位,是省,直辖市,自治区;而日本的一级行政单位,是都、道、府、县。所以,日文包(ja_JP)中,就没有相应的province(),district(),取而代之的是prefecture(),town();在美国,一级行政单位是州,所以,在美国英语包(en_US)中,取而代之的是state();
总之,在使用不同Fake类之前,最好对所生成文化的国家信息做初步的了解,建议先浏览其对应的类文件的成员。
6.简单示例
# coding=utf-8
# 代码片段 02
# 代码位置:views.py
"""
版权信息 (CopyRight) : All Right Reserved, Design & Develop By Halcyony 辉云科技
项目名称 (Project Name) : Hobbit04_dev
文件标题 (Title) : Testing staff / 自动添加模拟员工信息
文件描述 (Description) :
最后修改时间 @作者(Author) @版本(Version) @说明 (Description)
--------------- ------------- --------------- -------------------
2020-03-30 15:27 Steven Nominz 1.0 创建文档
"""
import datetime
from django.http import HttpResponse
from faker import Faker
from org.models.m_staff import Staffs
f = Faker(locale='zh_CN')
def faker_check_m_staff(request):
"""
向员工表(org_staff)中自动添加模拟数据
每次添加 10 名员工
2020-03-30 16:00 测试成功
访问的 url :http://127.0.0.1:8000/api/v1/org/c_staff/
:param request:
:return:
"""
result = 0
times = 10
for i in range(times):
ssn = f.ssn()
if (int(ssn[16]) % 2) == 0:
gender = "女"
name = f.name_female()
else:
gender = "男"
name = f.name_male()
birthday_str = ssn[6:10] + '-' + ssn[10:12] + '-' + ssn[12:14]
birthday = datetime.datetime.strptime(birthday_str, '%Y-%m-%d').date()
p = Staffs(staff_name=name,
staff_gender=gender,
staff_birthday=birthday,
staff_ssn=ssn,
# call=f.phone_number(),
# profile=f.profile()
)
p.save()
result += i
return HttpResponse('成功添加%s 等 %s 名模拟员工信息。' % (name, times))