8.11.python 相关方法
背景
在软件需求、开发、测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据。由于现在的业务系统数据多种多样,千变万化。在手动制造数据的过程中,可能需要花费大量精力和工作量,此项工作既繁复又容易出错,比如要构造一批用户三要素(姓名、手机号、身份证)、构造一批银行卡数据、或构造一批地址通讯录等。
1 faker是什么?
Faker是一个Python库,用于生成伪数据。它可以创建用于测试、填充数据库和在各种应用程序中模拟数据的虚假但合理的数据。Faker支持多种不同的数据类型,包括但不限于:姓名、地址、邮件、文本、日期、URL等。
1.1.安装
faker的安装很简单直接pip就可以
pip install faker
1.2.简单使用
一旦安装完成,你就可以导入Faker类并创建一个实例。
from faker import Faker
fake = Faker()
# fake = Faker('zh_CN') # 为中国地区生成数据
print(fake.name()) # 生产随机姓名
2 常用函数
Faker 可以生成各种类型的假数据。以下是一些常见的类型:
名字和个人信息
fake.name():生成一个随机名字
fake.first_name():生成一个随机的名字(仅名字部分)
fake.last_name():生成一个随机的姓氏
fake.job():生成一个随机职业
fake.phone_number():生成一个随机电话号码
fake.ssn():生成一个随机身份证号
fake.profile(): 生成一个随机个人档案信息
fake. simple_profile (): 生成一个随机简单档案信息
地址相关
fake.address():生成一个完整的随机地址
fake.city():生成一个随机城市
fake.state():生成一个随机州(美国)
fake.country():生成一个随机国家
fake.zipcode():生成一个随机邮政编码(不支持中国地区)
fake.postcode():生成一个随机邮政编码(支持中国地区)
日期和时间
fake.date():生成一个随机日期
fake.time():生成一个随机时间
fake.date_time():生成一个随机日期和时间
fake.date_of_birth():生成一个随机的出生日期
fake.date_this_month():生成一个当前月的随机日期
公司和商业数据
fake.company():生成一个随机公司名
fake.company_suffix():生成一个随机的公司后缀,如 “Inc.” 或 “Ltd.”
fake.bs():生成商业术语(例如,用于生成企业口号)
互联网上的数据
fake.email():生成一个随机电子邮件
fake.url():生成一个随机的 URL
fake.domain_name():生成一个随机的域名
fake.user_agent():生成一个随机的用户代理字符串(用于 Web 爬虫模拟)
金融数据
fake.credit_card_number():生成一个随机的信用卡号
fake.credit_card_expire():生成一个随机的信用卡过期日期
fake.credit_card_provider():生成一个随机的信用卡提供商
其他
fake.uuid4():生成一个随机的 UUID(通用唯一标识符)
fake.color_name():生成一个随机的颜色名称
fake.boolean():生成一个随机布尔值(True 或 False)
fake.text():生成一个随机文本
fake.ipv4_public(): 生成一个随机公有IP
fake.ipv4_private(): 生成一个随机私有IP
以上只是一些简单的例子,Faker除了这些简单的应用,还可以使用Faker类创建更加复杂的数据场景,像通讯记录、信用卡记录和学信档案这些模拟数据是通过结合Faker的不同函数生成的。下面给出一些用Faker模拟这些场景的例子:
3 构造通讯记录
#!/usr/bin/env python
# coding=utf-8
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())
4 生成信用卡记录
#!/usr/bin/env python
# coding=utf-8
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())
5 模拟学信档案
#!/usr/bin/env python
# coding=utf-8
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
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)
7 自定义faker数据类型
Faker库提供了内置的数据类型生成器,但有时你可能需要生成特定格式的数据或者根据自己的需求来生成数据。在这种情况下,你可以通过添加自定义提供者(custom providers)或直接在Python中创建自己的函数来自定义Faker数据类型。
7.1 方法一:添加自定义提供者
假设你想要创建一个生成特定格式SKU(Stock Keeping Unit,库存单位)的生成器,SKU的格式如"ABC-123456"。
首先,你可以创建一个自定义提供者类:
#!/usr/bin/env python
# coding=utf-8
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
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())
8 函数汇总
8.1.地理信息类
# city_suffix():市,县
# city():城市
# country():国家
# country_code():国家编码
# district():区
# geo_coordinate():地理坐标
# latitude():地理坐标(纬度)
# longitude():地理坐标(经度)
# postcode():邮编
# province():省份
# address():详细地址
# street_address():街道地址
# street_name():街道名
# street_suffix():街、路
8.2.个人基本信息类
# first_name():名
# first_name_female():女性名
# first_name_male():男性名
# last_name():
# name(): 随机姓名全名
# name_female():女性名字
# name_male():男性名字
# last_name_female():女姓
# last_name_male():男姓
# prefix():名字称呼,如先生
# prefix_female():女性称呼
# prefix_male():男性称呼
# phone_number():随机手机号码
# phonenumber_prefix():随机生成手机号段
# profile(fields=None, sex=None):个人配置信息,如工作、公司、身份证号等
# ssn():随机身份证号
# bs():随机公司服务名
# company():公司全称
# company_suffix():公司性质
# company_prefix():随机 company 名(短)
# job():工作随机职位信息
# credit_card_expire(start='now', end='+10y', date_format='%m/%y'):银行卡到期日期
# credit_card_full(card_type=None):银行卡全称信息
# credit_card_number(card_type=None):银行卡号
# credit_card_provider(card_type=None):信用卡类型
# credit_card_security_code(card_type=None):银行卡安全码
8.3.网络信息类
# ascii_company_email():随机ASCII公司邮箱名称
# ascii_email():随机ASCII邮箱
# ascii_free_email():免费邮箱
# ascii_safe_email():安全邮箱
# company_email():公司邮箱
# dga(year=None, month=None, day=None, tld=None, length=None):域名
# domain_name(levels=1):
# email(domain=None):邮箱信息
# free_email():
# free_email_domain():邮箱域名
# hostname(levels=1):主机名
# http_method():http的请求方法
# image_url(width=None, height=None):图片url地址
# ipv4(network=False, address_class=None, private=None):ip地址信息
# ipv4_network_class():ip地址分类
# ipv4_private(network=False, address_class=None):私有ip地址
# ipv4_public(network=False, address_class=None):公网ip地址
# ipv6(network=False):ipv6地址信息
# mac_address():pc的mac地址
# port_number(is_system=False, is_user=False, is_dynamic=False):端口号
# safe_domain_name():安全域名信息
# safe_email():
# uri():随机uri地址
# uri_extension():网页文件后缀
# uri_page():网页文件信息
# uri_path(deep=None):网址文件路径
# url(schemes=None):随机url地址
# user_name(): 随机用户名
8.4.文件信息类
# file_extension(category=None):文件类型
# file_name(category=None, extension=None):随机文件名字
# file_path(depth=1, category=None, extension=None):随机文件路径
# unix_partition(prefix=None):unix分区信息
8.5.数字类
# pybool():布尔型
# pydecimal(left_digits=None, right_digits=None, positive=False, min_value=None, max_value=None):随机Decimal类型数字
# pydict(nb_elements=10, variable_nb_elements=True, value_types=None, *allowed_types):随机字典类型数字
# pyfloat(left_digits=None, right_digits=None, positive=False, min_value=None, max_value=None):随机浮点类型数字
# pyint(min_value=0, max_value=9999, step=1):随机int类型数字
# pystr(min_chars=None, max_chars=20):随机字符串
# pystr_format(string_format='?#-###{{random_int}}{{random_letter}}',
# letters='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'):随机规定格式的字符串
# random_digit():随机数字
# random_digit_not_null():1 ~9 随机数字
# random_int(min=0, max=9999, step=1):0 ~999 的随机数字
# random_number(digits=None, fix_len=False):
# random_uppercase_letter():随机大写字母
# numerify():三位随机数字
8.6.浏览器信息类
# android_platform_token():android版本user_agent信息
# chrome(version_from=13, version_to=63, build_from=800, build_to=899):谷歌版本user_agent信息
# firefox():火狐版本user_agent信息
# internet_explorer():ie版本user_agent信息
# opera():随机生成 Opera 的浏览器 user_agent 信息
# safari():随机生成 Safari 的浏览器 user_agent 信息
# ios_platform_token():ios版本信息
# linux_platform_token():linux版本信息
# linux_processor():linux版本类型
# user_agent():随机user_agent信息
8.7.字符串类
# paragraph(nb_sentences=3, variable_nb_sentences=True, ext_word_list=None):随机生成段落
# paragraphs(nb=3, ext_word_list=None):随机生成多个段落
# sentence(nb_words=6, variable_nb_words=True, ext_word_list=None):随机生成一句话
# sentences(nb=3, ext_word_list=None)::随机生成多句话
# text(max_nb_chars=200, ext_word_list=None):随机生成一篇文章
# texts(nb_texts=3, max_nb_chars=200, ext_word_list=None)
# word(ext_word_list=None):随机生成词语
# words(nb=3, ext_word_list=None, unique=False):随机生成多个词语
# password(length=10, special_chars=True, digits=True, upper_case=True, lower_case=True):随机密码
# sha1(raw_output=False):随机sha1密码
8.8.日期时间类
# am_pm():上 / 下午
# century():世纪
# date(pattern='%Y-%m-%d', end_datetime=None):日期
# date_between(start_date='-30y', end_date='today'):日期范围
# date_between_dates(date_start=None, date_end=None):
# date_object(end_datetime=None):随机生成1970-1-1 到指定日期的随机日期
# date_of_birth(tzinfo=None, minimum_age=0, maximum_age=115):生日
# date_this_century(before_today=True, after_today=False):
# date_time(tzinfo=None, end_datetime=None):时间信息
# date_time_ad():生成公元 1 年到现在的随机时间
# date_time_between():用法同 dates
# future_date(end_date='+30d', tzinfo=None):未来的日期
# future_datetime():未来时间
# month():月份
# month_name():月份名称
# past_date(start_date='-30d', tzinfo=None):随机生成已经过去的日期
# past_datetime(start_date='-30d', tzinfo=None):随机生成已经过去的时间信息
# time(pattern='%H:%M:%S', end_datetime=None):时间信息
# time_delta(end_datetime=None):时间差
# time_object():随机 24 小时时间,time 对象
# time_series():随机 TimeSeries 对象
# timezone():随机时区
# unix_time():随机 Unix 时间
# year():年份
8.9.网络基础信息类
# 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 地址
8.10.文本、加密类
# 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
8.11.python 相关方法
# profile():随机生成档案信息
# simple_profile():随机生成简单档案信息
# pyiterable()
# pylist()
# pyset()
# pystruct()
# pytuple()
# pydict()
总结:
Faker通常用于单元测试、数据库填充数据、模拟API响应等场合,但应避免使用随机生成的数据来处理实际业务逻辑,因为这些数据是虚假的,不应用于实际场景。总之,Faker是一个非常有用的工具,可以为开发者和测试人员提供方便快捷的方式来生成各种伪数据。通过内置的数据生成器以及自定义扩展的功能,它可以满足多样的数据生成需求。