节省一半键入量,实测Python代码补全插件aiXcoder

代码补全在开发过程中是非常必要的能力,我们最常用的是 IDE 自带的代码补全功能,但问题在于,IDE 并不能理解我们的代码,推荐总是不那么准确。

今天笔者介绍一个国产代码补全神器 aiXcoder,它现在的离线版已经支持 Java 和 Python 了。对比 PyCharm 原生代码补全体验,它的效果实在是太好了。

节省一半键入量,实测Python代码补全插件aiXcoder

图注:aiXcoder 代码补全实测,整行代码预测用起来特别炫酷,整体上比 IDE 的预测准很多

PyCharm IDE 对比 aiXcoder

如果装上 aiXcoder,PyCharm 上的补全效果提升还是挺明显的,但是为了更直观地展示出来,我们可以统计编写同一段代码,敲键数到底有什么不同。

就下面这一段代码,笔者用 PyCharm IDE 的原生推荐,一共敲击了 96 个字符,其中字符串还没计算在内。

节省一半键入量,实测Python代码补全插件aiXcoder

如果安装上了 aiXcoder,效果就像文章前面的动图,总共只需要敲击 36个字符(字符串不计入),效果提升特别明显。

至于为什么能节省这么多功夫,看看aiXcoder下面两个预测就知道了。

一次性将变量名、API、参数传入都帮我们写好了,直接预测整行代码:

节省一半键入量,实测Python代码补全插件aiXcoder

整个列表推导式的内部逻辑,一次性都预测好了,只要填上参数:

节省一半键入量,实测Python代码补全插件aiXcoder

本地补全引擎:确保代码安全

之前笔者也用过代码补全插件,但是它们大部分都要上传代码到服务器,这就比较劝退了。不过 aiXcoder最新发布的 2.5 本地版,完全在本地计算机上运行,不会上传任何代码。

为了验证是不是全部计算都在本地完成,我特意关闭了网络连接,看看它对同一段代码的预测是不是正常,结果是,关不关网络连接,预测都是一样的。

另外,在笔记本上用,我还是比较在意性能的,在测试插件的时候,特别关注了它消耗的计算资源。打开进程管理器,一边写一边观察 CPU 占比。基本键入代码的过程中 CPU 占比在10%吧,停止键入很快就降到0了。

 

节省一半键入量,实测Python代码补全插件aiXcoder

虽然代码预测都放到本地了,但是 aiXcoder提供了下面这种滚动条,来平衡「补全能力」和「计算性能」之间的关系。试了一下,越靠近「Faster」,表示会尽快返回预测结果;越靠近「Longer」,表示插件将反馈更好的预测结果。

节省一半键入量,实测Python代码补全插件aiXcoder

插件市场,安装便捷

aiXcoder 2.5 目前支持 Java 和 Python,它们都可以在 JetBrains 市场上直接下载与安装。即在 IntelliJ IDEA 的市场上,可直接下载 aiXcoder用于 Java 代码补全。同理在 PyCharm 市场上,也可以直接下载 aiXcoder用于 Python 代码补全。

在 PyCharm 上,下面三步即可完成安装:

节省一半键入量,实测Python代码补全插件aiXcoder

与之前一样,Python 插件安装后,它会自动下载服务端,只需要等十几秒,就能快速用上。反正笔者已经愉快地用上了,小伙伴们也来试试呀。

 

最后,更多语言与 IDE 支持可查阅下载页面:

https://www.aixcoder.com/#/Download

转自:https://mp.weixin.qq.com/s/MNK0I6xKJ837S6w2CrZ0gA

Python 实用技:将 Office 文件转为 PDF

文 | 潮汐

来源:Python 技术「ID: pythonall」

Python 实用技:将 Office 文件转为 PDF

在平时的工作中,难免需要一些 小Tip 来解决工作中遇到的问题,今天的文章给大家安利一个方便快捷的小技巧,将 Office(doc/docx/ppt/pptx/xls/xlsx)文件批量或者单一文件转换为 PDF 文件。不过在做具体操作之前需要在 PC 安装好 Office,再利用 Python 的 win32com 包来实现 Office 文件的转换操作。

安装 win32com

在实战之前,需要安装 Python 的 win32com,详细安装步骤如下:

使用 pip 命令安装


pip install pywin32

如果我们遇到安装错误,可以通过python -m pip install –upgrade pip更新云端的方式再进行安装即可:


python -m pip install --upgrade pip 

下载离线安装包安装

如果 pip 命令未安装成功的话还可以下载离线包安装,方法步骤如下:首先在官网选择对应的 Python 版本下载离线包:https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/ 下载好后傻瓜式安装好即可。

文件转换逻辑

详细代码如下:

class PDFConverter:
    def __init__(self, pathname, export='.'):
        self._handle_postfix = ['doc''docx''ppt''pptx''xls''xlsx'# 支持转换的文件类型
        self._filename_list = list()  #列出文件
        self._export_folder = os.path.join(os.path.abspath('.'), 'file_server/pdfconver')
        if not os.path.exists(self._export_folder):
            os.mkdir(self._export_folder)
        self._enumerate_filename(pathname)

    def _enumerate_filename(self, pathname):
        '''
        读取所有文件名
        '''

        full_pathname = os.path.abspath(pathname)
        if os.path.isfile(full_pathname):
            if self._is_legal_postfix(full_pathname):
                self._filename_list.append(full_pathname)
            else:
                raise TypeError('文件 {} 后缀名不合法!仅支持如下文件类型:{}。'.format(pathname, '、'.join(self._handle_postfix)))
        elif os.path.isdir(full_pathname):
            for relpath, _, files in os.walk(full_pathname):
                for name in files:
                    filename = os.path.join(full_pathname, relpath, name)
                    if self._is_legal_postfix(filename):
                        self._filename_list.append(os.path.join(filename))
        else:
            raise TypeError('文件/文件夹 {} 不存在或不合法!'.format(pathname))

    def _is_legal_postfix(self, filename):
        return filename.split('.')[-1].lower() in self._handle_postfix and not os.path.basename(filename).startswith(
            '~')

    def run_conver(self):
        print('需要转换的文件数是:', len(self._filename_list))
        for filename in self._filename_list:
            postfix = filename.split('.')[-1].lower()
            funcCall = getattr(self, postfix)
            print('原文件:', filename)
            funcCall(filename)
        print('转换完成!')

doc/docx 转换为 PDF

doc/docx 转换为 PDF 部分代码如下所示:


    def doc(self, filename):
        name = os.path.basename(filename).split('.')[0] + '.pdf'
        exportfile = os.path.join(self._export_folder, name)
        print('保存 PDF 文件:', exportfile)
        gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}'084)
        pythoncom.CoInitialize()
        w = Dispatch("Word.Application")
        pythoncom.CoInitialize()  # 加上防止 CoInitialize 未加载
        doc = w.Documents.Open(filename)
        doc.ExportAsFixedFormat(exportfile, constants.wdExportFormatPDF,
                                Item=constants.wdExportDocumentWithMarkup,
                                CreateBookmarks=constants.wdExportCreateHeadingBookmarks)
        w.Quit(constants.wdDoNotSaveChanges)
 def docx(self, filename):
        self.doc(filename)

ppt/pptx 转换为 PDF

ppt/pptx 转换为 PDF 部分代码如下:


 def ppt(self, filename):
        name = os.path.basename(filename).split('.')[0] + '.pdf'
        exportfile = os.path.join(self._export_folder, name)
        gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}'084)
        pythoncom.CoInitialize()
        p = Dispatch("PowerPoint.Application")
        pythoncom.CoInitialize()
        ppt = p.Presentations.Open(filename, FalseFalseFalse)
        ppt.ExportAsFixedFormat(exportfile, 2, PrintRange=None)
        print('保存 PDF 文件:', exportfile)
        p.Quit()

    def pptx(self, filename):
        self.ppt(filename)

xls/xlsx 转换为 PDF

    def xls(self, filename):
        name = os.path.basename(filename).split('.')[0] + '.pdf'
        exportfile = os.path.join(self._export_folder, name)
        pythoncom.CoInitialize()
        xlApp = DispatchEx("Excel.Application")
        pythoncom.CoInitialize()
        xlApp.Visible = False
        xlApp.DisplayAlerts = 0
        books = xlApp.Workbooks.Open(filename, False)
        books.ExportAsFixedFormat(0, exportfile)
        books.Close(False)
        print('保存 PDF 文件:', exportfile)
        xlApp.Quit()

    def xlsx(self, filename):
        self.xls(filename) 

执行转换逻辑

if __name__ == "__main__":
    # 支持文件夹批量导入
    #folder = 'tmp'
    #pathname = os.path.join(os.path.abspath('.'), folder)
    # 也支持单个文件的转换
    pathname = "G:/python_study/test.doc"
    pdfConverter = PDFConverter(pathname)
    pdfConverter.run_conver()

总结

今天的文章主要是 Python 实战之小工具的运用,希望对大家有所帮助。

转自:https://mp.weixin.qq.com/s/ffqHzv08n84cIfCG5o_P8A

如何用 Python 调用外部命令

问题

 

也许大家在日常工作中遇到过要用 Python 脚本执行外部命令的情况,并且你还不知道怎么调用。Stack Overflow 热帖:如何用 Python 调用外部命令

 

没关系,早在 12 年前就有程序员在 Stack Overflow 上求助提问啦。

 

Stack Overflow 热帖:如何用 Python 调用外部命令

本文为大家总结整理其中一些高赞回答,以备不时之需!

解决方法

方法1:我们可以使用 subprocess ,比如要执行 ls -l 命令

import subprocess subprocess.run(["ls", "-l"])

Python3.5 之前的版本,需要使用 call

import subprocess subprocess.call(["ls", "-l"])

方法2:

import os os.system("ls -l") #执行命令os.popen("ls -l").read() #执行并输出命令的执行结果

方法讨论:

问题解决了,那么os.system 和 subprocess 那个解决方法更好一点呢?这里做简单讨论,虽然os.system 和 subprocess 都能完成调用外部命令的功能,但是subprocess 比 system 更灵活(subprocess 我们可以得到 stdout,stderr 以及更好的错误处理等等)。并且官方文档也是更建议 subprocess 模块。

下面是对各种调用外部程序的方法的小总结:

1、os.system(“some_command with args”):将命令和参数传给系统shell,这个方法可以一次执行多条命令,并且可以建立管道重定向例如:

os.system("some_command < input_file | another_command > output_file")

尽管这种方式很简便,但是你不得不手工处理一些特殊字符例如空格等。

2、stream=os.popen(“some_command with args”):实现的功能和os.system是一样的,但是os.popen会返回一个类文件对象,让你看到命令的执行结果。

stream=os.popen("ls -l")stream.read() #输出ls -l 的结果

3、subprocess的Popen类,建议尽量使用它来代替os.popen,但是使用的时候参数会相对复杂,例如

print(subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read())

而不建议使用

print(os.popen("echo Hello World").read())

4、subprocess模块中的call函数,功能和Popen类相似,并且使用相同的参数,但是它仅仅在命令执行完毕后,返回一个代码,例如

return_code = subprocess.call("echo Hello World", shell=True)0 #执行成功

5、如果使用的是Python3.5及以上版本,可以使用subprocess.run函数,它跟上面介绍的函数基本一样,但是更灵活,会在命令行执行结束后返回一个CompletedProcess对象。

return_code = subprocess.run("echo Hello World", shell=True)return_codeCompletedProcess(args='echo Hello World', returncode=0) #CompletedProcess对象type(return_code)

6、虽然os模块包括fork/exec/spawn等函数,但是并不建议直接使用它们,使用不当可能会导致意外结果。

因此如果有需要执行外部命令的需要,建议使用subprocess,而非os模块。

最后,特别要注意如果你要执行的命令是以字符串的形式作为参数,那么必须小心谨慎,否则会造成严重的后果!比如下面的例子

print(subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read())

看到这段代码能想到什么可怕的事情吗?如果有人给 user_input 传递的是 “my mama didnt love me && rm -rf /”,是不是头皮发麻!Stack Overflow 热帖:如何用 Python 调用外部命令 所以谨慎再谨慎!!尽量不做交互式输入,而是在程序中,将要执行的命令,写“死”在字符串中,做为常量传递。

拓展思路

 

下面还整理了一些其它的方法,有兴趣的同学可再深入研究。

sh

sh程序是subprocess的接口,让你像调用函数一样的调用想执行的程序。如果要多次运行一个命令,这很有用。

sh.ls("-l") ls_cmd = sh.Command("ls")

plumbum

plumbum功能和sh类似。

ls_cmd = plumbum.local("ls -l") ls_cmd()

fabric

fabric 是py2.5和2.7的库。可以让你执行本地或远程shell命令。

fabric.operations.local('ls -l')fabric.operations.local('ls -l', capture = True)

envoy

envoy 以“subprocess for humans”闻名,它是对subprocess模块的封装,简单易用

r = envoy.run("ls -l"r.std_out

参考链接:

https://stackoverflow.com/questions/89228/how-to-call-an-external-command

学了半天,import 到底在干啥?

Python凭什么就那么好用呢?
毫无疑问,大量现成又好用的内置/第三方库功不可没。
那我们是怎么使用它们的呢?
噢,对了~是用的import xxx这个语句。
之所以会有此一问,也是之前有一次使用PyCharm进行开发时(又)踩了个坑……
学了半天,import 到底在干啥?

废话少说,先讲问题

像下面这样一个项目结构:
Projetc_example
|– A
|– alpha.py
|– beta.py
|– B
|– theta.py
|– main
|– main.py
假设要在main.py中导入theta.py:
# main/main.py
from B import theta

显然会导致我们所不希望的问题,即Python不知道要到哪里去找这个名为B的模块(包是一种特殊的模块):
Traceback (most recent call last):
File “main/main.py”, line 1, in <module>
from B import theta
ModuleNotFoundError: No module named ‘B’
可是这就奇了怪了,为啥同样的代码,在PyCharm里运行就是好的了呢?
学了半天,import 到底在干啥?

import的查找路径

于是我们不辞艰辛,上下求索,原来在Python中,import语句实际上封装了一系列过程。

1. 查找是否已导入同名模块

首先,Python会按照import xxx中指定的包名,到sys.modules中查找当前环境中是否已经存在相应的包——不要奇怪为什么都没有导入sys这个模块就有sys.modules了。
sys是Python内置模块,也就是亲儿子,导入只是意思一下,让我们这样的外人在导入的环境中也可以使用相关接口而已,实际上相应的数据对Python而言从始至终都是透明的。
学了半天,import 到底在干啥?
我们可以导入sys查看一下这个对象的具体内容(节省篇幅,做省略处理):
>>> import sys
>>> sys.modules
{‘sys’: <module ‘sys’ (built-in)>, ‘builtins’: <module ‘builtins’ (built-in)>, …’re’: <module ‘re’ from ‘E:\Anaconda\Anaconda\lib\re.py’>, …}
这些就都是Python一开始就已经加载好的模块,也就是安装好Python之后,只要一运行环境中就已经就绪的模块——只是作为外人的我们还不能直接拿过来用,得跟Python报备一声:“欸,我要拿您儿子来用了嗨~”
很容易可以发现,sys.modules中列出来的已加载模块中存在明显的不同,前面的很多模块显得很干净,而后面的很多模块都带有from yyy’的字样,并且这个yyy看起来还像是一个路径。
这就关系到我们接下来要讲的步骤了。

2. 在特定路径下查找对应模块

前面我们讲到了,当我们导入某个模块时,Python先会去查询sys.modules,看其中是否存在同名模块,查到了那当然皆大欢喜,Python直接把这个模块给我们用就好了,毕竟儿子那么多,借出去赚点外快也是好事儿不是?
可问题在于:那要是没找到呢?
这显然是一个很现实的问题。毕竟资源是有限的,Python不可能把你可能用到的所有模块全都一股脑给加载起来,否则这样男上加男加男加男……谁也顶不住啊不是(大雾
学了半天,import 到底在干啥?
于是乎就有人给Python出了个主意:那你等到要用的时候,再去找他说他是你儿子呗
Python:妙哇~
学了半天,import 到底在干啥?
有了这个思路,Python就指定了几家特定的酒楼,说:“凡是去消费的各位,都可以给我当儿子。”
就这样,一些本来不是Python亲儿子的人,出于各种原因聚集到了这几家酒楼,以雇佣兵的身份随时准备临时称为Python的儿子。
这可就比周文王开局就收100个义子优雅多了,养家糊口的压力也就没那么大了(Python:什么?我的亲儿子都不止100个?你说什么?听不见啊——
学了半天,import 到底在干啥?
回到正经的画风来——
实际上,在Python中,sys.path维护的就是这样一个py交易的结果~~(诶?好像莫名发现了什么),其中保存的内容就是这几家“指定酒楼”,也就是当Python遇到不认识的儿子~~模块时,就会去实地查找的路径。
我们也可以打印出来看看具体内容:
>>> sys.path
[”, ‘E:\Anaconda\Anaconda\python37.zip’, ‘E:\Anaconda\Anaconda\DLLs’, ‘E:\Anaconda\Anaconda\lib’, ‘E:\Anaconda\Anaconda’, ‘E:\Anaconda\Anaconda\lib\site-packages’, ‘E:\Anaconda\Anaconda\lib\site-packages\win32’, ‘E:\Anaconda\Anaconda\lib\site-packages\win32\lib’, ‘E:\Anaconda\Anaconda\lib\site-packages\Pythonwin’]
大体上就是安装环境时配置的一些包所在路径,其中第一个元素代表当前所执行脚本所在的路径。
也正是因此,我们可以在同一个目录下,大大方方地调用其他模块。

3. 将模块与名字绑定

找到相应的非亲生模块还没完,加载了包还得为它分配一个指定的名字,我们才能在脚本中使用这个模块。
当然多数时候我们感知不到这个过程,因为我们就是一个import走天下:
import sys
import os
import requests
这个时候我们指定的模块名,实际上也是指定的稍后用来调用相应模块的对象名称。
换个更明显的:
import requests as req
如果这个时候只使用了第二种方式来导入requests这个模块,那么很显然在之后的程序流程中,我们都不能使用requests这个名字来调用它而应当使用req
这就是Python导入过程中的名称绑定,本质上与正常的赋值没有太大区别,加载好了一个对象之后,然后为这个对象赋一个指定的变量名。
当然即使是已经加载好的模块,我们也可以利用这个名称绑定的机制为它们取别名,比如:
>>> import sys
>>> import sys as sy
>>> sys.path
[”, ‘E:\Anaconda\Anaconda\python37.zip’, ‘E:\Anaconda\Anaconda\DLLs’, ‘E:\Anaconda\Anaconda\lib’, ‘E:\Anaconda\Anaconda’, ‘E:\Anaconda\Anaconda\lib\site-packages’, ‘E:\Anaconda\Anaconda\lib\site-packages\win32’, ‘E:\Anaconda\Anaconda\lib\site-packages\win32\lib’, ‘E:\Anaconda\Anaconda\lib\site-packages\Pythonwin’]
>>> sy.path
[”, ‘E:\Anaconda\Anaconda\python37.zip’, ‘E:\Anaconda\Anaconda\DLLs’, ‘E:\Anaconda\Anaconda\lib’, ‘E:\Anaconda\Anaconda’, ‘E:\Anaconda\Anaconda\lib\site-packages’, ‘E:\Anaconda\Anaconda\lib\site-packages\win32’, ‘E:\Anaconda\Anaconda\lib\site-packages\win32\lib’, ‘E:\Anaconda\Anaconda\lib\site-packages\Pythonwin’]
>>> sys == sy
True

问题解决

好了,上面就是对Python导入机制的大致介绍,但是说了半天,我们的问题还没有解决:在项目中如何简洁地跨模块导入其他模块?
在使用PyCharm的时候倒是一切顺遂,因为PyCharm会自动将项目的根目录加入到导入的搜索路径,也就是说像下面这样的项目结构,在任意模块中都可以很自然地通过import A导入模块A,用import B导入模块B。
Projetc_example
|– A
|– alpha.py
|– beta.py
|– B
|– theta.py
|– main
|– main.py
但是在非IDE环境中呢?或者说就是原生的Python环境中呢?
很自然地我们就会想到:那就手动把项目根目录加入到sys.path中去嘛。说起来也跟PyCharm做的事没差呀
可以,贫道看你很有悟性,不如跟我去学修仙吧
所以我们就通过sysos两个模块七搞八搞(这两个模块以前有过介绍,不再赘述)——
噔噔噔噔——好使了
# Peoject_example/A/alpha.py
print(“name: “ + __name__)
print(“file: “ + __file__)

def al():
print(“Importing alpha succeeded.”)

main.py中则加入一个逻辑,在sys.path中增加一个项目根目录:
import os
import sys

sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

import A.alpha

A.alpha.al()

# name: A.alpha
# file: *Project_exampleAalpha.py
# Importing alpha succeeded.

大功告成,风紧扯呼~

总结

本文借由一个易现问题引出对Python导入机制的介绍,实际上限于篇幅,导入机制只是做了一个概览,具体的内容还要更加复杂。本文讲到的这三步则适用于比较常见的情形,了解了这三步也足以应付很多问题了。更多内容还是留待大家自行探索,当然后续也可能会有文章进一步讲解——谁知道呢哈哈~~(又挖坑了)~~

参考资料

https://docs.python.org/zh-cn/3/reference/import.html
 

《Python中神奇的第三方库:Faker》

来源: 南枝向暖北枝寒MA

https://blog.csdn.net/mall_lucy/article/details/108655317

【导读】:开发项目的时,为了测试常需要造假数据,经常要尽量的模拟真实环境,通常要费大量手工而且造出来的数据,而且通常手工造出来的看起来也很别扭,费时又费事,有没有更好的办法?有,这里给大家介绍一个“专业造数“库Faker,满足你对模拟数据的所有需求。

 

— 以下是正文 —

 

项目开发初期,为了测试方便,我们总要造不少假数据到系统中,尽量模拟真实环境。比如要创建一批用户名,创建一段文本,电话号码,街道地址、IP地址等等。平时我们基本是键盘一顿乱敲,随便造个什么字符串出来,当然谁也不认识谁。现在你不要这样做了,用Faker就能满足你的一切需求。

 

1. 安装

  •  
pip install Faker

2. 简单使用

  •  
  •  
  •  
  •  
  •  
  •  
>>> from faker import Faker>>> fake = Faker(locale='zh_CN')>>> fake.name()'李洁'>>> fake.address()'上海市兴安盟县江北东莞路r座 803484'

参数 locale:为生成数据的文化选项(语种),默认为 en_US,只有使用了相关文化,才能生成相对应的随机信息

常见的文化选项:

  • zh_CN – Chinese (China Mainland)

  • zh_TW – Chinese (China Taiwan)

  • en_US – English (United States)

     

3. 其他方法

3.1 地理信息类

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
city_suffix():市,县country():国家country_code():国家编码district():区geo_coordinate():地理坐标latitude():地理坐标(纬度)longitude():地理坐标(经度)postcode():邮编province():省份address():详细地址street_address():街道地址street_name():街道名street_suffix():街、路

3.2 基础信息类

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
ssn():生成身份证号bs():随机公司服务名company():随机公司名(长)company_prefix():随机公司名(短)company_suffix():公司性质,如'信息有限公司'credit_card_expire():随机信用卡到期日,如'03/30'credit_card_full():生成完整信用卡信息credit_card_number():信用卡号credit_card_provider():信用卡类型credit_card_security_code():信用卡安全码job():随机职位first_name_female():女性名first_name_male():男性名name():随机生成全名name_female():男性全名name_male():女性全名phone_number():随机生成手机号phonenumber_prefix():随机生成手机号段,如139

3.3 邮箱信息类

  •  
  •  
  •  
  •  
  •  
ascii_company_email():随机ASCII公司邮箱名ascii_email():随机ASCII邮箱:company_email():公司邮箱email():普通邮箱safe_email():安全邮箱

3.4 网络基础信息类

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
domain_name():生成域名domain_word():域词(即,不包含后缀)ipv4():随机IP4地址ipv6():随机IP6地址mac_address():随机MAC地址tld():网址域名后缀(.com,.net.cn,等等,不包括.)uri():随机URI地址uri_extension():网址文件后缀uri_page():网址文件(不包含后缀)uri_path():网址文件路径(不包含文件名)url():随机URL地址user_name():随机用户名image_url():随机URL地址

3.5 浏览器信息类

  •  
  •  
  •  
  •  
  •  
  •  
  •  
chrome():随机生成Chrome的浏览器user_agent信息firefox():随机生成FireFox的浏览器user_agent信息internet_explorer():随机生成IE的浏览器user_agent信息opera():随机生成Opera的浏览器user_agent信息safari():随机生成Safari的浏览器user_agent信息linux_platform_token():随机Linux信息user_agent():随机user_agent信息

3.6 数字信息

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
numerify():三位随机数字random_digit():0~9随机数random_digit_not_null():1~9的随机数random_int():随机数字,默认0~9999,可以通过设置min,max来设置random_number():随机数字,参数digits设置生成的数字位数pyfloat():随机Float数字pyint():随机Int数字(参考random_int()参数)pydecimal():随机Decimal数字(参考pyfloat参数)

3.7 文本加密类

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
pystr():随机字符串random_element():随机字母random_letter():随机字母paragraph():随机生成一个段落paragraphs():随机生成多个段落sentence():随机生成一句话sentences():随机生成多句话,与段落类似text():随机生成一篇文章word():随机生成词语words():随机生成多个词语,用法与段落,句子,类似binary():随机生成二进制编码boolean():True/Falselanguage_code():随机生成两位语言编码locale():随机生成语言/国际 信息md5():随机生成MD5null_boolean():NULL/True/Falsepassword():随机生成密码,可选参数:length:密码长度;special_chars:是否能使用特殊字符;digits:是否包含数字;upper_case:是否包含大写字母;lower_case:是否包含小写字母sha1():随机SHA1sha256():随机SHA256uuid4():随机UUID

4. 实战使用

在数据库建一张表,通过Faker造数据,插入到表中。并且打印Faker造的数据。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import pymysqlfrom faker import Faker
conn = pymysql.connect(host="114.215.129.166", port=3306, user="nice", password="", db="flask201", charset="utf8")
cursor = conn.cursor()sql1 = """drop table if exists faker_user"""sql2 = """create table faker_user(pid int primary key auto_increment,username varchar(20),password varchar(20),address varchar(35) )"""cursor.execute(sql1)cursor.execute(sql2)fake = Faker("zh-CN")for i in range(20): sql = """insert into faker_user(username,password,address) values('%s','%s','%s')""" % (fake.name(), fake.password(special_chars=False), fake.address()) print('姓名:'+fake.name() + '|密码:'+fake.password(special_chars=False) + '|地址:'+fake.address()) cursor.execute(sql)
conn.commit()cursor.close()conn.close()

输出的结果如下:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
姓名:王平|密码:iZqPxLO947|地址:吉林省莉市房山杨路R座 491718姓名:柏倩|密码:h853B0idne|地址:辽宁省玉华县蓟州永安街g座 205585姓名:贾俊|密码:UsRtGXAv9o|地址:湖北省石家庄市大兴傅街c座 861094姓名:梁丹|密码:ke7QZBdBC3|地址:湖南省太原市璧山太原街m座 939225姓名:丁燕|密码:Ee9Gt9Jh5E|地址:云南省颖县海港梁街A座 403237姓名:余敏|密码:d2KhMqlen0|地址:江西省晶市城北深圳路E座 683731姓名:朱冬梅|密码:aGpEzKJZ2a|地址:台湾省建市淄川张家港路F座 443320姓名:韦小红|密码:ZDZXzsWiJ1|地址:河北省桂荣市朝阳贺街R座 559885姓名:蓝艳|密码:tvDugIUra3|地址:湖北省西宁市和平李路n座 365745姓名:黎雪|密码:Is1U1UAu57|地址:香港特别行政区六盘水市六枝特洪街e座 507272姓名:刘利|密码:8zzbAEowYA|地址:辽宁省巢湖县西夏台北街k座 665328姓名:董波|密码:q9TGizssrV|地址:台湾省桂芝市长寿大冶路v座 842339姓名:刘志强|密码:Za9Vzdocki|地址:湖南省梅市门头沟梧州街r座 897061姓名:涂飞|密码:9JFvmsO0r2|地址:辽宁省金凤市海港曾路z座 577420姓名:仲秀英|密码:6MJXQ1w6qb|地址:贵州省淑英市朝阳蔡路r座 880809姓名:赵冬梅|密码:7oUoUrw22Z|地址:湖北省斌市黄浦阜新路f座 635086姓名:张丽丽|密码:5DnZJhfnnB|地址:香港特别行政区秀芳县高坪李路b座 543520姓名:徐燕|密码:6WbRXyiY2R|地址:河北省惠州市锡山南宁路T座 266905姓名:卫帅|密码:0XqEZPbiGZ|地址:贵州省福州县浔阳孙路L座 535933姓名:李桂英|密码:6hLMsaqSI1|地址:重庆市辽阳市华龙姬街k座 718930

 

– EOF –

转自:https://mp.weixin.qq.com/s/Bx4ZP-SPPC_yDFJGYx0wiw