还在为临时构造测试数据苦恼吗——快来看看faker库吧

Faker库主要用来创建非真实数据,使用Faker包,无需再手动生成或者手写随机数来生成数据,只需要调用Faker提供的方法,即可完成数据的生成。

安装Faker库

在cmd使用命令进行安装:pip install faker

在这里插入图片描述
Faker库官方文档:https://faker.readthedocs.io/en/master/index.html

快速入门

Use faker.Faker() to create and initialize a faker generator, which can generate data by accessing properties named after the type of data you want.

from faker import Faker
fake = Faker()

fake.name()
# 'Lucy Cechtelar'

fake.address()
# '426 Jordy Lodge
#  Cartwrightshire, SC 88120-6700'

fake.text()

每次调用方法 fake.name() 时都会产生不同的(随机)结果。这是因为 faker 将 faker.Generator.method_name() 调用转发到 faker.Generator.format(method_name)。

每个生成器属性(例如 name、address 和 lorem)都被称为“fake”。一个 faker 生成器包含许多这样的属性,这些属性被打包在“providers”中。

from faker import Faker
from faker.providers import internet

fake = Faker()
fake.add_provider(internet)

print(fake.ipv4_private())

在这里插入图片描述
查看faker源码的providers模块,发现丫是真没说谎,各个语言各个类型虚假数据生成器都写了一遍。

Localization(本地化)

上文提到,providers模块实现了各个语言的数据生成器,现在就来看看如何使用参数来控制faker的“国籍”吧。

Faker can take a locale as an argument, to return localized data. If no localized provider is found, the factory falls back to the default LCID string for US english, ie: en_US.

from faker import Faker
fake = Faker('it_IT')
for _ in range(10):
    print(fake.name())

# 'Elda Palumbo'
# 'Pacifico Giordano'
# 'Sig. Avide Guerra'
# 'Yago Amato'
# 'Eustachio Messina'
# 'Dott. Violante Lombardo'
# 'Sig. Alighieri Monti'
# 'Costanzo Costa'
# 'Nazzareno Barbieri'
# 'Max Coppola'

Faker also supports multiple locales.

from faker import Faker
fake = Faker(['it_IT', 'en_US', 'ja_JP'])
for _ in range(10):
    print(fake.name())

# 鈴木 陽一
# Leslie Moreno
# Emma Williams
# 渡辺 裕美子
# Marcantonio Galuppi
# Martha Davis
# Kristen Turner
# 中津川 春香
# Ashley Castillo
# 山田 桃子

在这里插入图片描述
Faker 构造函数接收一个与性能相关的参数,称为 use_weighting。它指定是否尝试使值的频率与现实世界的频率相匹配(例如,英文名字 Gary 的出现频率比名字 Lorimer 高得多)。如果 use_weighting 为 False,则所有项被选择的机会均等,并且选择过程会更快。默认值为 True。

在这里插入图片描述

常用属性枚举

基础信息类

ssn():生成CNID号
 
bs():随机公司服务名
 
company():随机公司名(长)
 
company_prefix():随机公司名(短)
 
company_suffix():公司性质
 
credit_card_expire():随机信用卡到期日
 
credit_card_full():生成完整信用卡信息
 
credit_card_number():信用卡号
 
credit_card_provider():信用卡类型
 
credit_card_security_code():信用卡安全码
 
job():随机职位
 
first_name():
 
first_name_female():女性名
 
first_name_male():男性名
 
first_romanized_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():随机生成手机号段

地理信息类

 
city_suffix():市,县
 
country():国家
 
country_code():国家编码
 
district():区
 
geo_coordinate():地理坐标
 
latitude():地理坐标(纬度)
 
longitude():地理坐标(经度)
 
postcode():邮编
 
province():省份 (zh_TW没有此方法)
 
address():详细地址
 
street_address():街道地址
 
street_name():街道名
 
street_suffix():街、路

个人账户信息类

ascii_company_email():随机ASCII公司邮箱名
 
ascii_email():随机ASCII邮箱
 
ascii_free_email():
 
ascii_safe_email():
 
company_email():
 
email():
 
free_email():
 
free_email_domain():
 
safe_email():安全邮箱

网络基础信息类

domain_name():生成域名
 
domain_word():域词(即,不包含后缀)
 
ipv4():随机IP4地址
 
ipv6():随机IP6地址
 
mac_address():随机MAC地址
 
tld():网址域名后缀(.com,.net.cn,等等,不包括.)
 
uri():随机URI地址
 
uri_extension():网址文件后缀
 
uri_page():网址文件(不包含后缀)
 
uri_path():网址文件路径(不包含文件名)
 
url():随机URL地址
 
user_name():随机用户名
 
image_url():随机URL地址

浏览器信息类——不保证绕过浏览器校验

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信息

文件信息类

file_extension():随机文件扩展名
 
file_name():随机文件名(包含扩展名,不包含路径)
 
file_path():随机文件路径(包含文件名,扩展名)
 
mime_type():随机mime Type

数字类

numerify():三位随机数字
 
random_digit()0~9随机数
 
random_digit_not_null()1~9的随机数
 
random_int():随机数字,默认0~9999,可以通过设置min,max来设置
 
random_number():随机数字,参数digits设置生成的数字位数
 
pyfloat():left_digits=5 #生成的整数位数,
 
                  right_digits=2 #生成的小数位数,
 
                  positive=True #是否只有正数
 
pyint():随机Int数字(参考random_int()参数)
 
pydecimal():随机Decimal数字(参考pyfloat参数)

文本、加密类

pystr():随机字符串
 
random_element():随机字母
 
random_letter():随机字母
 
paragraph():随机生成一个段落
 
paragraphs():随机生成多个段落,通过参数nb来控制段落数,返回数组
 
sentence():随机生成一句话
 
sentences():随机生成多句话,与段落类似
 
text():随机生成一篇文章(不要幻想着人工智能了,至今没完全看懂一句话是什么意思)
 
word():随机生成词语
 
words():随机生成多个词语,用法与段落,句子,类似
 
binary():随机生成二进制编码
 
boolean()True/False
 
language_code():随机生成两位语言编码
 
locale():随机生成语言/国际 信息
 
md5():随机生成MD5
 
null_boolean():NULL/True/False
 
password():随机生成密码,可选参数:length:密码长度;special_chars:是否能使用特殊字符;digits:是否包含数字;upper_case:是否包含大写字母;lower_case:是否包含小写字母
 
sha1():随机SHA1
 
sha256():随机SHA256
 
uuid4():随机UUID

时间信息类

am_pm():AM/PM
 
century():随机世纪
 
date():随机日期
 
date_between():随机生成指定范围内日期,参数:start_date,end_date取值:具体日期或者today,-30d,-30y类似
 
date_between_dates():随机生成指定范围内日期,用法同上
 
date_object():随机生产从1970-1-1到指定日期的随机日期。
 
date_this_month():
 
date_this_year():
 
date_time():随机生成指定时间(197011日至今)
 
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():随机年份

集合信息类

profile():随机生成档案信息
# {'job': '物流/仓储', 'company': '精芯网络有限公司', 'ssn': '320830199309234516', 
# 'residence': '西藏自治区娜县涪城徐路X座 434407', 'current_location': (Decimal('-18.251396'), 
# Decimal('-3.543193')), 'blood_group': 'O-', 'website': ['https://www.yin.net/', 'https://www.cg.cn/',
# 'https://www.bg.cn/', 'http://www.duqiao.cn/'], 'username': 'dxue', 'name': '何冬梅', 'sex': 'F', 
# 'address': '甘肃省桂花市双滦拉萨街I座 287593', 'mail': 'juan58@gmail.com', 'birthdate': datetime.date(1975, 8, 28)}
 
simple_profile():随机生成简单档案信息

高级用法

如何创建一个Provider

首先来分析源码,找到providers随便找一个类型进入,查看如何实现:

在这里插入图片描述
发现所有的Provider都继承自BaseProvider:
在这里插入图片描述
也就是只需要继承BaseProvider然后给其添加一个静态属性即可:

from faker import Faker
fake = Faker()

# first, import a similar Provider or use the default one
from faker.providers import BaseProvider

# create new provider class
class MyProvider(BaseProvider):
    def foo(self) -> str:
        return 'bar'

# then add new provider to faker instance
fake.add_provider(MyProvider)

# now you can use:
fake.foo()
# 'bar'

我们知道用.调用,会触发__getattr__方法,那调用链路就十分明确了。 先来看一个简单的实例:

class Methods:

    def name(self):
        return "methods"


class C:

    def __init__(self):
        self.src = [Methods()]

    def __getattr__(self, item):
        for src in self.src:
            return getattr(src, item)


if __name__ == '__main__':
    print(C().name())

name()方法是资源类Methods的方法,但可以通过getattr反射获取到,

在这里插入图片描述
同理,当我们不携带任何参数创建Faker实例的时候fake = Faker(),初始化函数内初始化了一个Faker生成器对象
在这里插入图片描述
在这里插入图片描述
当调用add_provider(MyProvider)时,实际上调用的是Generator对象的add_provider
在这里插入图片描述
最后执行set_formatter方法将Provider的方法设置到Generator中,
在这里插入图片描述
这样,当调用fake.foo(),触发__getattr__从而去Generator中取值,自然顺利成章的就取到了!

如何创建一个动态 Provider

动态provider可以从外部来源读取元素

from faker import Faker
from faker.providers import DynamicProvider

medical_professions_provider = DynamicProvider(
     provider_name="medical_profession",
     elements=["dr.", "doctor", "nurse", "surgeon", "clerk"],
)

fake = Faker()

# then add new provider to faker instance
fake.add_provider(medical_professions_provider)

# now you can use:
fake.medical_profession()
# 'dr.'

给出一个案例:

import random
from faker import Faker
from faker.providers import BaseProvider, DynamicProvider


# 方法1:自定义Provider,用于随机生成性别,男、女、未知,三个取值出现的概率比是100:100:1
class GenderProvider(BaseProvider):
    def gender(self):
        return random.sample(['男', '女', '未知'], counts=[100, 100, 1], k=1)[0]


# 方法2:通过DynamicProvider对象,实现自定义生成器扩展功能,但是,没有方法1更加灵活,比如不能控制不同取值的概率
gender_provider = DynamicProvider(provider_name='gender2', elements=['男', '女', '未知'])

# 指定语言环境为中文环境,创建Faker生成器
fk = Faker('zh_CN')
fk.add_provider(GenderProvider)
fk.add_provider(gender_provider)
print(fk.name())
print(fk.gender())
# 多试几次,很容易出现'未知'的取值
print(fk.gender2())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Generalzy

文章对您有帮助,倍感荣幸

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值