Python | 如何通過faker批量生成“逼真”的測試資料
我們在專案中,常常需要使用一些假資料來做測試,比如客戶名、電話號碼、街道地址等等,平時我們基本是鍵盤一頓亂敲,或者隨便造個什麼字元串出來。
現在你不用這樣做了,用Faker就能滿足你的一切需求。
本文將結合例項,講述Python 如何通過faker第三方庫,批量偽造資料。包含兩種儲存方式:1,存入Excel;2,存入mysql資料庫。
本文框架結構為:
1、faker簡介
2、faker使用
3、常用方法一覽
4、例項:批量生成測試資料
1、faker簡介
faker是python的一個第三方庫,是一個github上的開源專案。
主要用於測試時偽造資料。
官方文件:https://faker.readthedocs.io/en/master/index.html
2、 faker如何使用
1)安裝
Faker庫已經被提交到 pip,可以通過 pip 工具直接安裝。
1 pip install Faker
2)匯入模組
1 from faker import Faker
*主要使用的是Factory類,而匯入Faker,會同時匯入Factory
3)使用步驟:
·初始化:
1 fake = Faker()
Faker()呼叫的是Factory的create方法,常用引數選項:
引數 locale:
為生成資料的文化選項(語種),預設為 en_US,只有使用了相關文化,才能生成相對應的隨機資訊,zh-CN代表使用中國版。
更多國家版本,可以參考:
https://faker.readthedocs.io/en/master/index.html#localization
引數providers:
是一個包含了多種生成隨機資料的生成器的“提供者”,比如包含了生成隨機姓名的生成器,包含了隨機地址的生成器。如果我們想要自己定義隨機生成的資料的規則,那麼我們需要自定義providers。
如何生成一個providers,可以參考:
https://faker.readthedocs.io/en/master/index.html#how-to-create-a-provider
·呼叫方法:
利用Faker物件呼叫方法,呼叫方法的返回值就是隨機的資料。
接下來,我們使用最簡單的例子來生成幾個假資料試試:
1 from faker import Faker 2 3 fake = Faker(locale='zh_CN') 4 5 print('姓名:', fake.name()) 6 print('地址:', fake.address()) 7 print('電話號碼:', fake.phone_number())
解析:
# 1、從faker模組匯入Faker這個類。
# 2、例項化,儲存到變數fake中。
# 3、呼叫name()方法隨機生成一個名字。
# 4、呼叫address()方法隨機生成地址資訊。
# 5、呼叫phone_number()方法隨機生成電話號碼。
執行結果如下:
姓名: 楊佳
地址: 陝西省西安市涪城沈路l座 317980
電話號碼: 15025821562
3、 常用方法一覽
由於主要使用中文資料,所以本文提供常見的方法示例是中文的。
詳見官方文件:https://faker.readthedocs.io/en/master/locales/zh_CN.html
地址資訊類:
fake.address():完整地址,比如北京市東城區東華門街道p座 100006
fake.street_address():街道+地址,比如興城路A座
fake.street_name():街道名,比如宜都街
fake.city_name():城市名,比如蘭州
fake.city():城市,比如蘭州市
fake.province():省份名,比如陝西省
fake.postcode():郵編
fake.country():國家
公司資訊類:
fake.company():公司名,比如惠派國際公司資訊有限公司
fake.company_suffix():公司名字尾(公司性質),比如網路有限公司
fake.company_prefix():公司名字首,比如鑫博騰飛
日期類:
fake.date(pattern=”%Y-%m-%d”, end_datetime=None) :隨機日期
fake.year():隨機年份
fake.day_of_week():隨機星期數
fake.time(pattern=”%H:%M:%S”, end_datetime=None):隨機時間
網路類:
fake.company_email():企業郵箱
fake.email():郵箱
個人資訊類:
fake.name():姓名
fake.last_name(): 姓
fake.first_name(): 名
fake.name_male(): 男性姓名
fake.last_name_male(): 男性姓
fake.first_name_male(): 男性名
fake.name_female(): 女性姓名
fake.user_name(*args, **kwargs):使用者名稱,只是隨機的英文姓名組合,一般是6位
fake.password():密碼
fake.simple_profile(sex=None):簡略個人資訊,包括使用者名稱,姓名,性別,地址,郵箱,出生日期。
fake.profile(fields=None, sex=None):詳略個人資訊,比簡略個人資訊多出公司名、血型、工作、位置、域名等等資訊。
工作職位類:
fake.job():工作
電話號碼類:
fake.phone_number ():手機號碼
fake.phonenumber_prefix():運營商號段,手機號碼前三位
社會安全碼(身份證)類:
fake.ssn():身份證號(18位)
銀行卡類
fake.credit_card_number(card_type=None) :卡號
fake.credit_card_provider(card_type=None) :卡的提供者
fake.credit_card_security_code(card_type=None) :卡的安全密碼
fake.credit_card_expire():卡的有效期
fake.credit_card_full(card_type=None) :完整卡資訊
4、例項:批量生成測試資料
1)資料儲存到Excel:
實現步驟:
(1)通過openpyxl開啟Excel
(2)獲取Excel的所有sheet頁
(3)通過fake生成資料,寫入單元格
(4)儲存Excel
程式碼:
1 from faker import Faker 2 from openpyxl import load_workbook 3 4 # 1、從faker模組匯入Faker這個類。 5 # 2、例項化,儲存到變數fake中。 6 # 3、呼叫name()方法隨機生成一個名字。 7 # 4、呼叫address()方法隨機生成地址資訊。 8 9 10 fake = Faker(locale='zh_CN') 11 12 wb = load_workbook("1.xlsx") 13 14 for sheetName in wb.sheetnames: 15 sheet = wb[sheetName] 16 for rownum in range(2, 100): 17 sheet.cell(row=rownum, column=1).value = fake.name() 18 sheet.cell(row=rownum, column=2).value = fake.address() 19 sheet.cell(row=rownum, column=3).value = fake.phone_number() 20 sheet.cell(row=rownum, column=4).value = fake.ssn(min_age=18, max_age=18) 21 22 wb.save("1.xlsx")
執行結果如下:
2)資料儲存到mysql資料庫:
實現步驟:
(1)通過pymysql連線資料庫
(2)建立資料表
(3)通過fake生成資料,並形成sql語句
(4)通過pymysql執行插入語句
程式碼:
1 from faker import Faker 2 3 import pymysql 4 5 6 7 conn = pymysql.connect(host="xx.xxx.xxx.xx", port=3306, user="xxx", password="xxx", db="xx", charset="utf8") 8 9 10 11 cursor = conn.cursor() 12 13 # 這裡給出表結構,如果使用已存在的表,可以不建立表。 14 15 sql = """ 16 17 create table user( 18 19 id int PRIMARY KEY auto_increment, 20 21 username VARCHAR(20), 22 23 password VARCHAR(20), 24 25 address VARCHAR(35), 26 27 tel VARCHAR(20), 28 29 ssn VARCHAR(20) 30 31 ) 32 33 """ 34 35 cursor.execute(sql) 36 37 38 39 fake = Faker("zh-CN") 40 41 for i in range(20): 42 43 sql = """insert into user(username,password,address,tel,ssn) 44 45 values('%s','%s','%s','%s','%s')""" \ 46 47 % (fake.user_name(), fake.password(special_chars=False), fake.address(), fake.phone_number(), fake.ssn(min_age=18, max_age=88, gender="M")) 48 49 cursor.execute(sql) 50 51 52 53 conn.commit() 54 55 cursor.close() 56 57 conn.close()
執行結果如下:
PS:不知道細心的你,有沒有發現地址看起來怪怪的啊。
是的,雖然資料看起來還挺逼真的,但是這並不是真實的地址,而是將省、市、街道之類的隨機組合在一起的。
原因在於,address的原始碼中,並沒有維護它們的對應關係,而且有些市或區縣是隨便寫的。有興趣的,可以看下原始碼,路徑參照:
D:\Python\Python37\Lib\site-packages\faker\providers\address\zh_CN