utils/data_utils/fake_data.py

299 lines
9.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
# @Time : 2023/12/5 13:51
# @Author : floraachy
# @File : faker_handle
# @Software: PyCharm
# @Desc:
# 标准库导入
import random
import string
import re
from datetime import datetime, date, timedelta
# 第三方库导入
from faker import Faker
# 本地应用/模块导入
class FakerData:
"""
测试数据生成类
官方文档https://faker.readthedocs.io/en/master/index.html
"""
def __init__(self):
self.fk_zh = Faker(locale='zh_CN')
self.faker = Faker()
@classmethod
def generate_random_int(cls, *args) -> int:
"""
:return: 随机数
"""
# 检查是否传入了参数
if not args:
# 没有传参就从5000内随机取一个整数返回
return random.randint(0, 5000)
# 排序参数并获取最小值和最大值
min_val = min(args)
max_val = max(args)
# 生成并返回随机整数
return random.randint(min_val, max_val)
def generate_catch_phrase(self):
"""
:return: 生成妙句(口号) (输出结果都是英文)
"""
return self.faker.catch_phrase()
def generate_phone(self, lan="en") -> int:
"""
:return: 随机生成手机号码
"""
if lan == "zh":
phone = self.fk_zh.phone_number()
else:
phone = self.faker.phone_number()
return phone
def generate_id_number(self, lan="en") -> int:
"""
:return: 随机生成身份证号码
"""
if lan == "zh":
id_number = self.fk_zh.ssn()
else:
id_number = self.faker.ssn()
return id_number
def generate_female_name(self, lan="en") -> str:
"""
:return: 女生姓名
"""
if lan == "zh":
female_name = self.fk_zh.name_female()
else:
female_name = self.faker.name_female()
return female_name
def generate_male_name(self, lan="en") -> str:
"""
:return: 男生姓名
"""
if lan == "zh":
male_name = self.fk_zh.name_male()
else:
male_name = self.faker.name_male()
return male_name
def generate_name(self, lan="en") -> str:
"""
生成人名
:return: 人名
"""
if lan == "zh":
name = self.fk_zh.name()
else:
name = self.faker.name()
return name
def generate_company_name(self, lan: str = "en", fix: str = None) -> str:
"""
生成公司名
:param lan: 语言类型可选en, zh zh表示中文en表示英文默认是en
:param fix: 前后缀可选pre suf pre表示公司前缀suf标识公司后缀
:return: 公司名
"""
if lan == "zh":
if fix == "pre":
name = self.fk_zh.company_prefix()
elif fix == "suf":
name = self.fk_zh.company_suffix()
else:
name = self.fk_zh.company()
else:
if fix == "pre":
name = self.faker.company_prefix()
elif fix == "suf":
name = self.faker.company_suffix()
else:
name = self.faker.company()
return name
def generate_paragraph(self, lan: str = "en", nb: int = 3) -> str:
"""
生成段落
:param lan: 语言类型可选en, zh zh表示中文en表示英文默认是en
:param nb: 段落个数默认是3个
"""
if lan == "zh":
text = self.fk_zh.paragraph(nb_sentences=nb, variable_nb_sentences=True, ext_word_list=None)
else:
text = self.faker.paragraph(nb_sentences=nb, variable_nb_sentences=True, ext_word_list=None)
return text
def generate_words(self, lan: str = "en", nb: int = 1) -> str:
"""
生成词语
:param lan: 语言类型可选en, zh zh表示中文en表示英文默认是en
:param nb: 词语个数默认是1个
"""
if lan == "zh":
if nb == 1 or nb < 1:
text = self.fk_zh.word(ext_word_list=None)
else:
res = self.fk_zh.words(nb=nb, ext_word_list=None)
text = "-".join(res)
else:
if nb == 1 or nb < 1:
text = self.faker.word(ext_word_list=None)
else:
res = self.faker.words(nb=nb, ext_word_list=None)
text = "-".join(res)
return text
def generate_email(self, lan="en") -> str:
"""
:return: 生成邮箱
"""
if lan == "zh":
email = self.fk_zh.email()
else:
email = self.faker.email()
return email
def generate_identifier(self, lan="en", char_len=8):
"""
:return:生成随机标识满足要求长度为2~100这里长度通过传参控制默认为8 只能包含数字,字母,下划线(_),中划线(-),英文句号(.),必须以数字和字母开头,不能以下划线/中划线/英文句号开头和结尾
"""
if lan == "zh":
fk = self.fk_zh
else:
fk = self.faker
while True:
identifier = ''.join(random.choices(string.ascii_letters + string.digits + '_.-', k=char_len)) # 生成指定长度的随机标识
if (
re.match(r'^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,98}[a-zA-Z0-9]$', identifier) and
not (identifier.startswith('_') or identifier.startswith('-') or identifier.startswith('.')) and
not (identifier.endswith('_') or identifier.startswith('-') or identifier.endswith('.'))
):
return identifier
def generate_city(self, lan="en", full: bool = True) -> str:
"""
:return: 随机生成城市名
"""
if lan == "zh":
faker = self.fk_zh
else:
faker = self.faker
if full:
city = faker.city()
else:
city = faker.city_name()
return city
def generate_province(self, lan="en") -> str:
"""
:return: 随机生成城市名
"""
if lan == "zh":
faker = self.fk_zh
else:
faker = self.faker
return faker.province()
def generate_address(self, lan="en") -> str:
"""
:return: 生成地址
"""
if lan == "zh":
address = self.fk_zh.address()
else:
address = self.faker.address()
return address
@classmethod
def generate_time(cls, fmt='%Y-%m-%d %H:%M:%S', days=0) -> str:
"""
根据传入的天数,返回当前时间加上或减去这些天数后的日期和时间,或者仅返回当前时间。
:return:
"""
# 获取当前时间
current_time = datetime.now()
# 计算增加或减少天数后的时间
if days != 0:
future_time = current_time + timedelta(days=days)
else:
future_time = current_time
# 格式化时间
return future_time.strftime(fmt)
@classmethod
def generate_today_date(cls, fmt='%Y-%m-%d'):
"""获取今日0点整时间"""
today = datetime.now().date()
if fmt == '%Y-%m-%d %H:%M:%S':
return today.strftime(fmt) + " 00:00:00"
return today.strftime(fmt)
@classmethod
def generate_time_after_week(cls, fmt='%Y-%m-%d'):
"""获取一周后12点整的时间"""
if fmt == '%Y-%m-%d %H:%M:%S':
return (date.today() + timedelta(days=+6)).strftime(fmt) + " 00:00:00"
return (date.today() + timedelta(days=+6)).strftime(fmt)
@classmethod
def remove_special_characters(cls, target: str):
"""
移除字符串中的特殊字符。
在Python中用replace()函数操作指定字符
常用字符unicode的编码范围
数字:\u0030-\u0039
汉字:\u4e00-\u9fa5
大写字母:\u0041-\u005a
小写字母:\u0061-\u007a
英文字母:\u0041-\u007a
"""
pattern = r'([^\u4e00-\u9fa5])'
result = re.sub(pattern, '', target)
return result
def generate_iso_8601_time(cls, days=0) -> str:
"""
根据传入的天数返回当前时间加上或减去这些天数后的日期和时间格式为ISO 8601。
:param days: 增加或减少的天数
:return: ISO 8601格式的时间字符串
"""
# 获取当前UTC时间
current_time = datetime.now()
# 计算增加或减少天数后的时间
future_time = current_time + timedelta(days=days)
# 格式化时间为ISO 8601格式
iso_format_time = future_time.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
return iso_format_time
if __name__ == '__main__':
faker = FakerData()
res = faker.generate_iso_8601_time()
print(res)