Bootstrap

python_faker使用

转载 JR_willbeBetter 最后发布于2019-04-22 10:33:50 阅读数 544 收藏

展开

作者:黑色芝麻
原文:https://segmentfault.com/a/1190000011325538

参考文章:

作者:hellangels33
原文:https://www.cnblogs.com/hellangels333/p/9039784.html

作者:人道沉浮
原文:https://www.cnblogs.com/progor/p/9188683.html

版权声明:本人摘录、转载以上文章仅用于参考、学习、记录,转载请附上原文链接!

以下全为复制粘贴:


  • 介绍

faker是python的一个第三方模块、一个Python包,是一个github上的开源项目。主要用来创建伪数据,使用Faker包,无需再手动生成或者手写随机数来生成数据,只需要调用Faker提供的方法,即可完成数据的生成。

  • 安装

pip install Faker

  • 要创建假数据,需要先有一个faker实例

1、通过工厂函数来创建

 
  1. from faker import Factory

  2. >>> fake1 = Factory.create() # 通过工厂函数来创建

  3. >>> fake1.name() # 调用方法-随机生成一个姓名

  4. 'Austin Parker'

2、直接通过构造函数来创建

 
  1. >>> from faker import Faker #主要使用的是Factory类,而导入Faker,会同时导入Factory

  2. >>> fake2 = Faker() # 通过构造函数来创建

  3. >>> fake2.address() # 调用方法-随机生成一个地址

  4. 'West Jamie, NV 91152-9807'

在faker中,name和address这种方法被称为提供器,提供器的类型很多,除了上面提到的name和address,还有:

     company()-随机公司名、postcode()-邮编、random_letter()-随机字母,等。

     常用方法可参考:

     1、https://www.cnblogs.com/hellangels333/p/9039784.html

     2、官方文档:https://faker.readthedocs.io/en/master/

  • 本地化:

      想要创建中文数据,可以使用下面的方法:

 
  1. >>> fake = Faker('zh_CN')

  2.  
  3. #或者

  4. >>> f=Faker(locale='zh_CN')

      Faker接受的本地化参数locale,创建的对象会生成对应语言的数据,如果没有找到对应的语言,会使用默认的"en_US"
可以在 https://faker.readthedocs.io/... 中查看所有支持的语言

  • 自定义提供器:

       有时候,你会想要创建自己的提供器,这时候只需要继承提供器的基类,并实现一些方法,随后调用add_provider将类加入到faker实例中即可。

       providers是一个包含了多种生成随机数据的生成器的“提供者”,比如他包含了生产随机姓名的生成器,包含了随机地址的生成器。如果我们想要自己定义随机生成的数据的规则,那么我们需要自定义providers。如何生成一个providers,可以参考https://faker.readthedocs.io/en/master/index.html#how-to-create-a-provider

 
  1. >>> from faker import Faker

  2. >>> fake = Faker()

  3.  
  4. # 引入基类

  5. >>> from faker.providers import BaseProvider

  6.  
  7. # 创建并继承,实现方法

  8. >>> class MyProvider(BaseProvider):

  9. >>> def foo(self):

  10. >>> return 'bar'

  11.  
  12. # 添加到实例中

  13. >>> fake.add_provider(MyProvider)

  14.  
  15. # 调用

  16. >>> fake.foo()

  17. 'bar'

  • 随机种子:

    当想要生成相同的数据时,需要调用faker的seed方法为其设置种子,这样之后使用提供器的时候,便会产生相同的内容。

 
  1. >>> from faker import Faker

  2. >>> fake = Faker()

  3. >>> fake.random.seed(4321)

  4. #fake.random.seed(4321) 可以写成 fake.seed(4321)

  5.  
  6. >>> fake.name()

  7. 'Ryan Gallagher'

  8. >>> fake.address()

  9. '7631 Johnson Village Suite 690\nAdamsbury, NC 50008'

  10.  
  11. #通过给定的seed可以控制每次生成的内容都是一样的

  12. >>> fake.random.seed(4321)

  13. >>> fake.name()

  14. 'Ryan Gallagher'

  15. >>> fake.address()

  16. '7631 Johnson Village Suite 690\nAdamsbury, NC 50008'

      *在设置随机种子后,如果调用同一个提供器两次,第二次调用会使faker实例的种子失效

 
  1. >>> fake.seed(1)

  2. >>> fake.name()

  3. 'Ryan Gallagher'

  4. >>> fake.address()

  5. '7631 Johnson Village Suite 690\nAdamsbury, NC 50008'

  6. >>> fake.name() #提供器name第二次被调用,使faker实例的种子失效

  7. 'Stanley Parks'

  8.  
  9. >>> fake.seed(1)

  10. >>> fake.name()

  11. 'Ryan Gallagher' #不是对应的值了

  12. >>> fake.name()

  13. 'Jon Cole' #不是对应的值了

  14. >>> fake.address()

  15. '70669 Heather Grove\nNew Sierra, WI 00080-6360' #不是对应的值了

  • 例子

                    (作者:人道沉浮   原文:https://www.cnblogs.com/progor/p/9188683.html

注意:这里为了例子简便,对于数据库操作就直接使用“命令式”的了,而不使用ORM模型式的了。

    实现过程:

  1. 利用pymysql连接数据库
  2. 创建表
  3. 利用fake格式化要插入的数据
  4. 利用pymysql执行插入语句

    代码:

 
  1. import pymysql

  2. from faker import Faker

  3.  
  4. conn=pymysql.connect(host="localhost",port=3306,user="root",password="123456",db="it",charset="utf8")

  5.  
  6. cursor=conn.cursor()

  7. #这里给出表结构,如果使用已存在的表,可以不创建表。

  8. sql="""

  9. create table user(

  10. id int PRIMARY KEY auto_increment,

  11. username VARCHAR(20),

  12. password VARCHAR(20),

  13. address VARCHAR(35)

  14. )

  15. """

  16. cursor.execute(sql)

  17. fake=Faker("zh-CN")

  18. for i in range(20):

  19. sql="""insert into user(username,password,address)

  20. values('%s','%s','%s')"""\

  21. %(fake.user_name(),fake.password(special_chars=False),fake.address())

  22. cursor.execute(sql)

  23.  
  24. conn.commit()

  25. cursor.close()

  26. conn.close()

    结果:

 

;