平時我們在開發程序的時候,總免不了需要造一些假數據來驗證自己的程序功能是否正常。那麼你是通過什麼方式來造假數據的呢,不會每次都是手寫「測試數據、test」吧。
今天派森醬給大家介紹兩個超級好用的庫,批量生成各種假數據,比如用戶信息,地址,日期,數字等等。
mimesismimesis 是一個高性能的偽數據生成器,目前支持 33 種不同的語言環境。通過該庫,我們可以生成各種測試數據、假的 API 接口、任意結構的 JSON 和 XML 數據以及隱藏生產環境的數據。
pip install mimesis安裝好之後我們就可以直接使用了。
from mimesis import Person
person = 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 Faker
faker = Faker(locale='zh_CN')
print(f'name: {faker.name()}')
print(f'address: {faker.address()}')
print(f'date: {faker.date()}')
## 輸出結果
name: 劉晶
address: 香港特別行政區平縣華龍深圳路l座 580988
date: 2013-08-26從上圖可以看出,faker 目前支持 22 個不同種類的假數據。
如果以上類別不能滿足需求,那麼 faker 同樣支持自定義擴展。
from faker.providers import BaseProvider
class 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)};
總結今天我們介紹了兩款優秀的假數據生成庫,對於大部分場景都是可以滿足的了,希望小夥伴們能有所收穫。