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():随机生成指定时间(1970年1月1日至今)
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())