利用 Python Faker 包来制作假数据

网友投稿 855 2022-05-29

在做程序开发的时候,我们经常会用到一些测试数据,相信大多数同学是这么来造测试数据的:

test1 test01 test02 测试1 测试2 测试数据1 这是一段测试文本 这是一段很长很长很长的测试文本...

这是一段测试文本

这是一段很长很长很长的测试文本...

中枪的请举手。

不仅要自己手动敲这些测试数据,还敲的这么假。那有啥办法呢?难不成有什么东西能自动给我造点以假乱真的数据啊?你别说,还真有!

在 Python 中有个神库,叫做 Faker,它可以自动帮我们来生成各种各样的看起来很真的”假“数据,让我们来看看吧!

安装

首先让我们来看看这个库的安装方法,实际上装起来非常简单,使用 pip 安装即可,Python3 版本的安装命令如下:

pip3 install faker

安装好了之后,我们使用最简单的例子来生成几个假数据试试:

from faker import Faker   faker = Faker() print('name:', faker.name()) print('address:', faker.address()) print('text:', faker.text())

首先我们从 faker 这个包里面导入一个 Faker 类,然后将其实例化为 faker 对象,依次调用它的 name、address、text 方法,看下运行效果:

name: Nicholas Wilson address: 70561 Simmons Road Apt. 893 Lake Raymondville, HI 35240 text: 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 Faker   faker = Faker('zh_CN') print('name:', faker.name()) print('address:', faker.address()) print('text:', faker.text())

运行结果如下:

name: 何琳 address: 宁夏回族自治区六盘水县南溪北镇街f座 912311 text: 经营软件积分开始次数专业.美国留言一种管理人民解决两个.支持只有地方一切. 文化目前东西的是不过所以.系统觉得这种为什一下他们.时候以及这样继续是一状态威望. 网站密码情况.问题一点那个还是.其实过程详细. 中国历史环境电话规定.经验上海控制不要生活.朋友运行项目我们. 以后今天那些使用免费国家加入但是.内容简介空间次数最大一个.日期通过得到日本北京.

可以看到一段中文的姓名、地址、长文本便生成了。看起来地址是省份、地级市、县级市、街道是随机组合的,文本也是一些随机的词组合而成的,但其实这样已经比文章一开头列的测试数据强太多了。

上面的代码每次运行得到的结果都是不同的,因为生成的结果都是随机组合而成的。

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 Faker   faker = Faker('zh_CN') print(faker.providers)

运行结果如下:

[,  ,   ,    ,    ,    ,     ,      ,       ,        ]

还真不少,通过名字可以看到有 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 Faker   faker = Faker('zh_CN') print('name:', faker.name) print('address:', faker.address) print('text:', faker.text)

注意这里没有调用,而是直接打印了这三个方法,这样可以直接输出方法的对象形式的描述,结果如下:

name: > address: > text: >

恍然大悟,原来我们调用的方法就是 Faker 对象调用的 Provider 里面的对应方法,比如 name 就是 faker.providers.person.zhCN.Provider 里面的 name 方法,二者是一致的,我们扒一扒源码验证下,源码在:[https://github.com/joke2k/faker/blob/master/faker/providers/person/__init_.py](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) # 'Mastercardn玉兰 范n5183689713096897 01/25nCVV: 012n' 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) #  faker.timezone() # 'Indian/Comoro' faker.unix_time(end_datetime=None, start_datetime=None) # 1182857626 faker.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、用户名、后缀名等内容,用法如下:

利用 Python Faker 包来制作假数据

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,用于生成一些假文字数据,包括句子、自然段、长文本、关键词等,另外可以传入不同的参数来控制生成的长度,用法如下:

在这里每个方法的参数是不同的,具体的参数解释可以见源代码每个方法的注释:https://github.com/joke2k/faker/blob/master/faker/providers/lorem/__init__.py,

Misc

Misc,用于生成生成一些混淆数据,比如密码、sha1、sha256、md5 等加密后的内容,用法如下:

faker.boolean(chance_of_getting_true=50) # True faker.md5(raw_output=False) # '3166fa26ffd3f2a33e020dfe11191ac6' faker.null_boolean() # False faker.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=) # '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'

以上仅仅列了一部分,还有更多的功能大家可以查看官方文档的内容,链接为:https://faker.readthedocs.io/en/master/locales/zh_CN.html。

其他 Provider

另外还有一些社区贡献的 Provider,如 WiFi、微服务相关的,大家可以查看文档的说明,另外需要额外安装这些扩展包并自行添加 Provider,文档见:https://faker.readthedocs.io/en/master/communityproviders.html。

添加 Provider 需要调用 add_provider 方法,用法示例如下:

from faker import Faker from faker.providers import internet   faker = Faker() faker.add_provider(internet) print(faker.ipv4_private())

还有更多的内容大家可以参考官方文档,链接:https://faker.readthedocs.io/。

---------------------

本文转自静觅

python

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【我的物联网成长记5】如何进行物联网大数据分析?
下一篇:青出于蓝而胜于蓝——揭秘全新的 HWSQL
相关文章