Python Faker
最后修改于 2024 年 1 月 29 日
在本文中,我们将展示如何使用 Faker 包在 Python 中生成假数据。我们使用 joke2k/faker
库。
Faker
Faker 是一个生成假数据的 Python 库。假数据通常用于测试或用一些示例数据填充数据库。Faker 大量借鉴了 PHP 的 Faker、Perl 的 Data::Faker 和 Ruby 的 Faker。
设置 Faker
该包使用 composer 安装。
$ pip install Faker
我们安装 Faker 模块。
$ pip install Dumper
此外,我们还安装了 Dumper,它在转储变量时提供更漂亮的控制台输出。
Faker 生成器
faker.Faker
创建并初始化一个 faker 生成器,该生成器可以通过访问以数据类型命名的属性来生成数据。
Faker 将数据生成委托给提供程序。默认提供程序使用英语区域设置。Faker 支持其他区域设置;它们的完成程度各不相同。
简单的 Faker
以下示例是 Faker 的简单演示。
#!/usr/bin/python from faker import Faker faker = Faker() print(f'name: {faker.name()}') print(f'address: {faker.address()}') print(f'text: {faker.text()}')
该示例输出一个假姓名、地址和文本。
$ ./simple.py name: Arthur Patton address: 0638 Larsen Way Tylermouth, CA 48344 text: Save general start bar. Become class both bank Mrs so myself. Each difficult performance even. Total anyone develop her raise research both. Laugh sport necessary tree. As during day up fall.
生成假姓名
在第二个示例中,我们生成与用户姓名相关的数据。
#!/usr/bin/python from faker import Faker faker = Faker() print(f'Name: {faker.name()}') print(f'First name: {faker.first_name()}') print(f'Last name: {faker.last_name()}') print('--------------------------') print(f'Male name: {faker.name_male()}') print(f'Female name: {faker.name_female()}')
该示例生成假的全名、名字、男性和女性姓氏。
$ ./names.py Name: Tara Brown First name: Stephanie Last name: Martin -------------------------- Male name: John Banks Female name: Lacey Roberts
生成假职位
职位通过 job
生成。
#!/usr/bin/python from faker import Faker faker = Faker() for _ in range(6): print(faker.job())
该示例生成六个假职位。
$ ./jobs.py Town planner Paediatric nurse Geographical information systems officer Water quality scientist Engineer, maintenance Designer, ceramics/pottery
生成本地化数据
Faker 在一定程度上支持本地化数据。区域设置会传递给构造函数。请注意,区域设置的完成程度各不相同。
#!/usr/bin/python from faker import Faker faker = Faker('cz_CZ') for i in range(3): name = faker.name() address = faker.address() phone = faker.phone_number() print(f'{name}, {address}, {phone}')
该示例以捷克语生成假数据。
$ ./localized.py Irena Novotná, Nad Šancemi 725 055 80 Bojkovice, 606 136 053 Stanislav Svoboda, Březanova 225 621 17 Bystřice pod Hostýnem, 727 057 251 Klára Moravcová, Neužilova 6/3 134 97 Česká Kamenice, 606 374 469
这是示例输出。请注意,捷克语有重音符号。
生成假货币
以下示例创建假货币数据。
#!/usr/bin/python from faker import Faker faker = Faker() print(f'currency: {faker.currency()}') print(f'currency name: {faker.currency_name()}') print(f'currency code: {faker.currency_code()}')
该程序生成假货币。
$ ./currencies.py currency: ('ISK', 'Icelandic króna') currency name: Israeli new shekel currency code: DJF
生成假单词
Faker 允许创建示例单词。
#!/usr/bin/python from faker import Faker faker = Faker() print(f'a word: {faker.word()}') print(f'six words: {faker.words(6)}') words = ['forest', 'blue', 'cloud', 'sky', 'wood', 'falcon'] print(f'customized unique words: {faker.words(3, words, True)}')
该示例创建示例单词。
print(f'a word: {faker.word()}')
这一行生成一个假单词。
print(f'six words: {faker.words(6)}')
这里我们生成六个示例单词。
words = ['forest', 'blue', 'cloud', 'sky', 'wood', 'falcon'] print(f'customized unique words: {faker.words(3, words, True)}')
我们还可以从预定义的单词列表中创建假单词。
$ ./words.py a word: show six words: ['value', 'its', 'those', 'wish', 'enter', 'hold'] customized unique words: ['forest', 'blue', 'sky']
生成假资料
Faker 可以使用 simple_profile
创建简单的示例资料,并使用 profile
创建扩展资料。
#!/usr/bin/python from faker import Faker import dumper faker = Faker() profile1 = faker.simple_profile() dumper.dump(profile1) print('--------------------------') profile2 = faker.simple_profile('M') dumper.dump(profile2) print('--------------------------') profile3 = faker.profile(sex='F') dumper.dump(profile3)
该示例为男性和女性创建了示例资料。
$ ./profiles.py <dict at 0x20d590a7678>: username: 'gmorgan' name: 'Jessica Clark' sex: 'F' address: '694 Joseph Valleys\nJohnfort, ME 81780' mail: 'bettybuckley@yahoo.com' birthdate: <str at 0x20d5bcbd7b0>: 'datetime.date(1938, 9, 18)' -------------------------- <dict at 0x20d5b0065e8>: username: 'mrios' name: 'Harold Wagner' sex: 'M' address: '26439 Robinson Radial\nWest Meghanmouth, PA 85463' mail: 'josechoi@gmail.com' birthdate: <str at 0x20d5bcbd7b0>: 'datetime.date(1986, 8, 18)' -------------------------- <dict at 0x20d5bd24990>: job: 'Engineer, communications' company: 'Jackson-Willis' ssn: '430-41-6118' residence: 'USNS Odom\nFPO AP 47095' current_location: <tuple at 0x20d5bca9a88> 0: <str at 0x20d5bd248a0>: "Decimal('74.1885785')" 1: <str at 0x20d5bd248a0>: "Decimal('119.951995')" blood_group: 'O-' website: ['http://roberson.com/'] username: 'ygutierrez' name: 'Lindsay Walker' sex: 'F' address: '22968 Beverly Road Suite 918\nTimothyborough, SD 10494' mail: 'aliciamccall@yahoo.com' birthdate: <str at 0x20d5bcbd7b0>: 'datetime.date(1979, 1, 4)'
生成假数字
Faker 允许生成随机数字和整数。
#!/usr/bin/python from faker import Faker faker = Faker() print(f'Random int: {faker.random_int()}') print(f'Random int: {faker.random_int(0, 100)}') print(f'Random digit: {faker.random_digit()}')
该示例生成随机数字和整数。
print(f'Random int: {faker.random_int(0, 100)}')
我们可以在 random_int
方法中指定边界。
$ ./fake_numbers.py Random int: 5181 Random int: 91 Random digit: 9
生成假哈希和 UUID
Faker 支持生成示例哈希和 UUID。
#!/usr/bin/python from faker import Faker faker = Faker() print(f'md5: {faker.md5()}') print(f'sha1: {faker.sha1()}') print(f'sha256: {faker.sha256()}') print(f'uuid4: {faker.uuid4()}')
该示例生成三个假哈希和一个 UUID 值。
$ ./hash_uuid.py md5: aace57d56794686acec9eb190d401d46 sha1: 9f8f6af3089e7b5ed571591701afcfd9c2bb7a0e sha256: 8b117b58599809f50735c701f598312b0f64203a8ffacde09af23db69cfd62d5 uuid4: 38092dcd-0e49-4ac0-b39b-7edf6db62290
生成与互联网相关的数据
Faker 提供了几个访问器来生成与互联网相关的数据。
#!/usr/bin/python from faker import Faker faker = Faker() print(f'Email: {faker.email()}') print(f'Safe email: {faker.safe_email()}') print(f'Free email: {faker.free_email()}') print(f'Company email: {faker.company_email()}') print('------------------------------------') print(f'Host name: {faker.hostname()}') print(f'Domain name: {faker.domain_name()}') print(f'Domain word: {faker.domain_word()}') print(f'TLD: {faker.tld()}') print('------------------------------------') print(f'IPv4: {faker.ipv4()}') print(f'IPv6: {faker.ipv6()}') print(f'MAC address: {faker.mac_address()}') print('------------------------------------') print(f'Slug: {faker.slug()}') print(f'Image URL: {faker.image_url()}')
该示例显示了各种与互联网相关的数据,包括电子邮件、域名、slug、IP 地址和 URL。
$ ./internet.py Email: hescobar@acevedo.info Safe email: jonesgregory@example.net Free email: zchambers@yahoo.com Company email: paulbailey@gordon-woods.com ------------------------------------ Host name: desktop-12.rodriguez-underwood.com Domain name: henry.com Domain word: davis TLD: com ------------------------------------ IPv4: 192.31.48.26 IPv6: 75cd:2c43:37f5:774c:dd:5a2f:ae5d:bfc9 MAC address: 3d:b1:39:ec:c6:53 ------------------------------------ Slug: of-street-fight Image URL: https://placeimg.com/311/871/any
生成假日期和时间
Faker 提供了许多用于生成假日期和时间值的方法。
#!/usr/bin/python from faker import Faker faker = Faker() print(f'Date of birth: {faker.date_of_birth()}') print(f'Century: {faker.century()}') print(f'Year: {faker.year()}') print(f'Month: {faker.month()}') print(f'Month name: {faker.month_name()}') print(f'Day of week: {faker.day_of_week()}') print(f'Day of month: {faker.day_of_month()}') print(f'Time zone: {faker.timezone()}') print(f'AM/PM: {faker.am_pm()}')
第一个示例显示了出生日期、日期时间部分、时区和 AM/PM 的假方法。
$ ./date_time.py Date of birth: 2008-08-07 Century: IV Year: 1981 Month: 05 Month name: January Day of week: Saturday Day of month: 26 Time zone: Asia/Oral AM/PM: AM
#!/usr/bin/python from faker import Faker faker = Faker() print(f'Datetime this century: {faker.date_time_this_century()}') print(f'Datetime this decade: {faker.date_time_this_decade()}') print(f'Datetime this year: {faker.date_time_this_year()}') print(f'Datetime this month: {faker.date_time_this_month()}') print('-------------------------') print(f'Date this century: {faker.date_this_century()}') print(f'Date this decade: {faker.date_this_decade()}') print(f'Date this year: {faker.date_this_year()}') print(f'Date this month: {faker.date_this_month()}') print('-------------------------') TOTAL_SECONDS = 60*60*24*2 # two days series = faker.time_series(start_date='-12d', end_date='now', precision=TOTAL_SECONDS) for val in series: print(val[0])
第二个示例显示了在当前世纪、十年、年份或月份生成日期时间值的方法。它还包括时间序列值的生成。
$ ./date_time2.py Datetime this century: 2008-11-26 15:47:01 Datetime this decade: 2022-11-12 07:15:20 Datetime this year: 2023-05-05 09:35:05 Datetime this month: 2023-08-05 15:37:58 ------------------------- Date this century: 2006-12-17 Date this decade: 2021-07-23 Date this year: 2023-02-03 Date this month: 2023-08-03 ------------------------- 2023-07-27 15:59:46 2023-07-29 15:59:46 2023-07-31 15:59:46 2023-08-02 15:59:46 2023-08-04 15:59:46 2023-08-06 15:59:46
#!/usr/bin/python from faker import Faker faker = Faker() print(f'Unix time: {faker.unix_time()}') print(f'Datetime: {faker.date_time()}') print(f'iso8601: {faker.iso8601()}') print(f'Date: {faker.date()}') print(f'Time: {faker.time()}') print('-------------------------') print(f"Datetime between: {faker.date_time_between(start_date='-15y', end_date='now')}") print(f"Date between: {faker.date_between()}") print('-------------------------') print(f"Future datetime: {faker.future_datetime()}") print(f"Future date: {faker.future_date()}") print(f"Past datetime: {faker.past_datetime()}") print(f"Past date: {faker.past_date()}")
第三个示例展示了各种日期时间格式的方法,用于获取选定范围内的日期时间值,以及生成未来或过去的值。
$ ./date_time3.py Unix time: 1309385098 Datetime: 1974-06-28 07:08:47 iso8601: 2003-06-13T07:08:07 Date: 1981-08-31 Time: 08:41:29 ------------------------- Datetime between: 2023-02-23 17:32:58 Date between: 1998-03-21 ------------------------- Future datetime: 2023-08-13 15:22:10 Future date: 2023-09-05 Past datetime: 2023-07-29 05:54:17 Past date: 2023-07-28
生成 CSV 假数据
结合 csv
模块,我们创建一个包含假数据的新 CSV 文件。
#!/usr/bin/python from faker import Faker import csv faker = Faker() with open('users.csv', 'w', newline='') as f: fieldnames = ['id', 'first_name', 'last_name', 'occupation'] writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() for i in range(1, 101, 1): _id = i fname = faker.first_name() lname = faker.last_name() occupation = faker.job() writer.writerow({'id': _id, 'first_name': fname, 'last_name': lname, 'occupation': occupation})
数据包含 id、名字、姓氏和职位。数据被写入 users.csv
文件。
fieldnames = ['id', 'first_name', 'last_name', 'occupation'] writer = csv.DictWriter(f, fieldnames=fieldnames)
我们使用具有给定字段名的字典写入器。
writer.writeheader()
我们写入标题行。
for i in range(1, 101, 1): _id = i fname = faker.first_name() lname = faker.last_name() occupation = faker.job() writer.writerow({'id': _id, 'first_name': fname, 'last_name': lname, 'occupation': occupation})
我们生成 100 个用户。每个用户都通过 writerow
方法写入文件。
使用 Faker 生成 XML 数据
在下面的示例中,我们使用 Faker 和 Jinja2 模板生成 XML 数据。XML 文件将包含用户。
$ pip install jinja2
我们安装 Jinja2 模板引擎。
#!/usr/bin/python from jinja2 import Environment, FileSystemLoader from faker import Faker class User: def __init__(self, first_name, last_name, occupation): self.first_name = first_name self.last_name = last_name self.occupation = occupation faker = Faker() users = [] for _ in range(10): first_name = faker.first_name() last_name = faker.last_name() occupation = faker.job() user = User(first_name, last_name, occupation) users.append(user) file_loader = FileSystemLoader('templates') env = Environment(loader=file_loader) template = env.get_template('users.xml.j2') output = template.render(users=users) print(output, file=open('users.xml', 'w'))
该程序生成一个包含十个用户的列表。该列表被传递给 Jinja2 模板进行处理。模板位于 templates
目录下。生成的內容被写入 users.xml
文件。
<?xml version="1.0" encoding="UTF-8"?> <users> {% for user in users %} <user id="{{ loop.index }}"> <firstname>{{ user.first_name }}</firstname> <lastname>{{ user.last_name }}</lastname> <occupation>{{ user.occupation }}</occupation> </user> {% endfor %} </users>
在模板中,我们使用 for
指令来处理用户列表。
来源
在本文中,我们使用 Python Faker 在 Python 中生成了假数据。
作者
列出所有 Python 教程。