开发系统时,经常需要一些伪数据用于测试。举个例子,设计一个学生管理系统,测试注册功能,总需要一些用户信息吧。我猜大部分人都会填:用户aaaa
,密码1111
,手机号码1111
……感觉略无追求~
那么有没有办法造一个看上是真的数据呢?肯定是有的——人是活的嘛~
自己造很累,有没有不需要大脑的方法的?还真有,这就是本文要介绍的一个Python
模块——Faker。
安装
其实,这节可以不必说,Python
装包无非就pip
嘛:
pip install Faker
快速入手
生成数据前需要先初始化一个生成器,有两种方式可以完成:①用faker.Factory.create()
;②用faker.Faker()
。
from faker import Factory
fake = Factory.create()
# OR
from faker import Faker
fake = Faker()
fake.name()
# 'Lucy Cechtelar'
fake.address()
# "426 Jordy Lodge# Cartwrightshire, SC 88120-6700"
fake.text()
# Sint velit eveniet. Rerum atque repellat voluptatem quia rerum. Numquam excepturi# beatae sint laudantium consequatur. Magni occaecati itaque sint et sit tempore. Nesciunt# amet quidem. Iusto deleniti cum autem ad quia aperiam.# A consectetur quos aliquam. In iste aliquid et aut similique suscipit. Consequatur qui# quaerat iste minus hic expedita. Consequuntur error magni et laboriosam. Aut aspernatur# voluptatem sit aliquam. Dolores voluptatum est.# Aut molestias et maxime. Fugit autem facilis quos vero. Eius quibusdam possimus est.# Ea quaerat et quisquam. Deleniti sunt quam. Adipisci consequatur id in occaecati.# Et sint et. Ut ducimus quod nemo ab voluptatum.
看看自动化的威力!批量生成,每次都是随机的哦!
for _ in range(0, 10):
print fake.name()
# Adaline Reichel
# Dr. Santa Prosacco DVM
# Noemy Vandervort V
# Lexi O'Conner
# Gracie Weber
# Roscoe Johns
# Emmett Lebsack
# Keegan Thiel
# Wellington Koelpin II
# Ms. Karley Kiehn V
本地化
你可能会说,这个玩意儿太洋气了——生成一堆英文名字地址啥的有毛用?确实,在计算机领域,英文有天生优势。
但是,重点来了——Faker
还支持本地化,真是天地良心!一起来看看怎么生成中文信息吧:
from faker import Factory
fake = Factory.create('zh_CN')
for _ in range(0, 10):
print fake.name()
# 於涛
# 万静
# 孙秀荣
# 丘辉
# 方玉
# 虞建国
# 丘丽丽
# 郭杨
# 江欣
# 狐龙
for _ in range(0, 10):
print fake.address()
# 杰市戚路d座 855521
# 丽华市魏街e座 800775
# 坤市莘路P座 376919
# 秀云市温街s座 518607
# 晨市季街Z座 931186
# 丽市夹路N座 670627
# 坤市漆街k座 968075
# 瑞市於街z座 168689
# 金凤市雍路E座 148292
# 晨市黎路R座 916369
高级用法
功能扩展
Faker
已经提供了足够丰富的信息生成,包括名字、手机号、邮箱地址、邮编等等。尽管如此,可能还是没有办法满足你的需求。这时,你可以自己动手,丰衣足食。下面,我们通过一个例子看看怎么扩展Faker
的功能吧:
from faker import Faker
fake = Faker()
# first, import a similar Provider or use the default one
from faker.providers import BaseProvider
# create new provider class
class MyProvider(BaseProvider):
def foo(self):
return 'bar'
# then add new provider to faker instance
fake.add_provider(MyProvider)
# now you can use:
fake.foo()
> 'bar'
随机控制
Faker
随机生成由random.Random
驱动。其中,.random
属性返回random.Random
对象。通过对该对象的操作,可以实现自定义的行为。
from faker import Faker
fake = Faker()
fake.random
fake.random.getstate()
那么,可以实现什么自定义呢?举个例子,我们可以设置seed
。seed
在随机数生成逻辑中什么作用,估计大家都清楚。比如,通过给定seed
可以控制每次生成的内容都是一样的:
from faker import Faker
fake = Faker()
faker.random.seed(4321)
print fake.name()
# Margaret Boehm
还有等价写法哦:
from faker import Faker
fake = Faker()
fake.seed(4321)
print fake.name()
# Margaret Boehm
注意到,不同的两次运行,只要seed
一样,生成出来的信息就是一样的。
命令行生成
有时想在shell
或者其他程序中生成一些伪数据,是不是一定要写一个Python
脚本呢?别急——Faker
提供了一个命令行工具,估计可以应对大部分场景了:
$ faker address
968 Bahringer Garden Apt. 722Kristinaland, NJ 09890
$ faker -l de_DE address
Samira-Niemeier-Allee 5694812 Biedenkopf
$ faker profile ssn,birthdate
{'ssn': u'628-10-1085', 'birthdate': '2008-03-29'}
$ faker -r=3 -s=";" name
Willam Kertzmann;
Josiah Maggio;
Gayla Schmitt;
$ faker -h
usage: faker [-h] [--version] [-o output] [-l LOCALE] [-r REPEAT] [-s SEP]
[-i [INCLUDE [INCLUDE ...]]]
[fake] [fake argument [fake argument ...]]
...