购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第5章
办公自动化

本章介绍PPT、Excel、Word、声频、视频等各种文件的自动化处理。

5.1 PyCharm的使用

PyCharm是高效的、免费的Python语言开发工具,从本章开始,使用PyCharm编写Python代码。

1.下载与安装

进入PyCharm官网,如图5-1所示。

图5-1 PyCharm官网

单击PyCharm官网右上角的Download按钮,进入下载界面,如图5-2所示。

单击右侧的Download按钮,下载免费的社区版(Community),双击下载好的PyCharm-community-2021.3.2.exe程序进行安装。

依次单击【运行】→【是】→Next→Next,直到出现安装选项窗口,如图5-3所示。

全部勾选,单击Next→Install按钮进行安装,直到进入完成安装界面,如图5-4所示。

图5-2 PyCharm下载界面

图5-3 PyCharm安装选项

图5-4 PyCharm完成安装

选择Reboot now,单击Finish按钮完成安装,然后重启计算机。开机后双击桌面上的PyCharm Community Edition 2021.3.2的快捷方式运行程序,进入协议界面,如图5-5所示。

图5-5 PyCharm协议窗口

勾选I confirm that I have read and accept the terms of this User Agreement,再单击Continue按钮,进入PyCharm欢迎界面,如图5-6所示。

图5-6 PyCharm欢迎界面

单击Plugins按钮安装插件,在搜索栏中输入chinese,单击 右边的Install按钮,安装官方汉化插件;在搜索栏中输入translation,单击Install按钮,安装翻译插件,也可以在打开PyCharm后选择File→Settings→Plugins进行安装,安装完成后重启PyCharm,以便使插件生效。

2.打开项目

用PyCharm打开项目有3种方法。

1)新建项目

运行PyCharm,进入如图5-7所示的欢迎界面,PyCharm已经被汉化。

图5-7 PyCharm欢迎界面

单击【新建项目】按钮,进入新建项目界面,如图5-8所示。

图5-8 新建项目界面

【位置】是用来设置新建项目(程序文件夹)路径的,选中【先前配置的解释器】指定已安装的Python程序,单击【创建】按钮,创建新的项目。

2)打开

运行PyCharm,进入如图5-7所示的欢迎界面,单击【打开】按钮,选择项目文件夹,打开项目。

3)右击打开

最常用的方法是右击项目文件夹,选择Open Folder as PyCharm Community Edition Project,打开项目。

3.PyCharm主界面各区域功能介绍

打开项目后,进入PyCharm程序主界面,如图5-9所示。

图5-9 PyCharm程序主界面

PyCharm程序主界面由菜单栏、导航条、工具条、工具栏、代码编辑窗口、状态栏等组成。

工具栏各按钮的功能如下。

(1) Python Packages:包管理工具,用于查看、搜索、安装各种库。

(2) Python控制台:打开交互编程窗口。

(3) 终端:进入cmd命令行窗口。

右击项目管理窗口内的文件,弹出的菜单有【新建】、【复制】、【粘贴】等各种功能,常用的是【新建】功能,用于在项目目录中新建Python程序或目录等,如图5-10(a)所示;还可以直接打开程序所在的文件夹、cmd路径等,如图5-10(b)所示。

图5-10 PyCharm项目管理

状态栏在底部,6:11表示光标在第6行第11列;UTF-8是编码类型;Python 3.6表示所用Python的版本为3.6。

4.常用功能

1)注释与缩进

在英文状态下,选中一段程序,按组合键Ctrl+/可增加或去掉注释。

选中多行代码,按下Tab键,选中的代码向右缩进,按下组合键Shift+Tab键,代码向左缩进。

2)查看源码

按Ctrl键,再单击Python函数,会打开函数源码。

3)跳转

单击右下角行列显示,输入行数后按Enter键,光标可以直接跳转到指定行。

4)搜索

先选中需要搜索的内容,再按组合键Ctrl+F,可以搜索选中的内容。

5)替换

在命令栏中选择【编辑】→【查找】→【替换】,可以批量替换代码。

6)自动引用库

当程序中没有引用库而直接使用库时,可以把光标放在库名上,此时库名下就会出现引用库提示,单击需要的引用项后PyCharm会自动引用库。

7)自动安装库

当程序没有安装库而直接引用库时,可以把光标放在库名上,当出现提示菜单时,单击选择需要安装的库,PyCharm会自动安装库。

8)代码格式化

如果出现Tab和空格混用的情况,则可在命令栏中选择【代码】→【重新格式化代码】,PyCharm会自动统一格式。

9)错误提示

PyCharm主界面的右上角有一个问题代码报警数字,单击后在下面会出现报警类型及所在的行数,双击报警信息后,光标会自动跳转到问题代码所在的行。

10)自定义文件头

在实际的代码编写中,经常需要定义属于自己的文件头,例如程序的创建时间、作者、编码等。在PyCharm中,可以自定义文件头,以后新建的程序都会自动加载文件头内容,设置方法如下。

选择【文件】→【设置】→【编辑器】→【文件和代码模板】→Python Script,如图5-11所示。

输入文件头内容,单击【确定】按钮,以后新建Python文件时,模板内容会自动加载,如图5-12所示。

11)实时模板

选择【文件】→【设置】→【编辑器】→【实时模板】→ 增加快捷命令,如图5-13所示。

【缩写】即快捷键,例如cs;【描述】是对快捷键内容的描述,例如“测试”;【模板文本】即快捷键对应的文本;最关键的步骤是选择“定义”,然后选择Python;【展开方式】默认为Tab键,不用更改;最后单击【确定】按钮,编程时输入快捷键cs再按Enter键或Tab键,这样快捷键cs对应的文本内容会自动补齐。

图5-11 PyCharm添加文件头

图5-12 PyCharm自动加载文件头

图5-13 PyCharm添加快捷键

笔者已经把Python编程常用的36个实时模板汇总在一起,供读者参考,详见18.2.2节。

12)运行程序

运行Python程序常用的方法有以下3种:

(1)组合键Ctrl+Shift+F10。

(2)右击【代码编辑】窗口,选择菜单中的 运行。

(3)在【项目管理】窗口右击程序的文件名,选择 运行。

5.2 txt文件的读写

txt文本文件最常用的操作方法有全文读取、列表读取、分行写入。

1.全文读取

全文读取是一次读出全部文本内容,示例代码如下:

    with open('txt/1.txt',mode='r')as t:
        print(t.read())

运行结果如下:

    张三
    666666

打开文件open('txt/1.txt',mode='r')命令的参数'txt/1.txt'为1.txt文件的路径,mode='r'表示只读模式。

将打开的文件对象命名为t,read()用于全文读取文本。

2.列表读取

列表读取是把文本内容的每行作为列表的一个元素,可以索引取出,适用于记录程序配置信息,例如用户名、密码等,示例代码如下:

    with open('txt/1.txt',mode='r')as t:
        print(t.readlines()[0])

运行结果如下:

    张三

readlines()用于列表读取文本。

3.写入

文本写入,常用的方式是逐行写入,也可以遍历列表循环写入,示例代码如下:

    with open('txt/2.txt',mode='w')as t:
        t.write('李四\n')
        t.write('999999')

运行代码,打开保存的2.txt文件,内容如下:

    李四
    999999

open('txt/2.txt',mode='w')的参数mode='w'是覆盖写模式,表示文件内容全部删除重写。如果设置成mode='a',则表示追加写模式,每次都从文本尾部追加写入,'\n'表示换行。

5.3 CSV文件的读写

CSV文件是逗号连接的字符串存储的文本,CSV文件也是手机通讯录支持的格式。

1.写入单行文本

Python写入单行文本时,把文本放入列表,列表用逗号连接成字符串写入即可,示例代码如下:

    l=['张三','李四','王五']
    with open('csv/1.csv',mode='w')as t:
       t.write(','.join(l)+'\n')

CSV文件的内容如下:

    张三 李四 王五
2.读取单行文本

读取单行文本,示例代码如下:

    with open('csv/1.csv',mode='r')as t:
        l=t.read().strip('\n').split(',')
        print(l)

运行结果如下:

    ['张三','李四','王五']

与读取txt文本的方法相似,open()函数的参数mode='r'表示只读。程序读出逗号连接的字符串后先用strip('\n')去掉换行符,再用split(',')分割成列表。

3.多行多列数据的写入

多行多列数据的写入,示例代码如下:

    l=[['姓名','性别'],['张三','男'],['李四','女']]
    with open('csv/2.csv',mode='w')as t:
        for i in l:
            t.write(','.join(i)+ '\n')

运行代码,打开保存的2.csv文件,内容如下:

    姓名      性别
    张三             男
    李四             女

当将多行数据写入文件时,一行数据用一个列表表示,遍历循环所有列表写入。

4.多行多列数据的读取

多行多列数据的读取,示例代码如下:

    l=[]
    with open('csv/2.csv',mode='r')as t:
        for i in t:
            l.append(i.strip('\n').split(','))
    print(l)

运行结果如下:

    [['姓名','性别'],['张三','男'],['李四','女']]

程序读取多行多列数据时,用for循环遍历每行数据,用strip('\n')函数去掉每行的换行符,用split(',')函数把一行的内容根据','分割成一个列表元素,然后加入列表l=[]中。

5.4 图形界面的自动操作

如果需要用计算机模拟鼠标、键盘自动操作一些重复性工作,就要用到Pyautogui库了。安装命令如下:

    pip install pyautogui
1.模拟鼠标的移动和单击

图形界面常用的操作是移动光标和单击动作,例如打开网页、窗口最大化、窗口最小化等,代码如下:

    #//第5章/5.1.py
    import pyautogui,time
    time.sleep(5)
    pyautogui.moveTo(10,10,duration=0.25)             #移动到(10,10)
    time.sleep(5)
    pyautogui.moveTo(300,300,duration=0.25)                   #移动到(300,300)
    time.sleep(5)
    pyautogui.moveRel(200,200,duration=0.25)                  #移动到(200,200)
    time.sleep(5)
    pyautogui.click()                                          #单击

pyautogui.moveTo(10,10,duration=0.25)函数的参数“10,10”用于将光标移动到绝对坐标(10,10)位置,duration=0.25表示用时0.25s; pyautogui.moveRel(200, 200, duration=0.25)函数用于将光标移动到相对坐标(200, 200)位置;绝对坐标是以屏幕左上角为坐标原点,向右为 x 轴正方向,向下为 y 轴正方向的坐标;相对坐标是把光标当前位置看作坐标原点的坐标。

2.模拟键盘操作

键盘操作常用的是输入内容和按下组合键,例如输入用户名、密码、全选的组合键Ctrl+A、复制的组合键Ctrl+C、粘贴的组合键Ctrl+V等,代码如下:

    #//第5章/5.2.py
    import pyautogui,time
    time.sleep(3)
    pyautogui.moveTo(100,100,duration=0.25)
    pyautogui.click()
    pyautogui.typewrite('hellow\n',0.25)         #输入字符串或列表
    pyautogui.PAUSE=1                                 #每个动作停1s
    pyautogui.hotkey('Ctrl','a')                       #按下组合键Ctrl+A
    pyautogui.hotkey('Ctrl','c')                       #按下组合键Ctrl+C
    pyautogui.hotkey('Ctrl','v')                       #按下组合键Ctrl+V
    pyautogui.hotkey('Ctrl','v')
    pyautogui.hotkey('Ctrl','v')
    #print(pyautogui.KEYBOARD_KEYS)                    #查看所有键名

运行程序前,首先打开一个文本编辑器并放置到屏幕左上角,将输入法调成英文输入法,然后运行程序,文本编辑器的内容如下:

    hellow
    hellow
    hellow

pyautogui.typewrite('hellow\n',0.25)函数的参数'hellow'是模拟键盘输入的内容,'\n'是换行符,参数“0.25”表示输入每个字符停顿0.25s;pyautogui.hotkey('Ctrl','c')函数用于模拟键盘按下组合键'Ctrl+C';不同的键盘每个键的键名可能不同,用print(pyautogui.KEYBOARD_KEYS)命令可以查看键盘对应的键名。

3.自动截屏

pyautogui库有截屏功能,写个自动截屏程序监控计算机,代码如下:

    #//第5章/5.3.py
    import pyautogui,time
    for i in range(3):
        im=pyautogui.screenshot()             #截屏
        im.save('pyautogui/{}.jpg'.format(i))          #保存
        time.sleep(3)

除此之外,pyautogui还有颜色判断、查找图像等功能。

获取屏幕像素坐标的技巧:按下PrtScn键截取屏幕,打开画图板后单击 粘贴命令,再单击 铅笔工具,移动鼠标指针,在状态栏左下角会显示铅笔工具所在位置的坐标。

5.5 Excel文件的操作

Openpyxl是处理Excel文件的第三方库,安装命令如下:

    pip install openpyxl
1.对文件的操作

Openpyxl对Excel文件有新建、打开、关闭、保存4种操作,代码如下:

    #//第5章/5.4.py
    import openpyxl
    wb=openpyxl.Workbook()                        #新建Excel文件
    #wb=openpyxl.load_workbook('excel/example.xlsx')               #打开Excel文件
    #wb=openpyxl.load_workbook('excel/example.xlsx',data_only=True)
    wb.save('excel/example.xlsx')                                   #保存Excel文件
    wb.close()                                                      #关闭Excel文件

Workbook()命令用于创建一个新文件;load_workbook()命令用于打开已有的Excel文件;参数data_only=True的作用是把表中公式转换为运算结果,例如将'=1+3'转换为运算结果4,否则只能读出字符串'=1+3';save()用来保存文件,最后用close()关闭文件。

2.对工作表的操作

Openpyxl对Excel工作表有新建、删除、重命名、获得名称列表等操作,代码如下:

    #//第5章/5.5.py
    import openpyxl
    wb=openpyxl.load_workbook('excel/1.xlsx')             #打开文件
    #sh1=wb['Sheet1']                                             #打开工作表
    #wb.create_sheet(index=0,title='1')                          #在索引号0处新建表1
    #wb.create_sheet(index=1,title='2')                          #在索引号1处新建表2
    #wb.remove_sheet(wb.get_sheet_by_name('2'))                    #删除名为2的表
    #print(sh1.title)
    #sh1.title='重命名'                                           #重命名表
    #print(sh1.title)
    print(wb.sheetnames)                                           #获取表名列表
    for sheet in wb:                                               #遍历打印表名
        print(sheet.title)
    print('1'in wb.sheetnames)                                     #判断有没有表'1'
    wb.save('excel/1.xlsx')
    wb.close()

运行结果如下:

    ['11','2','1','重命名','Sheet1']
    11
    2
    1
    重命名
    Sheet1
    True

wb['Sheet1']用表名索引文件对象,这是打开表最简单的方法;create_sheet(index=0,title='1')表示在0位置新建名称为“1”的表,没有索引时建立在最后面。依次去掉注释,查看程序运行的效果。

3.对行、列的操作

Openpyxl对行、列常用的操作有统计、插入、删除等,代码如下:

    #//第5章/5.6.py
    import openpyxl
    wb=openpyxl.load_workbook('excel/1.xlsx')
    sh1=wb['重命名']
    rows=sh1.max_row           #获取总行数
    cols=sh1.max_column                #获取总列数
    print(rows,cols)
    sh1.insert_rows(1)                  #第1行插入1空行
    sh1.insert_cols(2)                  #第2列插入1空列
    sh1.delete_cols(2,2)                #删除第2列数据
    sh1.delete_rows(1,2)                #删除1~2两行数据
    wb.save('excel/2.xlsx')
    wb.close()

Openpyxl对工作表从0开始索引,Openpyxl对Excel行、列操作时,起始行和列都是1,而且删除时包含右边界,例如sh1.delete_rows(1,)删除了第1列和第2列。

4.对单元格的操作

Openpyxl对单元格常用的操作有读取、写入、字体设置、字号设置、颜色设置、判断等,代码如下:

    #//第5章/5.7.py
    import openpyxl
    wb=openpyxl.load_workbook('excel/1.xlsx')
    sh1=wb['重命名']
    s= sh1.cell(row=2,column=1).value                  #获取单元格的值
    print(s)
    sh1.cell(row=5,column=1).value='王五'                          #写入单元格的值
    from openpyxl.styles import Font                                  #导入字体模块
    fontred=Font(u'微软雅黑',size=9,bold=True,italic=False,\
    strike=False,color='FF0000')                                    #字体字号颜色
    sh1.cell(row=5,column=3,value='记者').font=fontred            #写入文本"记者"
    print(sh1.cell(row=5,column=1).value)
    print(sh1.cell(row=5,column=1).value is None)                   #判断单元是否为空
    sh1.cell(row=5,column=1).value=''                              #将单元格设置为None
    wb.save('excel/1.xlsx')
    wb.close()

Openpyxl一般用循环读取或写入内容,代码如下:

    #//第5章/5.8.py
    import openpyxl
    wb=openpyxl.load_workbook('excel/2.xlsx')
    shnm=wb['重命名']
    sh1=wb['1']
    print(shnm.max_row)
    for hang in range(shnm.max_row):        #读出第1列的内容
        print(shnm.cell(row=hang+1,column=1).value)
    print(shnm.max_column)
    for lie in range(shnm.max_column):       #读出第1行的内容
            print(shnm.cell(row=1,column=lie+1).value,end='')
    for hang in range(shnm.max_row):                #将表内数据写入表'1'
        for lie in range(shnm.max_column):
            sh1.cell(row=hang+1,column=lie+1).value\
                 =shnm.cell(row=hang+1,column=lie+1).value
    wb.save('excel/2.xlsx')
    wb.close()

嵌套循环类似钟表的分针与秒针,分针走一格秒针走一圈,外层每取一个元素,内层就会循环全部元素。

5.6 Word文件的操作

Python-docx是处理Word文档的第三方库,安装命令如下:

    pip install python-docx

Python-docx模块把一个Word文档分成了3个层级,第1层级为Document(文档),一个文件只有一个Document,一个Document有3个部件(包含文档信息sections);第2层级为Paragraph(段落),一个文件可以有多个段落;第3层级为Run(块),一个段落可以有多个Run,一个Run就是相同的格式信息的连续字符串,如一张图像、一张表、一个字都可以是一个Run。

1.文件的操作

Python-docx对Word文档有新建、打开、保存3种操作,代码如下:

    #//第5章/5.9.py
    import docx
    doc=docx.Document()             #新建文档
    #doc=docx.Document('word/2.docx')       #打开文档
    doc.save('word/1.docx')                  #保存文档

如果docx.Document()函数不带参数,则表示新建文件,如果带文件名参数,则表示打开已有文档,当保存为已存在文档时会覆盖已有文档。

2.文本的操作

文本操作有添加段落和添加段内Run两种方法,代码如下:

    #//第5章/5.10.py
    import docx
    doc=docx.Document()
    p1=doc.add_paragraph('检查')            #添加第1段
    p2=doc.add_paragraph('作者:张三')               #添加第2段
    p3=doc.add_paragraph()                          #添加第3段
    run31=p3.add_run('这是第3段第1句话,')           #第3段,第1个Run
    run32=p3.add_run('这是第3段第2句话,')           #第3段,第2个Run
    run32=p3.add_run('这是第3段第3句话。')          #第3段,第3个Run
    doc.save('word/1.docx')

add_paragraph()用于添加段落,既可以把文本内容直接传入,也可以通过Run添加文本。

3.图像的操作

Python-docx添加图像时可以设置图像的大小和位置,代码如下:

    #//第5章/5.11.py
    import docx
    from docx.enum.text import WD_PARAGRAPH_ALIGNMENT           #引入对齐函数
    from docx.shared import Cm                                          #引入单位(厘米)
    doc=docx.Document()
    doc.add_picture("word/1.jpg",width=Cm(6))                        #插入图像的宽为6cm
    last_paragraph=doc.paragraphs[-1]                                 #获得图像段落
    last_paragraph.alignment=WD_PARAGRAPH_ALIGNMENT.CENTER             #图像居中
    doc.save('word/1.docx')

doc.add_picture("word/1.jpg",width=Cm(6))的参数"word/1.jpg"是插入图片的地址,参数width=Cm(6)是插入图片的宽度。

WD_PARAGRAPH_ALIGNMENT.CENTER表示设置图像居中,也可以把CENTER换成LEFT或RIGHT,以便让图像靠左或靠右。

4.表格的操作

Python-docx可以设置表格行数、列数、内容、位置等,代码如下:

    #//第5章/5.12.py
    import docx
    from docx.enum.table import WD_TABLE_ALIGNMENT           #引入对齐函数
    from docx.shared import Cm                                       #引入单位(厘米)
    
    doc=docx.Document()                                             #增加2行2列表格
    table=doc.add_table(rows=2,cols=4,style= 'Table Grid')
    table.alignment=WD_TABLE_ALIGNMENT.CENTER                       #表格居中
    #table.allow_autofit=False                                      #允许手动调节
    for row in table.rows:                                           #设置表格列宽
        row.cells[0].width=Cm(2)                                    #第1列宽2cm
        row.cells[1].width=Cm(1)                                    #第2列宽1cm
    table.cell(0,0).text="姓名"                                   #设置单元格的值
    table.cell(0,1).text="性别"
    table.cell(1,0).text="张三"
    table.cell(1,1).text="男"
    doc.save('word/1.docx')

doc.add_table(rows=2,cols=4,style='Table Grid')的参数rows=2,cols=4表示插入表格为2行4列,参数style='Table Grid'为表格的样式,关于更多的样式信息,详见后面的样式设置。

5.纸张设置

常用的纸张设置的代码如下:

    #//第5章/5.13.py
    from docx import Document
    from docx.shared import Cm
    doc=Document()
    section=doc.sections[0]             #获取section对象
    section.page_width=Cm(21)                   #设置A4纸的宽度
    section.page_height=Cm(29.7)                #设置A4纸的高度
    section.top_margin=Cm(2)                    #纸张上边距2cm
    section.bottom_margin=Cm(2)                 #纸张下边距2cm
    section.left_margin=Cm(2)                   #纸张左边距2cm
    section.right_margin=Cm(2)                  #纸张右边距2cm
    doc.save('word/1.docx')

doc.sections[0]表示文档的纸张设置信息。

6.样式设置

文字、图像、表格等都有样式,样式的获取详见本章资源包word文件夹内,这里主要介绍文本样式设置,代码如下:

    #//第5章/5.14.py
    import docx
    from docx.shared import Pt,RGBColor                #磅的单位及颜色
    doc=docx.Document()
    #1全局样式
    doc.styles['Normal'].font.color.rgb=RGBColor(0,0,0)           #颜色
    doc.styles['Normal'].font.size=Pt(12)                         #字号
    doc.styles['Normal'].font.name=u'宋体'                        #字体
    doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'),u'宋体')
    #2标题样式,0,1,2...表示标题字号由大到小
    titlenr=doc.add_heading('物理',1)                             #标题
    titlenr.alignment=WD_PARAGRAPH_ALIGNMENT.CENTER               #居中
    #3段内样式
    p1=doc.add_paragraph()
    run=p1.add_run('为红色文字,9px,斜体,楷体,非粗体,缩进18px')
    run.font.size=Pt(9)
    run.font.color.rgb=RGBColor(255,0,0)
    run.font.name=u'楷体'
    run._element.rPr.rFonts.set(qn('w:eastAsia'),u'楷体')
    run.italic=True                                               #倾斜
    run.bold=False                                                #加粗
    run.underline=True                                            #设置下画线
    p1.paragraph_format.first_line_indent=Pt(18)                  #首行缩进18像素
    p1.space_after=Pt(5)                                          #上一段间隔Pt(5)
    p1.space_before=Pt(10)                                        #下一段间隔Pt(10)
    doc.add_page_break()                                           #插入分页符
    doc.save('word/1.docx')

文本样式一般先设置全局样式,再设置标题样式,最后用Run设置段内样式。不同的Run名字不同,如run1、run2等,在最后统一修改不同Run的格式。如果所有Run的名字相同,则无法修改每个Run的格式。

7.文本、图像、表格、样式的统计和索引

Python-docx可以对文本、图像、表格、样式形成列表,进行统计和索引访问,代码如下:

    #//第5章/5.15.py
    import docx
    doc=docx.Document('word/2.docx')
    print(len(doc.paragraphs))              #段落个数
    print(len(doc.tables))                            #表格个数
    print(len(doc.sections))                          #节个数
    print(len(doc.styles))                            #样式个数
    print(type(doc.tables))
    print(len(doc.inline_shapes))                     #图像个数
    print(len(doc.paragraphs[0].text))                #文字个数
    print(doc.paragraphs[0].text)                     #获取第1段文字内容
    print(doc.tables[0].rows[0].cells[0].text)        #0表0行0列内容
    doc.tables[0].rows[0].cells[0].text='www'        #修改内容
    doc.save('word/2.docx')

使用上述方法可以索引、修改已有文档。

5.7 PPT文件的操作

Python-pptx是处理PPT演示文档的第三方库,安装命令如下:

    pip install python-pptx

Python-pptx模块把一个PPT文档分成了4个层级,第1层级为Presentations(文档),一个文件只有一个Presentations;第2层级为Sliders(页),一个文件可以有多页;第3层级为Shapes(容器),Shapes用于容纳文本框、表格和图像,slide.shapes.add_textbox()函数用于添加文本框,add_paragraph()函数用于在文本框内添加段落;第4层级为Run(块),每个段落可以用add_run()函数添加多个Run,每个Run可以设置不同格式,Run的操作与Word中的Run的操作完全相同;slide.shapes.add_table()函数用于添加表格,slide.shapes.add_picture()函数用于添加图像。

1.文档操作

Python-pptx对PPT文档有新建、打开、保存3种操作,代码如下:

    #//第5章/5.16.py
    from pptx import Presentation
    prs=Presentation()             #新建文档
    #prs=Presentation('ppt/1.pptx')        #打开已有文档
    prs.save('ppt/1.pptx')                  #保存文档

当用save()函数保存文件时,如果文件已存在,则会覆盖原文件。

2.幻灯片操作

Python-pptx对幻灯片常用的操作有插入、删除等,代码如下:

    #//第5章/5.17.py
    from pptx import Presentation
    prs=Presentation()                         #新建PPT文档
    slide1=prs.slides.add_slide(prs.slide_layouts[6])            #插入第1页空幻灯片
    slide2=prs.slides.add_slide(prs.slide_layouts[6])            #插入第2页空幻灯片
    slide3=prs.slides.add_slide(prs.slide_layouts[6])            #插入第3页空幻灯片
    print(len(prs.slides))
    del prs.slides._sldIdLst[-1]                                 #删除最后一页幻灯片
    print(len(prs.slides))
    prs.save('ppt/1.pptx')

运行结果如下:

    3
    2

prs.slides.add_slide(prs.slide_layouts[6])用于插入空白幻灯片,参数prs.slide_layouts[6]是插入幻灯片的样式,[6]表示空白幻灯片。

先插入了3张幻灯片,删除最后1张后还有2张。删除之前,一般用print(len(prs.slides))命令查看共有几页,再删除指定索引号的幻灯片。

3.文本操作

用幻灯片的shapes.add_textbox()方法添加文本框,用textbox.text_frame.add_paragraph()方法添加段落,再设置段落内容,代码如下:

    #//第5章/5.18.py
    from pptx import Presentation
    from pptx.dml.color import RGBColor             #颜色
    from pptx.util import Inches,Pt                           #英寸、磅等单位
    prs=Presentation()                                       #新建PPT文档
    
    slide1=prs.slides.add_slide(prs.slide_layouts[6])        #插入空白幻灯片
    textbox=slide1.shapes.add_textbox(Inches(0.6),Inches(0.3)Inches(9),Inches(6))
                                                              #添加文本框
    tf=textbox.text_frame                                    #获取文本框对象
    para=tf.add_paragraph()                                  #文本框新增段落
    para.text="第1段"                                      #设置第1段内容
    para.line_spacing=4                                      #第1段1.5倍的行距
    font=para.font                                           #设置第1段字体样式
    font.name='微软雅黑'
    font.bold=True
    font.size=Pt(20)
    font.color.rgb=RGBColor(255,0,0)
    new_para=textbox.text_frame.add_paragraph()              #添加第2段文本
    new_para.text="第2段"                                  #第2段文本内容
    new_para=textbox.text_frame.add_paragraph()              #添加第3段文本
    new_para.text="第3段"                                  #第3段文本内容
    prs.save('ppt/1.pptx')

添加文本框shapes.add_textbox()函数的4个参数x、y、w、h即插入文本框的x坐标和y坐标,以及文本框的宽度w和高度h。每个段落可以增加多个Run,不同的Run可以设置不同的格式,示例代码如下:

    run1=new_para.add_run()
    run1.text=("内容")
    run1.font.name=u'楷体'
    run2=new_para.add_run()
    run2.text=("内容2")
    run2.font.name=u'黑体'
4.图像操作

Python-pptx添加图像时可以设置图像的大小和位置,代码如下:

    #//第5章/5.19.py
    from pptx import Presentation
    from pptx.util import Inches
    prs=Presentation()                        #新建PPT文档
    slide2=prs.slides.add_slide(prs.slide_layouts[6])           #插入空白幻灯片
                                                                 #设置插入图像的参数
    left,top,width,height = Inches(1),Inches(0.5),Inches(2),Inches(2)
                                                                 #插入图像
    pic=slide2.shapes.add_picture('ppt/1.jpg',left,top,width,height)
    prs.save('ppt/1.pptx')                                       #保存文档

插入图像slide2.shapes.add_picture()函数的4个参数x、y、w、h即插入图像的位置坐标x和y,以及插入图像的宽度w和高度h。

5.表格操作

Python-pptx可以设置表格的行数、列数、内容、位置等信息,代码如下:

    #//第5章/5.20.py
    from pptx import Presentation
    from pptx.util import Inches
    prs=Presentation()                             #新建PPT
    slide3=prs.slides.add_slide(prs.slide_layouts[6])                    #插入空白幻灯片
    rows,cols,left,top,width,height=2,3,Inches(3.5),\
                            Inches(0.5),Inches(6),Inches(0.8)             #表格参数
    table=slide3.shapes.add_table(rows,cols,left,top,
                                                width,height).table       #添加表格
    table.columns[0].width=Inches(2.0)                                   #第1列的宽度
    table.columns[1].width=Inches(4.0)                                   #第2列的宽度
    table.cell(0,0).text='语文'                                          #表格内容
    table.cell(0,1).text='数学'
    table.cell(0,2).text='英语'
    table.cell(1,0).text='2'
    table.cell(1,1).text='3'
    table.cell(1,2).text='1'
    prs.save('ppt/1.pptx')

Python-pptx对表格的索引是从0开始的,第1行第1列的单元格索引为table.cell(0,0)。

当Python-pptx增加新的Sliders、Shapes、textbox、paragraph、Run时,尽管名字可以一样,但不能单独设置格式,如果想在程序尾部统一设置格式,则每个对象的名字不能相同。

5.8 JSON文件的操作

JSON是跨平台的文件格式,以键-值对形式存储,读写灵活,访问速度快,JSON是Python的内置库,不需要安装。

1.新建JSON文件

JSON写入数据,代码如下:

    #//第5章/5.21.py
    import json
    new_dict={"张三":666,"李四":999}           #新建数据
    with open("jsonwj/test.json",'w')as f:                  #新建JSON文件
        json.dump(new_dict,f)                                 #写入数据

打开test.json文件,文件的内容如下:

    {"\u51b0\u58a9\u58a9":666,"\u96ea\u5bb9\u878d":999}

这是汉字的十六进制数据,直接显示汉字的方法详见下文;这种方式是覆盖写,即删除全部内容重写;JSON数据中的字符串必须用双引号,而不能用单引号。

2.读取数据

JSON读取数据,代码如下:

    #//第5章/5.22.py
    import json
    with open('jsonwj/test.json','r',encoding='UTF-8')as f:     #打开文件
        jg = json.load(f)["张三"]                               #获取内容
        print(jg)

运行结果如下:

    666

open('jsonwj/test.json','r',encoding='UTF-8')命令的参数'jsonwj/test.json'是读取的文件,参数'r'表示只读,参数encoding='UTF-8'表示编码为UTF-8。读取数据用load(),写入数据用dump()。

3.修改数据

JSON添加、删除、修改数据的代码如下:

    #//第5章/5.23.py
    import json
    with open("jsonwj/test.json","r",encoding='UTF-8')as f:
        data = json.load(f)                     #读取
        data["王五"]="增加的"                               #增加
        data["李四"]="增加的"                               #增加
        del data["李四"]                                       #删除
        data["张三"]="修改的"                               #修改
    with open("jsonwj/test.json",'w',encoding='UTF-8')as f:  #保存
        json.dump(data,f,ensure_ascii=False)

JSON增加、修改、删除数据的方法和字典操作相同,打开test.json文件,内容如下:

    {"张三":"修改的","王五":"增加的"}

参数ensure_ascii=False可使打开的JSON文件显示汉字。

5.9 视频文件的操作

FFmpeg是开源的视频处理库,进入FFmpeg官网,如图5-14所示。

图5-14 FFmpeg官网

将光标悬停在 图标上,图标下面会弹出Windows版本的下载链接,选择Windows builds by BtbN进入下载界面,如图5-15所示。

图5-15 FFmpeg下载界面

选择ffmpeg-n5.0-latest-win64-gpl-5.0.zip进行下载,下载完成后双击ffmpeg-n5.0-latest-win64-gpl-5.0.zip,把bin目录下的程序ffmpeg.exe复制到项目目录内,例如,笔者的目录是ffm,再拷入一个MP4格式的视频文件并改名为1.mp4。在该目录命令行中输入cmd命令后按Enter键,进入cmd命令行窗口,如图5-16所示。

图5-16 FFmpeg目录

输入一条提取声频的命令ffmpeg-i 1.mp4-q:a 0-map a sa.mp3后按Enter键,如图5-17所示。

程序运行完成后,在ffm目录生成了视频的声频文件sa.mp3,如何用Python实现自动批量操作呢?需要用Python内置库os的system()函数,它可以执行字符串内的命令,相当于在cmd命令行窗口内执行,示例代码如下:

图5-17 FFmpeg命令

    import os
    os.system('sa.mp3')           #打开MP3
    os.system('notepad')                  #打开记事本

system()函数也可以打开Word、视频等任意格式的文件。

FFmpeg的常用命令如下。

提取视频1.mp4里的声频并保存为1.mp3文件,代码如下:

    import os
    os.system('ffmpeg-i 1.mp4-q:a 0-map a 1.mp3')

将声频文件sa.mp3切割为5s一份的多个声频文件,代码如下:

    import os
    os.system('ffmpeg-i sa.mp3-f segment-segment_time 5-c copy out % 02d.mp3')

将声频文件sa.mp3切割为5s一份的多个声频文件并保存到m文件夹,代码如下:

    import os
    os.system('ffmpeg-i sa.mp3-f segment-segment_time 5-c copy m out % 02d.mp3')

转换为百度能识别的单声道、16位,并且为16kHz采样的PCM格式,代码如下:

    import os
    os.system('ffmpeg-y-i sa.mp3-acodec pcm_s16le-f s16le-ac 1-ar 16000 r.pcm')

剪去所有超过2s的静音片段,代码如下:

    import os
    os.system('ffmpeg-i sample.mp3-af silenceremove=stop_periods\
                           =-1:stop_duration=2:stop_threshold=-30dB output.mp3')

选择性切割,参数-ss用于设置开始切割的位置,参数-t用于设置切割持续的时间,代码如下:

    import os
    os.system('ffmpeg-i 1.mp3-ss 00:00:03-t 00:00:12-acodec copy tmp.mp3')

MP4格式转换为AVI格式,代码如下:

    os.system('ffmpeg-i 1.mp4 output.avi')

FFmpeg还有合并声频、视频、录音、录屏等功能,格式化工厂就是由FFmpeg开发出来的。

%02d中的%在字符串中表示占位符,d表示占位符的变量是整数,2表示整数长度为2,0表示不足2位的用0从左边填充。与format()命令的用法相似,其他常用方法如下:

print('%2d-%02d'%(4,1))结果为4-01。

print('%.3f'%3.1415926)的结果为3.142,.3表示保留3位小数,f表示浮点数。

print('我%s是%s人!'%('就','中国'))的结果为'我就是中国人!',s表示字符串。

当代码中%02d省略了变量时,默认从1开始递增。%占位符还可以控制两对三单引号''' '''表示的多行字符串内的变量,详见1 7.7.py文件,这是format()命令所不能的。

Python第3种格式控制f-string则是整合了以上两种方法中的优点,示例代码如下:

    print(f'''结果为{6*8}''')

运行结果如下:

    结果为48

如果变量是字符串,则使用更灵活,代码如下:

    aaa='光'
    ss=f"""
            床前
            明月
            {aaa}
            """
    print(ss)

运行结果如下:

            床前
            明月
            光

在代码17.6.py文件中也用到了f-string格式控制的方法。

5.10 自动发送邮件

Python内置库smtplib、email用于邮件发送。以QQ邮箱为例,首先要获取授权码,步骤如下:登录QQ邮箱,选择【设置】→【账户】→POP3/SMTP→【已开启】,手机发送短信后收到授权码。

1.发送纯文本邮件

smtplib、email发送纯文本邮件,代码如下:

    #//第5章/5.24.py
    import smtplib
    from email.mime.text import MIMEText
    msg=MIMEText('这是纯文本邮件内容','plain','UTF-8')          #创建邮件
    msg['From']= '发件邮箱'                                          #发件邮箱
    msg['To']= '收件邮箱'                                            #收件邮箱
    msg['Subject']="标题"                                          #邮件标题
    server=smtplib.SMTP_SSL('smtp.qq.com',465)                       #实例化应用
    try:
        server.login('发件邮箱','授权码')                             #发件邮箱及授权码
        server.send_message(msg)                                      #发送
        print('已发送')
    except Exception:
        print('发送失败')
        pass
    server.quit()                                                     #退出

MIMEText()函数的第1个参数'这是纯文本邮件内容'是邮件正文,第2个参数'plain'表明邮件类型为纯文本邮件,第3个参数表明编码为'UTF-8',否则会出现乱码。

2.发送带附件的邮件

发送带附件的邮件,代码如下:

本例中发送了两个附件,如果需要,则可以添加更多附件。smtplib、email还可以发送html邮件。

5.1 1 Pandas数据分析

Pandas是专业的数据分析库,功能强大,这里仅对常用功能进行介绍,安装命令如下:

    pip install pandas
1.文件操作

Pandas对文件的操作有打开、保存、显示等,代码如下:

    #//第5章/5.26.py
    import pandas as pd
    df=pd.read_excel('pan/1.xlsx',index_col='姓名')
    df2=pd.read_excel('pan/1.xlsx',skiprows=1,usecols='a:b')       #显示a:b列数据
    print(df)                                                             #默认显示前5行
    print(df2)
    print(df.head(2))                                                     #显示前2行内容
    print(df.tail(2))                                                     #显示后2行内容
    df.to_excel('pan/2.xlsx')                                             #保存

运行结果如下:

                 语文     数学
    姓名
    张三     99       96.0
    李四         96             NaN
    王五         97             91.0
                 张三           99
    0            李四           96
    1            王五           97
                 语文      数学
    姓名
    张三         99             96.0
    李四         96             NaN
                 语文      数学
    姓名
    李四         96             NaN
    王五         97             91.0

read_excel()函数的参数index_col='姓名'是指定第1列'姓名'为索引列,如果不指定,Pandas则会自动在第1列位置插入新的索引列;参数skiprows=1表示跳过第1行数据,如果设置为skiprows=2,则表示跳过前两行数据,可以把需要跳过的行放入列表中,跳过多列;参数usecols='a:b'表示只显示a到b两列数据;默认情况下print()只显示前5行数据,df.head(2)表示只显示前两行数据,df.tail(2)表示只显示后两行数据。

2.统计列信息

Pandas常用的统计方法有最大值、最小值、平均值、缺失的空值等,代码如下:

    #//第5章/5.27.py
    import pandas as pd
    df=pd.read_excel('pan/1.xlsx',index_col='姓名',header=0)
    print('总数',df['数学'].size)           #返回值的总数
    print('非缺',df['数学'].count())                #返回非缺失值的数目
    print('空值',df['数学'].isnull().sum())         #统计空值的个数
    print('最小',df['数学'].min())                  #返回最小值
    print('最大',df['数学'].max())                  #返回最大值
    print('平均',df['数学'].mean())                 #返回平均值
    print('总和',df['数学'].sum())                  #返回总和
    df.to_excel('pan/2.xlsx')

参数header=0用来指定题头,默认为0,即第1行为题头,也可以将其他行指定为题头。

3.计算列

Pandas可以直接对列数据进行运算,代码如下:

    #//第5章/5.28.py
    import pandas as pd
    df=pd.read_excel('pan/1.xlsx',index_col='姓名')
    print(df)
    df['数学']=df['数学']+2          #列+2
    print(df)
    #df.to_excel('pan/2.xlsx')

对列可以直接进行加、减、乘、除等运算,运行结果如下:

                 语文     数学
    姓名
    张三     99       96.0
    李四         96             NaN
    王五         97             91.0
                 语文      数学
    姓名
    张三         99             98.0
    李四         96             NaN
    王五         97             93.0

Pandas不仅可以对列直接进行四则运算,还可以对两个相同结构的表进行四则运算,示例代码如下:

    pf=pf+pf2

详见6.21节内容。

4.空值处理

从以上示例可以看出,空值不能参与运算,所以数据运算之前要对空值进行处理,代码如下:

    #//第5章/5.29.py
    import pandas as pd
    df=pd.read_excel('pan/1.xlsx',index_col='姓名',header=0)
    print(df)
    df['数学']=df['数学'].fillna(0)          #用0替换缺失值
    print(df)
    #df.to_excel('pan/2.xlsx')

运行结果如下:

                 语文     数学
    姓名
    张三     99       96.0
    李四         96             NaN
    王五         97             91.0
                 语文      数学
    姓名
    张三         99             96.0
    李四         96             0.0
    王五         97             91.0

fillna(0)可以把空值换成0,也可以把空值处理成其他值,例如fillna(1)可把空值都换成1。

5.插入列

Pandas可以直接插入新列,并赋值或计算,代码如下:

    #//第5章/5.30.py
    import pandas as pd
    df=pd.read_excel('pan/1.xlsx',index_col='姓名')
    print(df)
    #df["总分"]=''               #后面建一列,其值为空
    df['数学']=df['数学'].fillna(0)            #后面建一列,其值为0
    df["总分"]=df["数学"]+df["语文"]    #插入新列并计算
    print(df)
    #df.to_excel('pan/2.xlsx')

例中有3行代码用于插入新列,即赋值为空、赋值为0、赋值为两列之和,当然也可以赋值为其他。

6.排序

用openpyxl库对数据进行排序是非常麻烦的,用Pandas排序就简单多了,代码如下:

    #//第5章/5.31.py
    import pandas as pd
    df=pd.read_excel('pan/1.xlsx',index_col='姓名')
    print(df)
    df.sort_values(by='数学',inplace=True,ascending=True)#'数学'列升序
    #df.sort_values(by=['数学','语文'],inplace=True,ascending=[True,False])
    print(df)
    df.to_excel('pan/2.xlsx')

对“数学”这一列按升序进行排序,运行结果如下:

                 语文     数学
    姓名
    张三     99       96.0
    李四         96             NaN
    王五         97             91.0
                 语文      数学
    姓名
    王五         97             91.0
    张三         99             96.0
    李四         96             NaN

sort_values()排序函数的参数inplace=True表示在原数据中修改,inplace=False表示在新建数据中修改;ascending=True表示升序,ascending=False表示降序;将多列数据排序放入列表中,例如by=['数学','语文'],排序方法也是列表,例如ascending=[True, False],表示先按'数学'升序排序,再按'语文'降序排序。

7.筛选

Pandas的筛选功能就是筛选出符合条件的行,代码如下:

    #//第5章/5.32.py
    import pandas as pd
    df=pd.read_excel('pan/1.xlsx',index_col='姓名')
    print(df)
    df=df.loc[df['数学'].apply(lambda a:95<=a<100)]  #'数学'列筛选
    print(df)
    df.to_excel('pan/2.xlsx')

程序只对“数学”这一列进行筛选,运行结果如下:

                 语文     数学
    姓名
    张三     99      96.0

本例中用到了Python内置的匿名函数lambda,读者可百度“匿名函数lambda教程”进行学习。

打开保存的文件可以看到,文件中只有筛选数据,这一点与Excel的筛选功能不同。Pandas也可以实现多列筛选。

5.12 Matplotlib

Matplotlib是专业的数据可视化工具,安装命令如下:

    pip install matplotlib

下面对常见的几个绘图命令进行介绍。

1.散点图

scatter()函数用于绘制散点图,代码如下:

    #//第5章/5.33.py
    import matplotlib.pyplot as plt
    x=[1,2,3,4,5]                #1 x坐标值
    y=[2.3,3.4,1.2,6.6,7.0]              #2 y坐标值
    plt.scatter(x,y)                      #3绘制图形
    plt.savefig('plt/sdt.png')            #4保存图像
    plt.show()                            #5展示图像

运行结果如图5-18所示。

再加一组数据y2,指定颜色、标记符号及图例,代码如下:

    #//第5章/5.34.py
    import matplotlib.pyplot as plt
    x=[1,2,3,4,5]                     #1 x坐标值
    y=[2.3,3.4,1.2,6.6,7.0]                       #2 y坐标值
    y2=[3.3,3.4,4.2,10.6,13.0]                    #2 y2坐标值
    plt.scatter(x,y,color='r',marker='+')       #3绘制红色+号
    plt.scatter(x,y2)
    plt.legend([r'$Y$',r'$N$'])                    #添加图例
    plt.savefig('plt/sdt.png')                     #4保存图像
    plt.show()                                     #5展示图像

运行结果如图5-19所示。

图5-18 散点图1

图5-19 散点图2

2.折线图

Matplotlib并没有直接提供绘制折线图的函数,但是可以用plot()函数实现,它既可以画点图,也可以画线图,代码如下:

    #//第5章/5.35.py
    import matplotlib.pyplot as plt
    x=[1,2,3,4,5]                           #1 x坐标值
    y=[2.3,3.4,1.2,6.6,7.0]                                   #2 y坐标值
    y2=[3.3,3.4,4.2,10.6,13.0]
    plt.plot(x,y,color="g",marker='D',markersize=5)       #3绘图
    plt.scatter(x,y2)
    plt.legend([r'$ Y $',r'$ N $'],loc="lower right")       #图例
    plt.rcParams['font.sans-serif']='simhei'                 #显示中文
    plt.xlabel("时间")              #x轴标签
    plt.ylabel("活跃度")                        #y轴标签
    plt.title("用户活跃度")                     #标题
    plt.savefig('plt/zxt.png')                    #4保存
    plt.show()                                    #5展示

运行结果如图5-20所示。

图5-20 折线图

plt.plot(x,y,color="g",marker='D',markersize=5)函数的参数x和y是坐标数值,color="g"表示线条是绿色,marker='D'表示坐标点的线型为菱形,markersize=5表示坐标点大小,还可以用linestyle='--'表示线型为虚线,linewidth=2.5表示线的粗细等。

线型类别见表5-1。

表5-1 线型类别

颜色代码见表5-2。

表5-2 颜色代码

坐标点样式见表5-3。

表5-3 坐标点样式

当用Matplotlib绘制多组数据时,如果没有指定样式,则Matplotlib会按上述样式顺序赋值。

3.柱状图

Matplotlib提供了bar()函数来绘制柱状图,代码如下:

    #//第5章/5.36.py
    import matplotlib.pyplot as plt
    x=[1,2,3,4,5]                 #1 x坐标值
    y=[2.3,3.4,1.2,6.6,7.0]                 #2 y坐标值
    plt.bar(x,y)                             #3绘制柱状图
    #plt.savefig('plt/zzt.png')              #4保存
    plt.show()                               #5展示

运行结果如图5-21所示。

多组数据的柱状图绘制,代码如下:

    #//第5章/5.37.py
    import matplotlib.pyplot as plt
    x=[1,2,3,4,5]                    #1 x坐标值
    y=[2.3,3.4,1.2,6.6,7.0]                      #2 y坐标值
    x2=[1.4,2.4,3.4,4.4,5.4]
    y2=[3.3,3.4,4.2,10.6,13.0]
    fig=plt.figure()                             #添加子图区域
    ax=fig.add_axes([0,0,1,1])                   #子图比例系数
    ax.bar(x,y,color='r',width=0.4)             #3绘制柱状图
    ax.bar(x2,y2,color='g',width=0.4)
    #plt.savefig('plt/zzt37.png')                 #4保存
    plt.show()                                    #5展示

运行结果如图5-22所示。

图5-21 柱状图1

图5-22 柱状图2

ax=fig.add_axes([0,0,1,1])函数的参数[0,0,1,1]表示子图在原图中距左边、底边、宽度、高度的比例系数。读者可以把参数[0,0,1,1]换成[0.2,0.2,0.8,0.8],对比效果,加深理解。

Matplotlib绘制多柱状图时需要添加子图,并且需要指定子图在原图中的位置及缩放比例,相当于多张图叠加在一起,所以每个柱状图都有各自的 x y 数据,各柱状图 x 坐标值的差值应为柱状图的宽度,本例中柱状图的宽度为width=0.4,差1.4-1为0.4,表示画完一个紧接着画下一个。如果 x 轴数据差大于柱宽,则会出现柱子分离现象,示例代码如下:

    #//第5章/5.38.py
    import matplotlib.pyplot as plt
    x=[1,2,3,4,5]                    #1 x坐标值
    y=[2.3,3.4,1.2,6.6,7.0]                      #2 y坐标值
    x2=[1.5,2.5,3.5,4.5,5.5]
    y2=[3.3,3.4,4.2,10.6,13.0]
    fig=plt.figure()                             #添加子图区域
    ax=fig.add_axes([0,0,1,1])                   #子图比例系数
    ax.bar(x,y,color='r',width=0.3)             #3绘制柱状图
    ax.bar(x2,y2,color='g',width=0.3)
    #plt.savefig('plt/zzt38.png')                 #4保存
    plt.show()                                    #5展示

运行结果如图5-23所示。

差距越大,柱之间的距离就越大。

4.饼图

Matplotlib的pie()函数用于绘制饼图,代码如下:

    #//第5章/5.39.py
    from matplotlib import pyplot as plt
    x=[23,17,35,29,12]                     #1 x坐标值
    fig=plt.figure()                                     #添加子图区域
    ax=fig.add_axes([0,0,1,1])                           #子图比例系数
    langs=['C','C++','Java','Python','PHP']              #外标签
    ax.pie(x,labels=langs,autopct='% 1.2f % %')         #3绘制饼图
    plt.savefig('plt/zzt39.png')                          #4保存
    plt.show()                                            #5展示

运行结果如图5-24所示。

图5-23 柱状图3

图5-24 饼图

ax.pie(x,labels=langs,autopct='%1.2f%%')函数的参数x为一维数组,参数labels是饼图的外标签,参数autopct是饼图的内标签,'%1.2f%%'是饼图面积的百分比,包含两位小数。

5.多子图并列

当用Matplotlib绘制多子图时,可用subplot()指定行数、列数及画图位置,代码如下:

    #//第5章/5.40.py
    from matplotlib import pyplot as plt
    x=['group_a','group_b','group_c']         #1 x坐标值
    y=[1,10,100]                                  #2 y坐标值
    plt.figure(figsize=(9,3))                     #图宽9英寸,高3英寸
    plt.subplot(131)                               #1行3列放在第1列
    plt.bar(x,y)                                   #3绘图
    
    plt.subplot(132)                               #1行3列放在第2列
    plt.scatter(x,y)                               #3绘图
    
    plt.subplot(133)                               #1行3列放在第3列
    plt.plot(x,y)                                  #3绘图
    plt.savefig('plt/zzt40.png')                   #4保存
    plt.show()                                     #5展示

运行结果如图5-25所示。

plt.subplot(131)函数的参数131表示绘图的位置在1行3列的第1列位置。

还可以用facecolor参数指定背景颜色,用edgecolor参数指定边框颜色,用frameon参数指定是否显示边框,用axis('off')参数关闭子图外轮廓。

还有其他设置,如设置坐标刻度值的大小,代码如下:

    plt.tick_params(labelsize=25)

设置图例字体及大小,代码如下:

图5-25 子图并列

    font1={'family':'Times New Roman','weight':'normal','size':20,}
    plt.legend([r'Y'],loc="lower right",prop=font1)

设置坐标轴的名称及字体大小,代码如下:

    plt.xlabel('X',font1)

5.13 百度AI

由于百度AI提供了很方便的接口,所以可以很容易地调用百度AI实现人工智能。进入百度AI官网后,单击右上角的【控制台】按钮进行登录,使用已有的百度账号即可,如果没有百度账号,则需要注册一个并完成实名认证。

安装百度AI库的命令如下:

    pip install baidu-aip

5.13.1 图像文字识别

1.创建文字识别应用

将光标移动到控制台左上角蓝色导航按钮 上,网页会自动弹出导航栏,如图5-26所示。

依次选择【导航栏】→【文字识别】→【创建应用】,弹出的界面如图5-27所示。

【应用名称】可以任意填写,例如wzocr,选择【接口选择】右边红色的【去领取】,进入【领取页面】界面,【接口名称】选择【全部】→【0元领取】,然后关闭本界面,回到创建应用界面,【文字识别HTTP SDK】不用选择,【应用归属】选择【个人】,【应用描述】可以任意填写,单击【立即创建】→【返回列表】。

新建一个keyword.txt文件,将AppID、API Key、Secret Key内容复制到keyword.txt内,Secret Key是隐藏的,单击【显示】按钮后再复制,如图5-28(a)所示,新建文本内容如图5-28(b)所示。

2.图像文字识别

图像文字识别只需简单传入key和图像,代码如下:

图5-26 产品服务导航

图5-27 创建文字识别应用

图5-28 文字识别key

    #//第5章/5.41.py
    from aip import AipOcr
    client=AipOcr('AppID','API Key','Secret Key')           #加载key
    with open('baid/1.png','rb')as f:                              #读取图像
        image=f.read()
        text=client.basicAccurate(image)                          #调用
        result=text['words_result']                               #获取结果
        for i in result:
            print(i['words'])                                      #打印结果

识别结果如下:

    展示目录.txt

文字识别还有生僻字版、通用文字识别enhancedGeneralUrl()、网络图像文字识别webImageUrl()、身份证识别idcard()、表格文字识别form()、二维码识别qrcode()、数字识别numbers()、手写文字识别handwriting()等功能,需要把代码中的basicAccurate()函数换成相应的函数,准确率更高、速度更快,如果不换,则用通用方法识别。

5.13.2 语音与文字互转

1.创建语音识别应用

依次选择【导航栏】→【语音技术】→【创建应用】,其他步骤与创建文字识别应用的步骤类似,最后将语音key保存为keyvoice.txt文件。

2.文字转语音

文字转语音MP3,代码如下:

    #//第5章/5.42.py
    from aip import AipSpeech
    client=AipSpeech('AppID','API Key','Secret Key')           #加载key
    result=client.synthesis('百度AI开放平台','zh',1)                 #请求
    if not isinstance(result,dict):                                   #保存
        with open('baid/auido.mp3','wb')as f:
            f.write(result)

运行结果是在文件夹内生成auido.mp3语音文件。

client.synthesis('百度AI开放平台','zh',1)的参数'百度AI开放平台'是文本内容,参数'zh'表示转换为中文,参数“1”表示Web端请示。更多设置(例如改变语速、音调、音量、发声人物等)详见10.10节。

3.语音文件转文字

语音文件转文字,代码如下:

    #//第5章/5.43.py
    from aip import AipSpeech
    client=AipSpeech('AppID','API Key','Secret Key')          #加载key
    with open('baid/record.wav','rb')as fp:                          #读取声频文件
        au=fp.read()
    res=client.asr(au,'wav',16000,{'dev_pid':1537,})                #请求
    print('识别结果:'+"".join(res['result']))

识别结果如下:

    识别结果:现在进行测试。

asr(au,'wav',16000,{'dev_pid':1537,})命令的第1个参数au是上传的二进制声音文件;'wav'是上传的文件格式,百度支持mp3、pcm、m4a、amr等单声道、16位深、16000Hz采样率的声频文件,dev_pid是语言类型,1537表示中文普通话。

5.13.3 人脸识别

1.创建人脸识别应用

依次选择【导航栏】→【人脸识别】→【创建应用】→【应用名称】,可以任意填写,例如rlsb→【去领取】→【接口类别】全选,如果之前没有完成实名认证,则无法领取,实名认证完成后刷新网页,再选择【0元领取】,其他步骤与创建文字识别应用的步骤类似,最后将人脸识别key保存为keyface.txt文件。

2.本地图像人脸的颜值打分

对计算机上的图像人物进行“颜值”打分,代码如下:

    #//第5章/5.44.py
    from aip import AipFace
    import base64
    aipFace=AipFace('AppID','API Key','Secret Key')               #加载key
    with open('baid/2.png',"rb")as fp:
        base64_data=str(base64.b64encode(fp.read()),'UTF-8')               #编码
    r=aipFace.detect(base64_data,"BASE64",{"face_field":"beauty"})    #调用
    print(r["result"]["face_list"][0]['beauty'])                         #结果

运行结果如下:

    79.86
3.网络图像人脸颜值打分

对网络上的图像人脸进行“颜值”打分,代码如下:

    #//第5章/5.45.py
    from aip import AipFace
    aipFace=AipFace('AppID','API Key','Secret Key')            #加载key
    
    im="http://n1.itc.cn/img8/wb/recom/2017/04/19/149256623627782055.JPEG"
    op={"face_field":"age,beauty","max_face_num":4}
    result=aipFace.detect(im,"URL",op)                               #请求
    face_num=result['result']['face_num']
    for num in range(0,int(face_num)):
        location=result['result']['face_list'][num-1]
        beauty=location['beauty']
        age=location["age"]
        print(age,beauty)                                               #年龄、颜值

运行结果如下:

    23 70.89
    22 80.09
    16 53.57

op={"face_field":"age,beauty","max_face_num":4}中的参数"face_field":"age,beauty"表示年龄、颜值,"max_face_num":4表示1幅图像中最多检测4张人脸。

程序默认按脸的大小顺序进行打分。学完第11章OpenCV后,分值可以直接绘制到图像上。

人脸检测还有性别、人脸数量、发笑程度、戴眼镜类型、情绪、口罩等55项检测内容。

4.人脸对比

现在的化妆技术十分强大,男性能化妆成女性,就让百度AI来分辨一下吧,代码如下:

运行结果如下:

    相似度:78.56130981是同一人。

图像还可以是网上的URL链接指向的图像,还可以指定照片类型等。

5.人脸搜索

进行人脸搜索需要先向人脸库上传人脸数据,然后用程序对照片与人脸库的照片进行对比,返回结果。选择【人脸检测】→【应用列表】→【查看人脸库】→【新建组】→【新建用户】,这样就可以上传照片了。人脸搜索,代码如下:

查询结果如下:

    8
    爱因斯坦

search()函数的第1个参数data是照片数据,第2个参数ABSE64是编码类型,第3个参数是在哪个组查询,笔者此处的查询组是mr。返回查询到的人脸库编号,这里简单地对返回的7号和8号进行了判断。

分组、上传、修改、删除等功能都可以通过程序完成,而不需要登录网站。

5.13.4 文本纠错

百度自然语言分析功能有词法分析、词法分析(定制版)、中文词向量表示、词义相似度、短文本相似度、依存句法分析、中文DNN语言模型、情感倾向分析、情感倾向分析(定制版)、评论观点抽取、评论观点抽取(定制版)、对话情绪识别、文本纠错、文章分类、文章标签、新闻摘要、地址识别、智能作诗、智能对联等。

1.创建自然语言应用

依次选择【导航栏】→【机器翻译】→【创建应用】,其他步骤与创建文字识别应用的步骤类似,最后将自然语言key保存为keyyuyan.txt文件。

2.文本纠错

文本纠错功能可以提供正确示例参考,代码如下:

    #//第5章/5.48.py
    from aip import AipNlp
    client=AipNlp('AppID','API Key','Secret Key')            #加载key
    result=client.ecnet('百度是一家人工只能公斯')                    #请求
    for item in result.items():
        if item[0]=='item':
            if float(item[1]['score'])>0 and float(item[1]['score'])<1:
                 print('百度是一家人工只能公斯')                #打印原文
                 print(item[1]['correct_query'])                      #打印纠错后

运行结果如下:

    百度是一家人工只能公斯
    百度是一家人工智能公司

文本纠错的更多用法,详见10.7节。

百度的自然语言处理还有词法分析lexer()、情感倾向分析sentimentClassify()、文章分类topic()、对话情绪识别emotion()、新闻摘要newsSummary()等功能,只要把ecnet()换成相应方法即可。

5.13.5 图像增强与特效

图像增强与特效技术能对质量较低的图像进行去雾、对比度增强、无损放大等多种优化处理,重建高清图像,并提供黑白图像上色、图像风格转换、人物动漫化风格等多个图像特效API能力。

1.创建图像增强与特效应用

依次选择【导航栏】→【图像增强与特效】→【创建应用】,其他步骤与创建文字识别应用的步骤类似,最后将图像增强与特效key保存为keyimg.txt文件。

2.黑白图像上色

黑白图像上色功能可以把黑白照片处理成彩色照片,代码如下:

    #//第5章/5.49.py
    import base64
    from aip import AipImageProcess
    client=AipImageProcess('AppID','API Key','Secret Key')
    with open('baid/hb.jpg','rb')as f:
        image=f.read()                   #打开图像
    img=client.colourize(image)                        #黑白上色
    #img=client.imageQualityEnhance(image)             #无损放大
    #img=client.contrastEnhance(image)                 #对比度
    #img=client.imageDefinitionEnhance(image)          #清晰度
    imgData=base64.b64decode(img['image'])             #转码
    with open('baid/s3.jpg',mode='wb')as t:            #保存
        t.write(imgData)

图像处理结果如图5-29所示。

图5-29 图像处理

图像增强与特效应用还有很多其他功能,例如图像无损放大imageQualityEnhance()、图像去雾dehaze()、图像对比度增强contrastEnhance()、拉伸图像恢复stretchRestore()等,只要把5.49.py文件中的colourize()换成相应的方法即可。

5.14 语音与文件互转

本节介绍免费的语音技术。

1.播放声频文件

Python内置库winsound用于播放声频文件,代码如下:

    import winsound
    winsound.PlaySound('baid/record.wav',winsound.SND_FILENAME)

winsound只能播放标准格式的WAV声频文件,不能播放MP3格式的声频文件,播放更多声频格式及播放控制,详见10.10节。

2.语音播报文字

Python内置库win32com可以用语音形式播报文字内容,代码如下:

    from win32com.client import Dispatch
    speaker=Dispatch('SAPI.SpVoice')         #传入参数实例化
    speaker.Speak('100分')                          #播放语音
    del speaker                                     #释放资源
3.生成语音文件

pyttsx3库可以播报文本内容,也可以生成语音文件,安装pyttsx3库的命令如下:

    pip install pyttsx3

示例代码如下:

    #//第5章/5.50.py
    import pyttsx3 as pyttsx
    engine=pyttsx.init()                 #初始化
    engine.setProperty('rate',115)                    #设置语音播报速度
    engine.setProperty('volume',1.0)                  #设置音量0~1
    voices=engine.getProperty('voices')              #获取当前音量
    engine.setProperty('voice',voices[0].id)          #设置为女中音
    engine.say('测试结束')                            #播报文本
    engine.save_to_file('测试结束','test.mp3')        #保存为文件
    engine.runAndWait()

运行程序后先播报语音,然后生成语音文件test.mp3。

4.用话筒录音

录音需要Python的Pyaudio库和Wave库,Wave是内置库,Pyaudio是第三方库,安装命令如下:

    pip install pyaudio

代码如下:

    #//第5章/5.51.py
    import wave
    import time
    from pyaudio import PyAudio,paInt16
    def savefile(data):                #保存参数设置函数
        wf=wave.open('baid/record.wav','wb')
        wf.setnchannels(1)                         #声道
        wf.setsampwidth(2)                         #采样宽度2字节
        wf.setframerate(16000)                     #采样率
        wf.writeframes(b''.join(data))
        wf.close()
    def record():                                  #录音函数
        pa=PyAudio()                              #初始化
        stream=pa.open(format=paInt16,channels=1,rate=16000,input=True,
                   frames_per_buffer=2)           #加载参数录音
        buf=[]
        t=time.time()
        print('正在录音...')
        while time.time()<t+4:                   #4s空白,结束录音
            audiodata=stream.read(2000)           #读取2000字节
            buf.append(audiodata)
        print('录音结束.')
        savefile(buf)                              #调用保存函数
        stream.close()
    record()                                       #调用录音函数

运行程序开始录音,如果超过4s空白,则停止录音。

5.语音文件转文字

语音文件转文字有一个开源的库SpeechRecognition,首先要安装两个库,命令如下:

    pip install PocketSphinx
    pip install SpeechRecognition

然后,下载中文模型,网址为https://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/,如图5-30所示。

图5-30 SpeechRecognition官网

选择Mandarin文件夹,进入如图5-31所示的界面。

图5-31 SpeechRecognition下载

选择cmusphinx-zh-cn-5.2.tar.gz进行下载。在Python安装目录下找到Lib\site-packages\speech_recognition\pocketsphinx-data目录,进入pocketsphinx-data文件夹,并新建文件夹zh-CN,在这个文件夹内添加刚刚解压的文件,把解压出来的zh_cn.cd_cont_5000文件夹重命名为acoustic-model,将zh_cn.lm.bin重命名为language-model.lm.bin,并将zh_cn.dic重命名为pronounciation-dictionary.dict,如图5-32所示(或者直接将本章目录内zh-CN文件夹复制到pocketsphinx-data目录下)。

图5-32 重命名文件

示例代码如下:

    #//第5章/5.52.py
    import speech_recognition as sr
    r=sr.Recognizer()               #实例化对象
    with sr.AudioFile('test.mp3')as source:      #打开语音文件
        audio=r.record(source)
    print('文本内容:',r.recognize_sphinx(audio,language='zh-CN'))

运行结果如下:

    文本内容:测试结束
    进程已结束,退出代码0

SpeechRecognition库对于计算机合成的语音识别率极高,对于一般录音识别率一般,提高识别率需要搭建人工智能框架,初学者可以首先从开源项目学习,详见18.6节。

5.15 Python压缩文件和文件夹

工作中经常需要把许多文件、文件夹打包,最简单的压缩方法是直接调用Windows程序WinRAR进行压缩。

1.Path路径添加

首先要保证计算机内安装了WinRAR.exe程序,然后把安装目录加入path路径中。方法如下:在 【开始】菜单中找到WinRAR,打开它的子菜单,如图5-33所示。

右击 WinRAR,选择【更多】,选择【打开文件所在位置】,右击 WinRAR后弹出菜单,选择【更多】,选择【打开文件所在位置】,右击 WinRAR,选择【属性】,如图5-34所示。

图5-33 开始菜单

图5-34 WinRAR属性

复制【位置】内容,例如笔者此处为D:\Program Files\WinRAR,打开控制面板,搜索path,如图5-35所示。

单击【编辑账户的环境变量】按钮后,出现的界面如图5-36所示。

双击Path,如图5-37所示。

单击【新建】按钮,将WinRAR的路径粘贴到这里,然后单击【确定】按钮。

2.压缩程序所在目录的所有文件

压缩程序所在目录的所有文件,代码如下:

    import os
    os.system("WinRAR.exe a data.rar*")

system()的参数WinRAR.exe用于指定压缩程序,参数a表示指定压缩的参数,data.rar是压缩后的文件,∗表示压缩当前目录的所有文件。运行结果是将当前目录下的所有文件压缩为data.rar文件。

图5-35 控制面板

图5-36 环境变量

图5-37 编辑环境变量

3.压缩指定目录

压缩指定目录,代码如下:

    import os
    os.system("WinRAR.exe a data1.rar pic")

把pic整个目录压缩成data1.rar文件。

4.压缩多目标

压缩多目标,代码如下:

    import os
    os.system("WinRAR.exe a data.rar * pic pic2")

os.system("WinRAR.exe a data.rar∗pic pic2")命令的参数“∗”表示程序所在目录的所有文件,参数pic表示pic文件夹、参数pic2表示pic2文件夹,参数data.rar表示压缩成data.rar文件。

5.绝对路径与相对路径

绝对路径就是带盘符的完整路径,例如4.5节的“C:/Windows/Fonts/SimHei.ttf”。

相对路径就是相对于程序所在目录的路径,常用的相对路径有以下几种形式。

1)同一级

“1.txt”或“./1.txt”表示程序所在目录的1.txt文件,例如5.52.py文件中的“test.mp3”。

2)下一级

“./t/1.txt”或者“t/1.txt”表示下一级的t目录下的1.txt文件,例如5.2节的“txt/1.txt”。

3)上一级

“../t/1.txt”表示上一级的t目录下的1.txt文件。

4)上上一级

“../../t/1.txt”表示上一级目录的上一级t目录下的1.txt文件。

上例中,Python查找相对路径WinRAR.exe程序的顺序是:应用程序所在目录→Windows SYSTEM目录→Windows目录→Path环境变量指定的路径,所以我们经常把程序需要的文件复制到程序所在的目录,例如5.52.py文件中的test.mp3;很多项目会将引用的程序写入Path环境变量,例如本节的WinRAR.exe, 9.10节的sqlite3.exe。 C1BsM2mkX/J6HjT6pLrUAfMT7Kg6/SzFSJqUFiMPTWMRpL2OYLF7V7tppJRz6G9c

点击中间区域
呼出菜单
上一章
目录
下一章
×