标签:脚本 数值范围 今天 数据 电话 style doc blank 用法
最近发现一个能够任意生成各种数据的python库:faker,可以借助它来生成各种数据,例如姓名、地名、日期、电话号码等(各种有意义、无意义的假数据)
git地址:https://github.com/joke2k/faker
文档:https://faker.readthedocs.io/en/stable/
本文将简单介绍一下我在实际工作中的一些应用
import faker fake = faker.Faker(locale=‘zh_CN‘) # 初始化,指定生成中文格式数据 phone = fake.phone_number() # 生成一条电话号码
每次执行时都会生成一个新的电话号码
如果想一次生成多条, 可以借助for循环
import faker fake = faker.Faker(locale=‘zh_CN‘) phones = [fake.phone_number() for _ in range(5)] # 列表推导,把生成的数据组成一个列表 print(phones) 结果: [‘14589888619‘, ‘13107540315‘, ‘15341290420‘, ‘13915229439‘, ‘13591304092‘]
import faker fake = faker.Faker(locale=‘zh_CN‘) for _ in range(5): # 借助for循环 phone = fake.phone_number() print(phone) 结果: 15219917682 14511308981 18819869885 18220361555 18591857341
通过 fake.name()
随机生成一个人名
效果如下
>>> from faker import Faker >>> fake = Faker() >>> fake = Faker(locale=‘zh_CN‘) >>> fake.name() ‘陈飞‘ >>> fake.name() ‘陈杨‘
嗯...还挺像回事的
如果在平时测试过程中比如遇到补全个人信息之类的功能,可以用这个来随机生成一个名字,省的自己去想了
并且在写一些造数脚本时,也可以给那种名称参数传入这种随机值,省时省力,还不重样
测试过程中,有些测试数据可能会涉及到输入身份证号,利用 fake.ssn() 即可生成一个随机的身份证ID
import faker fake = faker.Faker(locale=‘zh_CN‘) identity_id = fake.ssn() print(identity_id) 结果: 511623199003268061 identity_ids = [fake.ssn() for i in range(5)] # 生成多个 print(identity_ids) 结果: [‘140108198905080513‘, ‘532325199712279418‘, ‘370601193711292094‘, ‘610526199905267515‘, ‘652101194803155106‘]
faker也提供了一些方法来生成随机数
1、fake.numerify(),生成3位随机数字 >>> fake.numerify() ‘531‘ 2、random_digit(),生成0~9之间的随机数 >>> fake.random_digit() 6
3、random_digit_not_null(),生成1~9之间的随机数 >>> fake.random_digit_not_null() 5
4、random_int(),默认0~9999,可以通过设置min, max来设置数值范围 >>> fake.random_int() 8388 >>> fake.random_int(100, 200) 113
同样faker也可以生成随机日期、时间等,下面列举几个常用的
(1)fake.date(),生成一个随机日期字符串
import faker fake = faker.Faker(locale=‘zh_CN‘) random_date1 = fake.date(pattern=‘%Y-%m-%d‘, end_datetime=None) # 生成一个随机日期(格式为日期字符串),end_datetime参数限制最大日期 print(random_date1) print(type(random_date1)) 结果: 2004-10-19 <class ‘str‘>
可以看到,生成是日期字符串
end_datetime 参数可以限制日期的最大范围,它可以接收date对象,如下
import faker fake = faker.Faker(locale=‘zh_CN‘) from datetime import date random_date2 = fake.date(pattern=‘%Y-%m-%d‘, end_datetime=date(1980, 12, 20)) # end_datetime设置为1980年12月20日 print(random_date2) 结果: 1974-04-03
(2)fake.date_between()生成一个指定范围的日期
通过查看源码可以发现,默认生成的是30年前至今天的一个随机日期
源码如下:
date_start和date_end传入不同参数值对应的结果
1、 random_date1 = fake.date_between(start_date=date(1970, 12, 20), end_date=date(1970, 12, 25)) # 取1970年12月20至1970年12月25之间的1天 print(random_date1) 结果: 1970-12-20 2、 random_date2 = fake.date_between(start_date=‘-30y‘, end_date=‘today‘) # -1y, 表示相对于end_date,往前推1年 # -1M, 表示相对于end_date,往前推1个月 # -5d, 表示相对于end_date,往前推5天 # today, 表示今天
结果:
2017-11-27
print(type(random_date2))
结果:
<class ‘datetime.date‘>
random_date3 = fake.date_between(start_date=‘today‘, end_date=‘+5d‘) # +5d, 表示相对于start_date,往后推5d
(3) fake.date_this_month(),生成本月中的一天
它有2个参数,before_today和after_today,默认情况下 before_today=True, after_today=False
意思是获取当月今天之前的日期
可以通过修改两个参数的布尔值,获取本月今天之前或者今天之后的日期
random_date = fake.date_this_month() print(random_date) print(type(random_date)) 结果: 2021-06-03 <class ‘datetime.date‘> fake.date_this_month(before_today=True, after_today=False)
简单试了一下,发现
before_today=True, after_today=False时,可以得到今天之前的日期(不包含今天)
before_today=True, after_today=True时,可以得到本月的任意一天(包含今天)
before_today=False, after_today=True时,可以得到今天之后的日期(包含今天)
before_today=False, after_today=False时,获取今天的日期
(4)fake.date_this_year()获取今年的某一天
用法参考fake.date_this_month(),也是包含
before_today和after_today2个参数
如果生成一批数据中有重复的该怎么办?
可以借助set()去重
phones = [fake.phone_number() for _ in range(5)] phones_new = list(set(phones)) # 先使用set去重,再通过list方法转为列表(是否再转换为列表,看个人需要)
还有很多用法,可以参考:
https://www.jianshu.com/p/6bd6869631d9
https://zhuanlan.zhihu.com/p/87203290
或者查看源码,一般各种方法的源码路径在"faker/providers"下
标签:脚本 数值范围 今天 数据 电话 style doc blank 用法
原文地址:https://www.cnblogs.com/hanmk/p/14850416.html