平時我們在開發程式的時候,總免不了需要造一些假資料來驗證自己的程式功能是否正常。那麼你是透過什麼方式來造假資料的呢,不會每次都是手寫「測試資料、test」吧。
今天派森醬給大家介紹兩個超級好用的庫,批次生成各種假資料,比如使用者資訊,地址,日期,數字等等。
mimesismimesis 是一個高效能的偽資料生成器,目前支援 33 種不同的語言環境。透過該庫,我們可以生成各種測試資料、假的 API 介面、任意結構的 JSON 和 XML 資料以及隱藏生產環境的資料。
pip install mimesis
安裝好之後我們就可以直接使用了。
from mimesis import Personperson = Person('zh')print(f'name: {person.surname() + "" + person.name()}')print(f'sex: {person.sex()}')print(f'academic degree: {person.academic_degree()}')## 輸出結果name: 田曜巖sex: 男性academic degree: 研究生
在上面的程式中,我們建立了一個使用中文環境的 Person 物件,接著輸出該使用者的姓名,性別以及學歷。
下面我們看看 Person 物件裡面都有啥假資料。
print('\n'.join(('%s:%s' % item for item in person._data.items())))
結果如下所示:
除了姓名,性別這些基本資訊之外還有學歷、性取向、大學以及信仰等資訊。
另外,除了 Person 之外,mimesis 庫還提供了 Address、Food、Datetime 等方面的資料。
address = Address("zh")print(f'continent: {address.continent()}')print(f'province: {address.province()}')print(f'city: {address.city()}')print(f'street name: {address.street_name()}')## 輸出結果province: 安徽省city: 湛江市
除了省份,城市之外還有大陸、國家、州、街區等資訊。
food = Food("zh")print(f'dish: {food.dish()}')print(f'drink: {food.drink()}')## 輸出結果dish: 東坡肉drink: 紅茶
除了魚類和飲料之外還有水果、香料和蔬菜。
其實 mimesis 庫的強大不止於此,甚至我們可以使用該庫來返回特定格式的資料。這就要藉助 mimesis.schema 來實現了。
比如,我們要返回如下格式的 JSON 資料,那麼就可以這麼寫:
_ = Field('zh')schema = Schema(schema=lambda: { 'id': _('uuid'), 'name': _('person.name'), 'version': _('version', pre_release=True), 'timestamp': _('timestamp', posix=False), 'owner': { 'email': _('person.email', domains=['test.com'], key=str.lower), 'token': _('token_hex'), 'creator': _('full_name', gender=Gender.FEMALE) }, 'address': { 'country': _('address.country'), 'province': _('address.province'), 'city': _('address.city') }})# 生成資料data = schema.create(iterations=2)
我們藉助 Flask 快速實現一個介面:
@app.route('/apps', methods=('GET',))def apps_view(): count = request.args.get('count', default=1, type=int) data = schema.create(iterations=count) return jsonify(data)
呼叫該介面獲得如下資料:
fakerfaker 同樣是一個優秀的生成假資料的 Python 庫,支援多種語言環境,我們可以使用 pip 進行安裝。
pip install faker
試著獲取一下姓名,地址,日期等假資料
from faker import Fakerfaker = Faker(locale='zh_CN')print(f'name: {faker.name()}')print(f'address: {faker.address()}')print(f'date: {faker.date()}')## 輸出結果name: 劉晶address: 香港特別行政區平縣華龍深圳路l座 580988date: 2013-08-26
從上圖可以看出,faker 目前支援 22 個不同種類的假資料。
如果以上類別不能滿足需求,那麼 faker 同樣支援自定義擴充套件。
from faker.providers import BaseProviderclass MyProvider(BaseProvider): def foo(self): return 'bar'faker.add_provider(MyProvider)print(f'foo: {faker.foo()}')## 輸出結果foo: bar
最方便的是我們可以直接在命令列呼叫 faker,這對於某些場景簡直不要太方便,比如我們就需要一條使用者資訊的 JSON 資料,那麼就不需要再去寫一個 Python 指令碼了,直接在命令列呼叫 faker 命令即可生成假資料。
$ faker address香港特別行政區六安市海港哈爾濱街z座 561730$ faker -r=3 address湖南省海口市清浦王街h座 140394海南省銀川市孝南武漢街q座 623233青海省建華市蕭山李街w座 207439$ faker -r=3 profile name,address,birthdate{'name': '邵麗', 'address': '四川省想市上街吳街c座 399962', 'birthdate': datetime.date(1979, 8, 28)};{'name': '張秀華', 'address': '江西省亮市徐匯程街p座 527720', 'birthdate': datetime.date(1907, 6, 27)};{'name': '王瑩', 'address': '江西省博市房山太原路N座 615506', 'birthdate': datetime.date(1968, 2, 7)};
總結今天我們介紹了兩款優秀的假資料生成庫,對於大部分場景都是可以滿足的了,希望小夥伴們能有所收穫。