最近發現一個能夠任意生成各種數據的python庫:faker,可以借助它來生成各種數據,例如姓名、地名、日期、電話號碼等(各種有意義、無意義的假數據)
git地址:https://github.com/joke2k/faker
文檔:https://faker.readthedocs.io/en/stable/
本文將簡單介紹一下我在實際工作中的一些應用
1、生成手機號碼
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
2、生成人名
通過 fake.name()
隨機生成一個人名
效果如下
>>> from faker import Faker >>> fake = Faker() >>> fake = Faker(locale='zh_CN') >>> fake.name() '陳飛' >>> fake.name() '陳楊'
嗯...還挺像回事的
如果在平時測試過程中比如遇到補全個人信息之類的功能,可以用這個來隨機生成一個名字,省的自己去想了
並且在寫一些造數腳本時,也可以給那種名稱參數傳入這種隨機值,省時省力,還不重樣
3、生成身份證號
測試過程中,有些測試數據可能會涉及到輸入身份證號,利用 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']
4、生成數字
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
5、生成日期
同樣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"下