Python学习之-faker模块详解

背景:

在软件需求、开发、测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据。由于现在的业务系统数据多种多样,千变万化。在手动制造数据的过程中,可能需要花费大量精力和工作量,此项工作既繁复又容易出错,比如要构造一批用户三要素(姓名、手机号、身份证)、构造一批银行卡数据、或构造一批地址通讯录等。

1 faker是什么?

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

1.1 faker安装

faker的安装很简单直接pip就可以

pip install faker

一旦安装完成,你就可以导入Faker类并创建一个实例。

from faker import Faker
fake = Faker()

你还可以指定要使用的语言/地区,以生成特定区域的假数据:

fake = Faker('zh_CN')  # 为中国地区生成数据

2 常用函数

以下是一些Faker支持的常用函数及其示例:

2.1 姓名:

from faker import Faker
fake = Faker('zh_CN')
print(fake.name())  # 生成一个随机名字,例如:张伟

2.2 地址:

from faker import Faker
fake = Faker('zh_CN')
print(fake.address())  # 生成一个随机地址,例如:山东省青岛市市北赵路p座 688081

2.3 邮箱:

from faker import Faker
fake = Faker('zh_CN')
print(fake.email())  # 生成一个随机邮箱地址,例如:dchen@example.org

2.4 文本:

from faker import Faker
fake = Faker('zh_CN')
print(fake.text())  # 生成一段随机文本,例如:越往后渐渐可能选择。

2.5 日期和时间:

from faker import Faker
fake = Faker('zh_CN')
print(fake.date())         # 生成一个随机日期,格式为YYYY-MM-DD,例如:2004-11-11
print(fake.date_time())    # 生成一个随机日期和时间,例如:1997-11-21 06:24:46

2.6 URL:

from faker import Faker
fake = Faker('zh_CN')
print(fake.url())  # 生成一个随机URL,例如:https://www.example.com/

2.7 手机号:

from faker import Faker
fake = Faker('zh_CN')
print(fake.phone_number())  # 生成一个随机手机号码,例如:13100067777

以上只是一些简单的例子,Faker除了这些简单的应用,还可以使用Faker类创建更加复杂的数据场景,像通讯记录、信用卡记录和学信档案这些模拟数据是通过结合Faker的不同函数生成的。下面给出一些用Faker模拟这些场景的例子:

3 构造通讯记录

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/9
# @Author  : Summer
# @File    : faker_test.py
# @describe:
"""
from faker import Faker
import random

fake = Faker()


# 模拟生成一个通讯记录的函数
def create_fake_call_record():
    return {
        'caller': fake.phone_number(),
        'recipient': fake.phone_number(),
        'duration': str(random.randint(1, 3600)),  # 假设通话时间从1秒到1小时
        'time': fake.date_time_between(start_date='-1y', end_date='now').strftime('%Y-%m-%d %H:%M:%S'),  # 过去一年里的某个时间点
        'type': random.choice(['incoming', 'outgoing', 'missed'])  # 来电、去电、未接
    }

# 打印一条通讯记录
print(create_fake_call_record()) 
# {'caller': '(966)997-6292', 'recipient': '(687)407-8585x92735', 'duration': '1161', 'time': '2023-10-07 07:07:56', 'type': 'incoming'}

4 生成信用卡记录

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/9
# @Author  : Summer
# @File    : faker_test.py
# @describe:
"""
from faker import Faker
import random
from datetime import datetime

fake = Faker()


# 模拟生成一个信用卡记录的函数
def create_fake_credit_card_transaction():
    return {
        'credit_card_provider': fake.credit_card_provider(),
        'credit_card_number': fake.credit_card_number(),
        'credit_card_security_code': fake.credit_card_security_code(),
        'transaction_date': fake.date_time_between(start_date='-1y', end_date='now').strftime('%Y-%m-%d %H:%M:%S'),
        'transaction_amount': '{:.2f}'.format(random.uniform(1.0, 10000.0)),  # 交易金额
        'currency': fake.currency_code()
    }

# 打印一条信用卡交易记录
print(create_fake_credit_card_transaction())
# {'credit_card_provider': 'Mastercard', 'credit_card_number': '3584813286924455', 'credit_card_security_code': '973', 'transaction_date': '2023-07-12 00:20:10', 'transaction_amount': '240.38', 'currency': 'LYD'}

5 模拟学信档案

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/9
# @Author  : Summer
# @File    : faker_test.py
# @describe:
"""
from faker import Faker
import random

fake = Faker()


# 模拟生成一个学信档案的函数
def create_fake_education_record():
    return {
        'name': fake.name(),
        'birth_date': fake.date_of_birth(tzinfo=None, minimum_age=18, maximum_age=30).strftime('%Y-%m-%d'),
        'nationality': fake.country(),
        'university': fake.company(),  # 由于faker没有提供随机大学名的构造 这里用company代替
        'degree': random.choice(['bachelor', 'master', 'phd']),
        'major': fake.job(), 
        'enrollment_date': fake.date_between(start_date='-10y', end_date='-4y').strftime('%Y-%m-%d'),
        'graduation_date': fake.date_between(start_date='-4y', end_date='now').strftime('%Y-%m-%d')
    }

# 打印一个假定的学信档案
print(create_fake_education_record())

6 生成结构化信息

在Python中,可以使用Faker库生成各种结构化数据(如字典、列表等),这些数据可以用来模拟例如数据库记录、API返回值、配置文件等的结构。
下面是一个如何使用Faker生成结构化信息的示例。在这个例子中,我们将生成一个具有嵌套结构的信息,其中包括个人资料、职业资料和联系方式。

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/9
# @Author  : Summer
# @File    : faker_test.py
# @describe:
"""
from faker import Faker
fake = Faker()


# 定义一个函数来创建一个假的个人资料字典
def create_fake_profile():
    profile = {
        "name": fake.name(),
        "age": fake.random_int(min=18, max=80),
        "address": fake.address(),
        "email": fake.email(),
        "username": fake.user_name(),
    }
    return profile


# 定义一个函数来创建假的职业资料
def create_fake_job_info():
    job_info = {
        "company": fake.company(),
        "job_title": fake.job(),
        "department": fake.word(ext_word_list=["HR", "IT", "Sales", "Marketing", "Administration"]),
        "employment_date": fake.date_between(start_date='-5y', end_date='today').strftime('%Y-%m-%d'),
    }
    return job_info


# 定义一个函数来创建联系信息
def create_fake_contact_info():
    contact_info = {
        "phone_number": fake.phone_number(),
        "email": fake.email(),
    }
    return contact_info


# 创建包含个人资料、职业和联系信息的Python结构
def create_structured_profile():
    structured_profile = {
        "personal": create_fake_profile(),
        "job": create_fake_job_info(),
        "contact": create_fake_contact_info(),
    }
    return structured_profile


# 使用上述函数生成结构化数据
structured_data = create_structured_profile()

# 打印出结构化数据
print(structured_data)

# 输出
'''
{'personal': {'name': 'Leslie Beltran', 'age': 58, 'address': '758 Reed Terrace Suite 321\nDanielmouth, LA 38394', '
email': 'pdoyle@example.org', 'username': 'wstanton'}, 'job': {'company': 'Martinez-Randolph', 
'job_title': 'Therapist, horticultural', 'department': 'Marketing', 'employment_date': '2019-10-16'},
 'contact': {'phone_number': '(476)616-5873', 'email': 'xwatson@example.net'}}
'''

7 自定义faker数据类型

Faker库提供了内置的数据类型生成器,但有时你可能需要生成特定格式的数据或者根据自己的需求来生成数据。在这种情况下,你可以通过添加自定义提供者(custom providers)或直接在Python中创建自己的函数来自定义Faker数据类型。
7.1 方法一:添加自定义提供者
假设你想要创建一个生成特定格式SKU(Stock Keeping Unit,库存单位)的生成器,SKU的格式如"ABC-123456"。
首先,你可以创建一个自定义提供者类:

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/9
# @Author  : Summer
# @File    : faker_test.py
# @describe:
"""
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

7.2 方法二:扩展现有提供者

Faker的提供者是可扩展的,这意味着你可以扩展一个现有的提供者来增加或修改其功能。在继承一个提供者类时,你可以覆盖其中的方法或添加新的方法来扩充提供者的功能。
例如,扩展已有地址提供者以添加一个特定格式的邮编生成方法:

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/9
# @Author  : Summer
# @File    : faker_test.py
# @describe:
"""
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())

总结:

Faker通常用于单元测试、数据库填充数据、模拟API响应等场合,但应避免使用随机生成的数据来处理实际业务逻辑,因为这些数据是虚假的,不应用于实际场景。总之,Faker是一个非常有用的工具,可以为开发者和测试人员提供方便快捷的方式来生成各种伪数据。通过内置的数据生成器以及自定义扩展的功能,它可以满足多样的数据生成需求。

  • 28
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

夏天Aileft

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值