Faker库介绍及使用

在项目中经常会用到一些假数据(测试数据),如在金融项目中的人名,身份证,地址,电话等。
通过自己来写一些规则,也能够基本满足要求。但这里推荐python的Faker库,使用起来更方便,它可以帮助我们生成各种各种的看起来很真的数据。

Faker库官方文档


初识Faker


安装

pip install Faker

基本使用

faker.Faker可接受一个local参数,如果不指定的化则会用默认的en_US

from faker import Faker

faker = Faker() # 换成faker = Faker('zh_CN')再看看结果
print('name:', faker.name())
print('address:', faker.address())
print('text:', faker.text())

faker命令行

Faker 安装后,也可以在命令行使用,简单快速生成需要的数据

$ faker address
968 Bahringer Garden Apt. 722
Kristinaland, NJ 09890

$ faker -l de_DE address
Samira-Niemeier-Allee 56
94812 Biedenkopf

$ faker profile ssn,birthdate
{'ssn': u'628-10-1085', 'birthdate': '2008-03-29'}

$ faker -r=3 -s=";" name
Willam Kertzmann;
Josiah Maggio;
Gayla Schmitt;

详细参数和使用可通过faker -h获取或查看官网文档

Provider


faker怎么生成数据的?深入看一下

实际上这个 faker 库在设计上,为了解耦,将 Provider 对象做成了 Faker 对象的”插件“。Faker 可以添加一个个** Provider 对象**,Provider 对象为 Faker 对象提供了生成某项数据的核心实现。就相当于 Faker 对象是一个生成器,它的生成功能依赖于什么呢?依赖于 Provider,是 Provider 提供给了 Faker 对象生成某项数据的能力
通用的 Provider 就直接处在某个 Provider 类别的模块中,具有语言差异的 Provider 就又根据不同的语言进一步划分了模块,设计上非常科学,易扩展又不冗余

from faker import Faker

f = Faker(locale='zh_CN')
# print(f.providers)
for provider in f.providers:
    # print(provider.__dict__)
    print(provider.__provider__)

print(f.name)
print(f.address)
print(f.text)
-----------------------------------
faker.providers.user_agent
faker.providers.ssn
faker.providers.python
faker.providers.profile
faker.providers.phone_number
faker.providers.person
faker.providers.misc
faker.providers.lorem
faker.providers.job
faker.providers.isbn
faker.providers.internet
faker.providers.geo
faker.providers.file
faker.providers.date_time
faker.providers.currency
faker.providers.credit_card
faker.providers.company
faker.providers.color
faker.providers.barcode
faker.providers.bank
faker.providers.automotive
faker.providers.address
<bound method Provider.name of <faker.providers.person.zh_CN.Provider object at 0x10d7285e0>>
<bound method Provider.address of <faker.providers.address.zh_CN.Provider object at 0x10d6eafa0>>
<bound method Provider.text of <faker.providers.lorem.zh_CN.Provider object at 0x10d728310>>

由上可以看出f.name函数是绑定(bound)在faker.providers.person.zh_CN.Provider对象上的方法,再次查看faker.providers中person的Provider(继承自BaseProvider)的源码,确实发现了name相关的源码,中文的person的Provider又继承自默认的Provider

# 源码
def name(self):
    """
    :example 'John Doe'
    """
    pattern = self.random_element(self.formats)
    return self.generator.parse(pattern)

常用provider及其方法

  • Address,用于生成一些和地址相关的数据,如地址、城市、邮政编码、街道等内容
  • Color,用于生成和颜色相关的数据,如 HEX、RGB、RGBA 等格式的颜色
  • Company,用于生成公司相关数据,如公司名、公司前缀、公司后缀等内容
  • Credit Card,用于生成信用卡相关数据,如过期时间、银行卡号、安全码等内容
  • Date Time,用于生成时间相关数据,如年份、月份、星期、出生日期等内容,可以返回 datetime 类型的数据
from faker import Faker

faker = Faker()
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)
# 1182857626
faker.year()
# '1970'
  • File,用于生成文件和文件路径相关的数据,包括文件扩展名、文件路径、MIME_TYPE、磁盘分区等内容
  • Geo,用于生成和地理位置相关的数据,包括经纬度,时区等等信息
  • Internet,用于生成和互联网相关的数据,包括随机电子邮箱、域名、IP 地址、URL、用户名、后缀名等内容
  • Job,用于生成和职业相关的数据
  • Lorem,用于生成一些假文字数据,包括句子、自然段、长文本、关键词等,另外可以传入不同的参数来控制生成的长度
  • Misc,用于生成生成一些混淆数据,比如密码、sha1、sha256、md5 等加密后的内容
  • Person,用于生成和人名相关的数据,包括姓氏、名字、全名、英文名等内容,还能区分男女名字
  • 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、微服务相关的,可自行添加,详情查看文档说明

  • add_providers
from faker import Faker

import faker_microservice

fake = Faker()
fake.add_provider(faker_microservice.Provider)
print(fake.microservice())  # prints "fulfilment_manager" or similar

参考及扩展阅读