在做程序开拓的时候,我们常常会用到一些测试数据,相信大多数同学是这么来造测试数据的:
test1test01test02测试1测试2测试数据1这是一段测试文本这是一段很长很长很长的测试文本...
中枪的请举手。
不仅要自己手动敲这些测试数据,还敲的这么假。那有啥办法呢?难不成有什么东西能自动给我造点以假乱真的数据啊?你别说,还真有!
在 Python 中有个神库,叫做 Faker,它可以自动帮我们来天生各种各样的看起来很真的”假“数据,让我们来看看吧!
首先让我们来看看这个库的安装方法,实际上装起来非常大略,利用 pip 安装即可,Python3 版本的安装命令如下:
pip3 install faker
安装好了之后,我们利用最大略的例子来天生几个假数据试试:
from faker import Fakerfaker = Faker()print('name:', faker.name())print('address:', faker.address())print('text:', faker.text())
首先我们从 faker 这个包里面导入一个 Faker 类,然后将实在例化为 faker 工具,依次调用它的 name、address、text 方法,看下运行效果:
name: Nicholas Wilsonaddress: 70561 Simmons Road Apt. 893Lake Raymondville, HI 35240text: Both begin bring federal space.Official start idea specific. Able under young fire.Who show line traditional easy people. Until economic lead event case. Technology college his director style.
看到这里给我们天生了看起来很真的英文姓名、地址、长文本。
但我们是中国人,我们肯定想要天生中文的吧,不用担心,这个库对非常多的措辞都有支持,当然也包括中文了,详细的支持的措辞列表可以见:https://faker.readthedocs.io/en/master/locales.html。
这里几个比较常见的措辞代号列一下:
简体中文:zh_CN繁体中文:zh_TW美国英文:en_US英国英文:en_GB德文:de_DE日文:ja_JP韩文:ko_KR法文:fr_FR那么如果要天生中文,只须要在 Faker 类的第一个参数传入对应的措辞代号即可,例如简体中文就传入 zh_CN,以是上面的代码改写如下:
from faker import Fakerfaker = Faker('zh_CN')print('name:', faker.name())print('address:', faker.address())print('text:', faker.text())
运行结果如下:
name: 何琳address: 宁夏回族自治区六盘水县南溪北镇街f座 912311text: 经营软件积分开始次数专业.美国留言一种管理公民办理两个.支持只有地方统统.文化目前东西的是不过以是.系统以为这种为什一下他们.时候以及这样连续是一状态威望.网站密码情形.问题一点那个还是.实在过程详细.中国历史环境电话规定.履历上海掌握不要生活.朋友运行项目我们.往后本日那些利用免费国家加入但是.内容简介空间次数最大一个.日期通过得到日本北京.
可以看到一段中文的姓名、地址、长文本便天生了。看起来地址是省份、地级市、县级市、街道是随机组合的,文本也是一些随机的词组合而成的,但实在这样已经比文章一开头列的测试数据强太多了。
上面的代码每次运行得到的结果都是不同的,由于天生的结果都是随机组合而成的。
Provider接下来让我们详细看下 faker 可以都天生什么类型的数据,详细的可用 API 可以看 https://faker.readthedocs.io/en/master/locales/zh_CN.html,这里面列出来了可用的所有方法。
但打开之后可以创造,这里面多了一个 Provider 工具,那么这个 Provider 是怎么一回事呢?
实际上这个 faker 库在设计上,为理解耦,将 Provider 工具做成了 Faker 工具的”插件“。Faker 可以添加一个个 Provider 工具,Provider 工具为 Faker 工具供应了天生某项数据的核心实现。就相称于 Faker 工具是一个天生器,它的生成功能依赖于什么呢?依赖于 Provider,是 Provider 供应给了 Faker 工具天生某项数据的能力。
正是由于 Faker 工具内置了一些 Provider 工具,Faker 工具才可以天生刚才所哀求的姓名、地址和文本。
那么这时候我们肯定就很好奇了,既然 Faker 工具有天生数据的能力,那么它一定内置了一些默认的 Provider 工具,下面我们来打印看一下:
from faker import Fakerfaker = Faker('zh_CN')print(faker.providers)
运行结果如下:
[<faker.providers.user_agent.Provider object at 0x10249de48>, <faker.providers.ssn.zh_CN.Provider object at 0x10249dc18>, <faker.providers.python.Provider object at 0x10249dd68>, <faker.providers.profile.Provider object at 0x10249dcc0>, <faker.providers.phone_number.zh_CN.Provider object at 0x10249dc88>, <faker.providers.person.zh_CN.Provider object at 0x10249de80>, <faker.providers.misc.Provider object at 0x10249df60>, <faker.providers.lorem.zh_CN.Provider object at 0x10249dc50>, <faker.providers.job.zh_CN.Provider object at 0x10249de10>, <faker.providers.isbn.Provider object at 0x10249c6d8>, <faker.providers.internet.zh_CN.Provider object at 0x10249c828>, <faker.providers.geo.en_US.Provider object at 0x102484748>, <faker.providers.file.Provider object at 0x102484828>, <faker.providers.date_time.en_US.Provider object at 0x1023789e8>, <faker.providers.currency.Provider object at 0x102484780>, <faker.providers.credit_card.Provider object at 0x1024845f8>, <faker.providers.company.zh_CN.Provider object at 0x102499ef0>, <faker.providers.color.en_US.Provider object at 0x1023532e8>, <faker.providers.barcode.Provider object at 0x101cb6d30>, <faker.providers.bank.en_GB.Provider object at 0x102378f98>, <faker.providers.automotive.en_US.Provider object at 0x1017a5c50>, <faker.providers.address.zh_CN.Provider object at 0x101787c18>]
还真不少,通过名字可以看到有 user_agent、phone_number、isbn、credit_card 等 Provider,个中具有措辞差异化的 Provider 还单独区分了措辞,比如 phone_number 代表电话号码,这个不同措辞的不同,以是这里就又分了一层 zh_CN,作了措辞的区分。
这样一来,通用的 Provider 就直接处在某个 Provider 类别的模块中,具有措辞差异的 Provider 就又根据不同的措辞进一步划分了模块,设计上非常科学,易扩展又不冗余。
知道了 Faker 具有这么多 Provider 之后,我们来看看刚才调用的 name、address 等方法又和 Provider 有什么关系呢?
我们将 name、address、text 等方法打印一下看看:
from faker import Fakerfaker = Faker('zh_CN')print('name:', faker.name)print('address:', faker.address)print('text:', faker.text)
把稳这里没有调用,而是直接打印了这三个方法,这样可以直接输出方法的工具形式的描述,结果如下:
name: <bound method Provider.name of <faker.providers.person.zh_CN.Provider object at 0x10f6dea58>>address: <bound method Provider.address of <faker.providers.address.zh_CN.Provider object at 0x10e9e6cf8>>text: <bound method Provider.text of <faker.providers.lorem.zh_CN.Provider object at 0x10f6dfda0>>
恍然大悟,原来我们调用的方法便是 Faker 工具调用的 Provider 里面的对应方法,比如 name 便是 faker.providers.person.zh_CN.Provider 里面的 name 方法,二者是同等的,我们扒一扒源码验证下,源码在:https://github.com/joke2k/faker/blob/master/faker/providers/person/init.py,果不其然,里面定义了 name 方法,然后 Faker 动态地将这个方法引入进来了,就可以利用了。
方法列举既然有这么多 Provider,下面我们再详细地看看还有哪些常用的方法吧,下面进行一部分大略的梳理,参考来源文档地址为:
https://faker.readthedocs.io/en/master/providers.html。
Address
Address,用于天生一些和地址干系的数据,如地址、城市、邮政编码、街道等内容, 用法如下:
faker.address()# '新疆维吾尔自治区杰县南湖武汉街D座 253105'faker.building_number()# 'B座'faker.city()# '璐县'faker.city_name()# '贵阳'faker.city_suffix()# '县'faker.country()# '阿拉斯加'faker.country_code(representation=\公众alpha-2\"大众)# 'CR'faker.district()# '西峰'faker.postcode()# '726749'faker.province()# '福建省'faker.street_address()# '余路N座'faker.street_name()# '李路'faker.street_suffix()# '路'
Color
Color,用于天生和颜色干系的数据,如 HEX、RGB、RGBA 等格式的颜色,用法如下:
faker.color_name()# 'DarkKhaki'faker.hex_color()# '#97d14e'faker.rgb_color()# '107,179,51'faker.rgb_css_color()# 'rgb(20,46,70)'faker.safe_color_name()# 'navy'faker.safe_hex_color()# '#dd2200'
Company
Company,用于天生公司干系数据,如公司名、公司前缀、公司后缀等内容,用法如下:
faker.bs()# 'grow rich initiatives'faker.catch_phrase()# 'Self-enabling encompassing function'faker.company()# '恒聪百汇网络有限公司'faker.company_prefix()# '晖来打算机'faker.company_suffix()# '信息有限公司'
Credit Card
Credit Card,用于天生信用卡干系数据,如过期韶光、银行卡号、安全码等内容,用法如下:
faker.credit_card_expire(start=\公众now\"大众, end=\"大众+10y\公众, date_format=\"大众%m/%y\"大众)# '08/20'faker.credit_card_full(card_type=None)# 'Mastercard\n玉兰 范\n5183689713096897 01/25\nCVV: 012\n'faker.credit_card_number(card_type=None)# '4009911097184929918'faker.credit_card_provider(card_type=None)# 'JCB 15 digit'faker.credit_card_security_code(card_type=None)# '259'
Date Time
Date Time,用于天生韶光干系数据,如年份、月份、星期、出生日期等内容,可以返回 datetime 类型的数据,用法如下:
faker.am_pm()# 'AM'faker.century()# 'X'faker.date(pattern=\"大众%Y-%m-%d\"大众, end_datetime=None)# '1997-06-16'faker.date_between(start_date=\公众-30y\"大众, end_date=\"大众today\"大众)# datetime.date(2000, 8, 30)faker.date_between_dates(date_start=None, date_end=None)# datetime.date(2019, 7, 30)faker.date_object(end_datetime=None)# datetime.date(1978, 3, 12)faker.date_of_birth(tzinfo=None, minimum_age=0, maximum_age=115)# datetime.date(2012, 6, 3)faker.date_this_century(before_today=True, after_today=False)# datetime.date(2011, 6, 12)faker.date_this_decade(before_today=True, after_today=False)# datetime.date(2011, 8, 22)faker.date_this_month(before_today=True, after_today=False)# datetime.date(2019, 7, 25)faker.date_this_year(before_today=True, after_today=False)# datetime.date(2019, 7, 22)faker.date_time(tzinfo=None, end_datetime=None)# datetime.datetime(2018, 8, 11, 22, 3, 34)faker.date_time_ad(tzinfo=None, end_datetime=None, start_datetime=None)# datetime.datetime(1566, 8, 26, 16, 25, 30)faker.date_time_between(start_date=\"大众-30y\"大众, end_date=\公众now\"大众, tzinfo=None)# datetime.datetime(2015, 1, 31, 4, 14, 10)faker.date_time_between_dates(datetime_start=None, datetime_end=None, tzinfo=None)# datetime.datetime(2019, 7, 30, 17, 51, 44)faker.date_time_this_century(before_now=True, after_now=False, tzinfo=None)# datetime.datetime(2002, 9, 25, 23, 59, 49)faker.date_time_this_decade(before_now=True, after_now=False, tzinfo=None)# datetime.datetime(2010, 5, 25, 20, 20, 52)faker.date_time_this_month(before_now=True, after_now=False, tzinfo=None)# datetime.datetime(2019, 7, 19, 18, 4, 6)faker.date_time_this_year(before_now=True, after_now=False, tzinfo=None)# datetime.datetime(2019, 3, 15, 11, 4, 18)faker.day_of_month()# '04'faker.day_of_week()# 'Monday'faker.future_date(end_date=\公众+30d\"大众, tzinfo=None)# datetime.date(2019, 8, 12)faker.future_datetime(end_date=\公众+30d\公众, tzinfo=None)# datetime.datetime(2019, 8, 24, 2, 59, 4)faker.iso8601(tzinfo=None, end_datetime=None)# '1987-07-01T18:33:56'faker.month()# '11'faker.month_name()# 'August'faker.past_date(start_date=\"大众-30d\公众, tzinfo=None)# datetime.date(2019, 7, 25)faker.past_datetime(start_date=\"大众-30d\"大众, tzinfo=None)# datetime.datetime(2019, 7, 18, 22, 46, 51)faker.time(pattern=\"大众%H:%M:%S\公众, end_datetime=None)# '16:22:30'faker.time_delta(end_datetime=None)# datetime.timedelta(0)faker.time_object(end_datetime=None)# datetime.time(22, 12, 15)faker.time_series(start_date=\公众-30d\"大众, end_date=\"大众now\"大众, precision=None, distrib=None, tzinfo=None)# <generator object Provider.time_series at 0x7fcbce0604f8>faker.timezone()# 'Indian/Comoro'faker.unix_time(end_datetime=None, start_datetime=None)# 1182857626faker.year()# '1970'
File
File,用于天生文件和文件路径干系的数据,包括文件扩展名、文件路径、MIME_TYPE、磁盘分区等内容,用法如下:
faker.file_extension(category=None)# 'flac'faker.file_name(category=None, extension=None)# '然后.numbers'faker.file_path(depth=1, category=None, extension=None)# '/关系/科技.mov'faker.mime_type(category=None)# 'video/ogg'faker.unix_device(prefix=None)# '/dev/sdd'faker.unix_partition(prefix=None)# '/dev/xvds3'
Geo
Geo,用于天生和地理位置干系的数据,包括经纬度,时区等等信息,用法如下:
faker.coordinate(center=None, radius=0.001)# Decimal('-114.420686')faker.latitude()# Decimal('-9.772541')faker.latlng()# (Decimal('-27.0730915'), Decimal('-5.919460'))faker.local_latlng(country_code=\"大众US\"大众, coords_only=False)# ('41.47892', '-87.45476', 'Schererville', 'US', 'America/Chicago')faker.location_on_land(coords_only=False)# ('12.74482', '4.52514', 'Argungu', 'NG', 'Africa/Lagos')faker.longitude()# Decimal('40.885895')
Internet
Internet,用于天生和互联网干系的数据,包括随机电子邮箱、域名、IP 地址、URL、用户名、后缀名等内容,用法如下:
faker.ascii_company_email(args, kwargs)# 'xuna@xiaqian.cn'faker.ascii_email(args, kwargs)# 'min59@60.cn'faker.ascii_free_email(args, kwargs)# 'min75@gmail.com'faker.ascii_safe_email(args, kwargs)# 'cliu@example.com'faker.company_email(args, kwargs)# 'ilong@99.cn'faker.domain_name(levels=1)# 'xiulan.cn'faker.domain_word(args, kwargs)# 'luo'faker.email(args, kwargs)# 'maoxiulan@hotmail.com'faker.free_email(args, kwargs)# 'yanshen@gmail.com'faker.free_email_domain(args, kwargs)# 'yahoo.com'faker.hostname(args, kwargs)# 'lt-18.pan.cn'faker.image_url(width=None, height=None)# 'https://placekitten.com/51/201'faker.ipv4(network=False, address_class=None, private=None)# '192.233.68.5'faker.ipv4_network_class()# 'a'faker.ipv4_private(network=False, address_class=None)# '10.9.97.93'faker.ipv4_public(network=False, address_class=None)# '192.51.22.7'faker.ipv6(network=False)# 'de57:9c6f:a38c:9864:10ec:6442:775d:5f02'faker.mac_address()# '99:80:5c:ab:8c:a9'faker.safe_email(args, kwargs)# 'tangjuan@example.net'faker.slug(args, kwargs)# ''faker.tld()# 'cn'faker.uri()# 'http://fangfan.org/app/tag/post/'faker.uri_extension()# '.php'faker.uri_page()# 'about'faker.uri_path(deep=None)# 'app'faker.url(schemes=None)# 'http://mingli.cn/'faker.user_name(args, kwargs)# 'jie54'
Job
Job,用于天生和职业干系的数据,用法如下:
faker.job()# '烫工'
Lorem
Lorem,用于天生一些假笔墨数据,包括句子、自然段、长文本、关键词等,其余可以传入不同的参数来掌握天生的长度,用法如下:
faker.paragraph(nb_sentences=3, variable_nb_sentences=True, ext_word_list=None)# '包括的是报告那些一点.图片地址基本全部.'faker.paragraphs(nb=3, ext_word_list=None)# [ '操持规定这样以是组织商品个中.参加成为不同揭橥地区.精华科技感激大家须要.一下手机上海中文工程.',# '非常干系是一便是一个一种文章发生.增加那些以及之后以下你的.',# '学生该当出来剖析增加关系组织.评论来源朋友注册该当须要单位.觉得末了无法创造选择公民.']faker.sentence(nb_words=6, variable_nb_words=True, ext_word_list=None)# '先容结果自己办理处理.'faker.sentences(nb=3, ext_word_list=None)# ['查看实在一次学习登录浏览是一他们.', '而且资源的人事情.', '科技价格免费大学教诲.']faker.text(max_nb_chars=200, ext_word_list=None)# ('只是当前海内里文以是.威望系统在线虽然.\n'# '图片公民非常互助这种感激更新.名称详细直接社会一贯首页完备.\n'# '主要更多只要市场.必须只是学生音乐.系统美国种别这些统统环境.\n'# '但是的话公民美国关于.\n'# '情形专业国际看到研究.音乐环境市场搜索创造.\n'# '工具还是到了本日位置公民.留言作者品牌工程项目必须.上海精华现在我们新闻该当关系.\n'# '更新经济能力全部资源如果.手机能够登录海内.')faker.texts(nb_texts=3, max_nb_chars=200, ext_word_list=None)# [ '成功可能推举你的行业.地区而且推举.\n'# '网络不断是一紧张必须.开始安全做事.\n'# '该当网上通过往后通过大学.管理哀求有关国际阅读当前.为了该当结果点击公司开始怎么.\n'# '成功一次最大生产网站.这种加入她的地址有限.\n'# '根据新闻汽车起来非常主题显示必须.有些培植来自作者电话支持.\n'# '只是资源还是由于经济事情喜好.为什中文大小得到做事.网络密码是否免费参加一次社区欢迎.',# '部门活动技能.商品影响发生行业密码完成.便是部门结果资料学习当然.或者帮助城市哀求首页市场教诲你们.\n'# '专业完备剖析处理城市大学什么.\n'# '文件非常国际全部起来积分公司.资料的是电影没有.这是本站须要.\n'# '互助主要没有现在市场开拓空间.您的会员推举成功教诲进行中国.\n'# '文件不是如果评论.由于履历设备规定.\n'# '加入一起影响网上大家运行在线如果.工程企业这种往后.',# '空间市场涌现必须基本电话.显示一个标准其他设计作品.工程不断新闻问题更多更新这么.\n'# '一起简介网上内容不会.任何知道各种两个.种别事情经营那么投资市场.\n'# '那些利用先容公司朋友公民你们浏览.该当表示一点一样平常解释紧张感激.电话回答起来履历一个来源加入.\n'# '地区法律其他表示虽然.参加社会喜好有限论坛一样平常发布.种别目前文化可以.\n'# '报告质量事情紧张.企业发布完备.得到名称作者等级两个论坛只要电话.']faker.word(ext_word_list=None)# '把稳'faker.words(nb=3, ext_word_list=None, unique=False)# ['任务', '组织', '往后']在这里每个方法的参数是不同的,详细的参数阐明可以见源代码每个方法的注释:https://github.com/joke2k/faker/blob/master/faker/providers/lorem/__init__.py,
Misc
Misc,用于天生天生一些稠浊数据,比如密码、sha1、sha256、md5 等加密后的内容,用法如下:
faker.boolean(chance_of_getting_true=50)# Truefaker.md5(raw_output=False)# '3166fa26ffd3f2a33e020dfe11191ac6'faker.null_boolean()# Falsefaker.password(length=10, special_chars=True, digits=True, upper_case=True, lower_case=True)# 'W7Ln8La@%O'faker.sha1(raw_output=False)# 'c8301a2a79445439ee5287f38053e4b3a05eac79'faker.sha256(raw_output=False)# '1e909d331e20cf241aaa2da894deae5a3a75e5cdc35c053422d9b8e7ccfa0402'faker.uuid4(cast_to=<class 'str'>)# '6e6fe387-6877-48d9-94ea-4263c4c71aa5'
Person
Person,用于天生和人名干系的数据,包括姓氏、名字、全名、英文名等内容,还能区分男女名字,用法如下:
faker.first_name()# '颖'faker.first_name_female()# '芳'faker.first_name_male()# '利'faker.first_romanized_name()# 'Jing'faker.last_name()# '温'faker.last_name_female()# '寇'faker.last_name_male()# '陈'faker.last_romanized_name()# 'Lei'faker.name()# '黄明'faker.name_female()# '张凯'faker.name_male()# '黄鹏'
User-Agent
User-Agent,用于天生和浏览器 User-Agent 干系的内容,可以定制各种浏览器,还可以传入版本信息来掌握天生的内容,用法如下:
faker.chrome(version_from=13, version_to=63, build_from=800, build_to=899)# ('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/5332 (KHTML, like Gecko) '# 'Chrome/40.0.837.0 Safari/5332')faker.firefox()# ('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_8_9; rv:1.9.4.20) '# 'Gecko/2019-05-02 05:58:44 Firefox/3.6.19')faker.internet_explorer()# 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/3.0)'faker.linux_platform_token()# 'X11; Linux i686'faker.linux_processor()# 'x86_64'faker.mac_platform_token()# 'Macintosh; U; PPC Mac OS X 10_12_5'faker.mac_processor()# 'U; Intel'faker.opera()# 'Opera/9.77.(Windows NT 4.0; vi-VN) Presto/2.9.182 Version/11.00'faker.safari()# ('Mozilla/5.0 (Macintosh; PPC Mac OS X 10_7_1 rv:5.0; or-IN) '# 'AppleWebKit/535.9.4 (KHTML, like Gecko) Version/5.0.2 Safari/535.9.4')faker.user_agent()# 'Opera/8.69.(X11; Linux i686; ml-IN) Presto/2.9.170 Version/11.00'faker.windows_platform_token()# 'Windows NT 6.1'其他 Provider
其余还有一些社区贡献的 Provider,如 WiFi、微做事干系的,大家可以查看文档的解释,其余须要额外安装这些扩展包并自行添加 Provider。
添加 Provider 须要调用 add_provider 方法,用法示例如下:
from faker import Fakerfrom faker.providers import internetfaker = Faker()faker.add_provider(internet)print(faker.ipv4_private())