Python 第三方模块之 faker - 伪数据生成工具

1、Faker 概述

Faker 是一个 Python 库,用于生成伪数据。它可以创建用于测试、填充数据库和在各种应用程序中模拟数据的虚假但合理的数据。Faker 支持多种不同的数据类型,包括但不限于:姓名、地址、邮件、文本、日期、URL等。

引用官方文档的一段概述:

1
2
3
Faker is a Python package that generates fake data for you. Whether you need to bootstrap your database, create good-looking XML documents, fill-in your persistence to stress test it, or anonymize data taken from a production service, Faker is for you.

Faker is heavily inspired by PHP Faker, Perl Faker, and by Ruby Faker.

Faker 是一个可生成假数据 python 依赖包,无论你是否是需要初始化数据库、创建美观的XML文档、填充持久化存储进行压力测试或者是从产品供应商获取匿名数据,用 Faker 就对了。

2、Faker 安装

pip install faker

3、Faker 基本用法

1
2
3
4
5
6
7
8
9
10
11
# 导入
from faker import Faker

# 创建faker对象(可添加 locale 参数添加特定区域代码,例如 "en_US","zh_CN" 等)
fake = Faker()

# 随机生成姓名,例如:张伟
fake_name = fake.name()

# 随机生成地址,例如:山东省青岛市市北赵路p座 688081
fake_address = fake.address()

国际化支持

创建 Faker 对象是输入不同地区的国际化代码,可根据指定区域生成特定的伪数据,例如en_US代表美国地区,zh_CN代表中国大陆地区。以下是国际化区域代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
ar_EG - Arabic         (埃及)
ar_PS - Arabic (巴勒斯坦)
ar_SA - Arabic (沙特阿拉伯)
bg_BG - Bulgarian (保加利亚)
bs_BA - Bosnian (波黑)
cs_CZ - Czech (捷克)
de_DE - German (德国)
dk_DK - Danish (丹麦)
el_GR - Greek (希腊)
en_AU - English (澳大利亚)
en_CA - English (加拿大)
en_GB - English (大不列颠)
en_NZ - English (新西兰)
en_US - English (美国)
es_ES - Spanish (西班牙)
es_MX - Spanish (墨西哥)
et_EE - Estonian (爱沙尼亚)
fa_IR - Persian (伊朗)
fi_FI - Finnish (芬兰)
fr_FR - French (法国)
hi_IN - Hindi (印度)
hr_HR - Croatian (克罗地亚)
hu_HU - Hungarian (匈牙利)
hy_AM - Armenian (亚美尼亚)
it_IT - Italian (意大利)
ja_JP - Japanese (日本)
ka_GE - Georgian (格鲁吉亚)
ko_KR - Korean (韩国)
lt_LT - Lithuanian (立陶宛)
lv_LV - Latvian (拉脱维亚)
ne_NP - Nepali (尼泊尔)
nl_NL - Dutch (荷兰)
no_NO - Norwegian (挪威)
pl_PL - Polish (波兰)
pt_BR - Portuguese (巴西)
pt_PT - Portuguese (葡萄牙)
ro_RO - Romanian (罗马尼亚)
ru_RU - Russian (俄罗斯)
sl_SI - Slovene (斯洛文尼亚)
sv_SE - Swedish (瑞典)
tr_TR - Turkish (土耳其)
uk_UA - Ukrainian (乌克兰)
zh_CN - Chinese (中国大陆-简体字)
zh_TW - Chinese (中国台湾-繁体字)

注:个别方法具有针对性,比如province()方法适用中国,但不适用美国及其他一些国家。

4、数据类别

人物相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from faker import Faker

fake = Faker()
fake.first_name() # 名字
fake.first_name_female() # 名字(女)
fake.first_name_male() # 名字(男)
fake.first_romanized_name() # 名字(罗马文)
fake.last_name() # 姓
fake.last_name_female() # 姓(女)
fake.last_name_male() # 姓(男)
fake.last_romanized_name() # 姓(罗马文)
fake.name() # 姓名
fake.name_female() # 姓名(女)
fake.name_male() # 姓名(男)
fake.prefix() # 称谓
fake.prefix_female() # 称谓(女)
fake.prefix_male() # 称谓(男)
fake.romanized_name() # 称谓(罗马文)
fake.suffix() # 姓名后缀(中文不适用)

身份证相关

1
2
3
4
from faker import Faker

fake = Faker()
fake.ssn() # 身份证

地址相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from faker import Faker

fake = Faker()
fake.address() # 地址
fake.building_number() # 楼名
fake.city() # 完整城市名
fake.city_name() # 城市名字(不带市县)
fake.city_suffix() # 城市后缀名
fake.country() # 国家名称
fake.district() # 地区
fake.postcode() # 邮编
fake.province() # 省
fake.street_address() # 街道地址
fake.street_name() # 街道名称
fake.street_suffix() # 街道后缀名
fake.country_code(representation="alpha-2") # 国家编号

汽车相关

1
2
3
4
from faker import Faker

fake = Faker()
fake.license_plate() # 牌照

银行相关

1
2
3
4
5
6
from faker import Faker

fake = Faker()
fake.bank_country() # 银行所属国家
fake.bban() # 基本银行账号
fake.iban() # 国际银行代码

条形码相关

1
2
3
4
5
6
from faker import Faker

fake = Faker()
fake.ean(length=13) # EAN条形码
fake.ean13() # EAN13条形码
fake.ean8() # EAN8条形码

颜色相关

1
2
3
4
5
6
7
8
9
from faker import Faker

fake = Faker()
fake.color_name() # 颜色名称
fake.hex_color() # 颜色十六进制值
fake.rgb_color() # 颜色RGB值
fake.rgb_css_color() # CSS颜色值
fake.safe_color_name() # 安全色
fake.safe_hex_color() # 安全色十六进制值

公司相关

1
2
3
4
5
6
7
8
from faker import Faker

fake = Faker()
fake.bs() # 商业用词
fake.catch_phrase() # 妙句(口号)
fake.company() # 公司名称
fake.company_prefix() # 公司名称前缀
fake.company_suffix() # 公司名称后缀

信用卡相关

1
2
3
4
5
6
7
8
from faker import Faker

fake = Faker()
fake.credit_card_expire(start="now", end="+10y", date_format="%m/%y") # 过期年月
fake.credit_card_full(card_type=None) # 完整信用卡信息
fake.credit_card_number(card_type=None) # 信用卡卡号
fake.credit_card_provider(card_type=None) # 信用卡提供商
fake.credit_card_security_code(card_type=None) # 信用卡安全码

货币相关

1
2
3
4
5
6
7
8
9
from faker import Faker

fake = Faker()
fake.cryptocurrency() # 加密货币代码+名称
fake.cryptocurrency_code() # 加密货币代码
fake.cryptocurrency_name() # 加密货币名称
fake.currency() # 货币代码+名称
fake.currency_code() # 货币代码
fake.currency_name() # 货币名称

时间相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from faker import Faker

fake = Faker()
fake.am_pm() # AM或PM
fake.century() # 世纪
fake.date(pattern="%Y-%m-%d", end_datetime=None) # 日期字符串(可设置格式和最大日期)
fake.date_between(start_date="-30y", end_date="today") # 日期(可设置限定范围)
fake.date_between_dates(date_start=None, date_end=None) # 同上
fake.date_object(end_datetime=None) # 日期(可设置最大日期)
fake.date_of_birth(tzinfo=None, minimum_age=0, maximum_age=115) # 出生日期
fake.date_this_century(before_today=True, after_today=False) # 本世纪日期
fake.date_this_decade(before_today=True, after_today=False) # 本年代中的日期
fake.date_this_month(before_today=True, after_today=False) # 本月中的日期
fake.date_this_year(before_today=True, after_today=False) # 本年中的日期
fake.date_time(tzinfo=None, end_datetime=None) # 日期和时间
fake.date_time_ad(tzinfo=None, end_datetime=None, start_datetime=None) # 日期和时间(从001年1月1日到现在)
fake.date_time_between(start_date="-30y", end_date="now", tzinfo=None) # 日期时间(可设置限定范围)
fake.date_time_between_dates(datetime_start=None, datetime_end=None, tzinfo=None) # 同上
fake.date_time_this_century(before_now=True, after_now=False, tzinfo=None) # 本世纪中的日期和时间
fake.date_time_this_decade(before_now=True, after_now=False, tzinfo=None) # 本年代中的日期和时间
fake.date_time_this_month(before_now=True, after_now=False, tzinfo=None) # 本月中的日期和时间
fake.date_time_this_year(before_now=True, after_now=False, tzinfo=None) # 本年中的日期和时间
fake.day_of_month() # 几号
fake.day_of_week() # 星期几
fake.future_date(end_date="+30d", tzinfo=None) # 未来日期
fake.future_datetime(end_date="+30d", tzinfo=None) # 未来日期和时间
fake.iso8601(tzinfo=None, end_datetime=None) # iso8601格式日期和时间
fake.month() # 第几月
fake.month_name() # 月份名称
fake.past_date(start_date="-30d", tzinfo=None) # 过去日期
fake.past_datetime(start_date="-30d", tzinfo=None) # 过去日期和时间
fake.time(pattern="%H:%M:%S", end_datetime=None) # 时间(可设置格式和最大日期时间)
fake.time_delta(end_datetime=None) # 时间间隔
fake.time_object(end_datetime=None) # 时间(可设置最大日期时间)
fake.time_series(start_date="-30d", end_date="now", precision=None, distrib=None, tzinfo=None)
fake.timezone() # 时区
fake.unix_time(end_datetime=None, start_datetime=None) # UNIX时间戳
fake.year() # 某年

文件相关

1
2
3
4
5
6
7
8
9
from faker import Faker

fake = Faker()
fake.file_extension(category=None) # 文件扩展名
fake.file_name(category=None, extension=None) # 文件名
fake.file_path(depth=1, category=None, extension=None) # 文件路径
fake.mime_type(category=None) # MIME类型
fake.unix_device(prefix=None) # UNIX设备
fake.unix_partition(prefix=None) # UNIX分区

坐标相关

1
2
3
4
5
6
7
8
9
from faker import Faker

fake = Faker()
fake.coordinate(center=None, radius=0.001) # 坐标
fake.latitude() # 纬度
fake.latlng() # 经纬度
fake.local_latlng(country_code="US", coords_only=False) # 返回某个国家某地的经纬度
fake.location_on_land(coords_only=False) # 返回地球上某个位置的经纬度
fake.longitude() # 经度

网络相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from faker import Faker

fake = Faker()
fake.ascii_company_email() # 企业邮箱(ascii编码)
fake.ascii_email() # 企业邮箱+免费邮箱(ascii编码)
fake.ascii_free_email() # 免费邮箱(ascii编码)
fake.ascii_safe_email() # 安全邮箱(ascii编码)
fake.company_email() # 企业邮箱
fake.domain_name(levels=1) # 域名
fake.domain_word() # 二级域名
fake.email() # 企业邮箱+免费邮箱
fake.free_email() # 免费邮箱
fake.free_email_domain() # 免费邮箱域名
fake.hostname() # 主机名
fake.image_url() # 图片URL
fake.ipv4() # ipv4
fake.ipv4_network_class()
fake.ipv4_private() # 私有ipv4
fake.ipv4_public() # 公共ipv4
fake.ipv6() # ipv6
fake.mac_address() # MAC地址
fake.safe_email() # 安全邮箱
fake.slug() # URL中的slug
fake.tld() # 顶级域名
fake.uri() # URI
fake.uri_extension() # URI扩展
fake.uri_page() # URI页
fake.uri_path(deep=None) # URI路径
fake.url(schemes=None) # URL
fake.user_name() # 用户名

图书相关

1
2
3
4
5
from faker import Faker

fake = Faker()
fake.isbn10(separator="-") # ISBN-10图书编号
fake.isbn13(separator="-") # ISBN-13图书编号

职位相关

1
2
3
4
from faker import Faker

fake = Faker()
fake.job() # 职位

文本相关

1
2
3
4
5
6
7
8
9
10
11
from faker import Faker

fake = Faker()
fake.paragraph(nb_sentences=3, variable_nb_sentences=True, ext_word_list=None) # 单个段落
fake.paragraphs(nb=3, ext_word_list=None) # 多个段落
fake.sentence(nb_words=6, variable_nb_words=True, ext_word_list=None) # 单个句子
fake.sentences(nb=3, ext_word_list=None) # 多个句子
fake.text(max_nb_chars=200, ext_word_list=None) # 单个文本
fake.texts(nb_texts=3, max_nb_chars=200, ext_word_list=None) # 多个文本
fake.word(ext_word_list=None) # 单个词语
fake.words(nb=3, ext_word_list=None, unique=False) # 多个词语

编码相关

1
2
3
4
5
6
7
8
9
10
11
from faker import Faker

fake = Faker()
fake.binary(length=1048576) # 二进制
fake.boolean(chance_of_getting_true=50) # 布尔值
fake.md5(raw_output=False) # Md5
fake.null_boolean() # NULL+布尔值
fake.password(length=10, special_chars=True, digits=True, upper_case=True, lower_case=True) # 密码
fake.sha1(raw_output=False) # SHA1
fake.sha256(raw_output=False) # SHA256
fake.uuid4() # UUID4

电话相关

1
2
3
4
5
6
from faker import Faker

fake = Faker()
fake.msisdn() # 完整手机号码(加了国家和国内区号)
fake.phone_number() # 手机号
fake.phonenumber_prefix() # 区号

档案相关

1
2
3
4
5
from faker import Faker

fake = Faker()
fake.profile(fields=None, sex=None) # 档案(完整)
fake.simple_profile(sex=None) # 档案(简单)

Python相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from faker import Faker

fake = Faker()
fake.pybool() # Python布尔值
fake.pydecimal() # Python十进制数
fake.pydict() # Python字典
fake.pyfloat() # Python浮点数
fake.pyint() # Python整型值
fake.pyiterable() # Python可
fake.pylist() # Python列表
fake.pyset() # Python集合
fake.pystr() # Python字符串
fake.pystruct() # Python结构
fake.pytuple() # Python元组

用户代理相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from faker import Faker

fake = Faker()
fake.android_platform_token() # 安卓
fake.chrome(version_from=13, version_to=63, build_from=800, build_to=899) # Chrome
fake.firefox() # FireFox
fake.internet_explorer() # Ie
fake.ios_platform_token() # ios
fake.linux_platform_token() # Linux
fake.linux_processor() # Linux处理器
fake.mac_platform_token() # Mac
fake.mac_processor() # Mac处理器
fake.opera() # Opera
fake.safari() # Safari
fake.user_agent() # 随机用户代理
fake.windows_platform_token() # Windows

5、自定义faker数据类型

Faker 库提供了内置的数据类型生成器,但有时你可能需要生成特定格式的数据或者根据自己的需求来生成数据。在这种情况下,你可以通过添加自定义提供者(custom providers)或直接在 Python 中创建自己的函数来自定义 Faker 数据类型。

5.1、方法一:添加自定义提供者

假设你想要创建一个生成特定格式SKU(Stock Keeping Unit,库存单位)的生成器,SKU的格式如”ABC-123456”。

首先,你可以创建一个自定义提供者类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from faker.providers import BaseProvider
import random


class CustomProvider(BaseProvider):

def sku(self):
part1 = ''.join(random.choices('ABCDEFGHIJKLMNOPQRSTUVWXYZ', k=3))
part2 = ''.join(random.choices('0123456789', k=6))
return f"{part1}-{part2}"


if __name__ == '__main__':

from faker import Faker

fake = Faker()
# 然后将自定义提供者添加给Faker实例:
fake.add_provider(CustomProvider)

# 使用自定义方法生成SKU
print(fake.sku()) # PFY-358864

5.2、方法二:扩展现有提供者

Faker 的提供者是可扩展的,这意味着你可以扩展一个现有的提供者来增加或修改其功能。在继承一个提供者类时,你可以覆盖其中的方法或添加新的方法来扩充提供者的功能。

例如,扩展已有地址提供者以添加一个特定格式的邮编生成方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from faker import Faker
from faker.providers import BaseProvider
import random

fake = Faker()


class MyCustomProvider(BaseProvider):

def zipcode_plus_four(self):
# 我们这里用 fake.zipcode() 来生成普通的邮编
normal_zipcode = fake.zipcode()
plus_four = ''.join(random.choices('0123456789', k=4))
return f"{normal_zipcode}-{plus_four}"


fake.add_provider(MyCustomProvider)

# 现在你可以生成“加四”邮编
print(fake.zipcode_plus_four())

Python 第三方模块之 faker - 伪数据生成工具
https://flepeng.github.io/021-Python-33-Python-第三方模块-Python-第三方模块之-faker-伪数据生成工具/
作者
Lepeng
发布于
2016年8月3日
许可协议