本章介绍PPT、Excel、Word、声频、视频等各种文件的自动化处理。
PyCharm是高效的、免费的Python语言开发工具,从本章开始,使用PyCharm编写Python代码。
进入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,以便使插件生效。
用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,打开项目。
打开项目后,进入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。
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)在【项目管理】窗口右击程序的文件名,选择
运行。
txt文本文件最常用的操作方法有全文读取、列表读取、分行写入。
全文读取是一次读出全部文本内容,示例代码如下:
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()用于全文读取文本。
列表读取是把文本内容的每行作为列表的一个元素,可以索引取出,适用于记录程序配置信息,例如用户名、密码等,示例代码如下:
with open('txt/1.txt',mode='r')as t: print(t.readlines()[0])
运行结果如下:
张三
readlines()用于列表读取文本。
文本写入,常用的方式是逐行写入,也可以遍历列表循环写入,示例代码如下:
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'表示换行。
CSV文件是逗号连接的字符串存储的文本,CSV文件也是手机通讯录支持的格式。
Python写入单行文本时,把文本放入列表,列表用逗号连接成字符串写入即可,示例代码如下:
l=['张三','李四','王五'] with open('csv/1.csv',mode='w')as t: t.write(','.join(l)+'\n')
CSV文件的内容如下:
张三 李四 王五
读取单行文本,示例代码如下:
with open('csv/1.csv',mode='r')as t: l=t.read().strip('\n').split(',') print(l)
运行结果如下:
['张三','李四','王五']
与读取txt文本的方法相似,open()函数的参数mode='r'表示只读。程序读出逗号连接的字符串后先用strip('\n')去掉换行符,再用split(',')分割成列表。
多行多列数据的写入,示例代码如下:
l=[['姓名','性别'],['张三','男'],['李四','女']] with open('csv/2.csv',mode='w')as t: for i in l: t.write(','.join(i)+ '\n')
运行代码,打开保存的2.csv文件,内容如下:
姓名 性别 张三 男 李四 女
当将多行数据写入文件时,一行数据用一个列表表示,遍历循环所有列表写入。
多行多列数据的读取,示例代码如下:
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=[]中。
如果需要用计算机模拟鼠标、键盘自动操作一些重复性工作,就要用到Pyautogui库了。安装命令如下:
pip install pyautogui
图形界面常用的操作是移动光标和单击动作,例如打开网页、窗口最大化、窗口最小化等,代码如下:
#//第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 轴正方向的坐标;相对坐标是把光标当前位置看作坐标原点的坐标。
键盘操作常用的是输入内容和按下组合键,例如输入用户名、密码、全选的组合键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)命令可以查看键盘对应的键名。
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键截取屏幕,打开画图板后单击
粘贴命令,再单击
铅笔工具,移动鼠标指针,在状态栏左下角会显示铅笔工具所在位置的坐标。
Openpyxl是处理Excel文件的第三方库,安装命令如下:
pip install openpyxl
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()关闭文件。
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”的表,没有索引时建立在最后面。依次去掉注释,查看程序运行的效果。
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列。
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()
嵌套循环类似钟表的分针与秒针,分针走一格秒针走一圈,外层每取一个元素,内层就会循环全部元素。
Python-docx是处理Word文档的第三方库,安装命令如下:
pip install python-docx
Python-docx模块把一个Word文档分成了3个层级,第1层级为Document(文档),一个文件只有一个Document,一个Document有3个部件(包含文档信息sections);第2层级为Paragraph(段落),一个文件可以有多个段落;第3层级为Run(块),一个段落可以有多个Run,一个Run就是相同的格式信息的连续字符串,如一张图像、一张表、一个字都可以是一个Run。
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()函数不带参数,则表示新建文件,如果带文件名参数,则表示打开已有文档,当保存为已存在文档时会覆盖已有文档。
文本操作有添加段落和添加段内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添加文本。
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,以便让图像靠左或靠右。
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.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]表示文档的纸张设置信息。
文字、图像、表格等都有样式,样式的获取详见本章资源包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的格式。
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')
使用上述方法可以索引、修改已有文档。
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()函数用于添加图像。
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()函数保存文件时,如果文件已存在,则会覆盖原文件。
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))命令查看共有几页,再删除指定索引号的幻灯片。
用幻灯片的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'黑体'
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。
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时,尽管名字可以一样,但不能单独设置格式,如果想在程序尾部统一设置格式,则每个对象的名字不能相同。
JSON是跨平台的文件格式,以键-值对形式存储,读写灵活,访问速度快,JSON是Python的内置库,不需要安装。
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数据中的字符串必须用双引号,而不能用单引号。
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()。
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文件显示汉字。
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格式控制的方法。
Python内置库smtplib、email用于邮件发送。以QQ邮箱为例,首先要获取授权码,步骤如下:登录QQ邮箱,选择【设置】→【账户】→POP3/SMTP→【已开启】,手机发送短信后收到授权码。
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',否则会出现乱码。
发送带附件的邮件,代码如下:
本例中发送了两个附件,如果需要,则可以添加更多附件。smtplib、email还可以发送html邮件。
Pandas是专业的数据分析库,功能强大,这里仅对常用功能进行介绍,安装命令如下:
pip install pandas
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)表示只显示后两行数据。
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行为题头,也可以将其他行指定为题头。
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节内容。
从以上示例可以看出,空值不能参与运算,所以数据运算之前要对空值进行处理,代码如下:
#//第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。
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、赋值为两列之和,当然也可以赋值为其他。
用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],表示先按'数学'升序排序,再按'语文'降序排序。
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也可以实现多列筛选。
Matplotlib是专业的数据可视化工具,安装命令如下:
pip install matplotlib
下面对常见的几个绘图命令进行介绍。
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
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会按上述样式顺序赋值。
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所示。
差距越大,柱之间的距离就越大。
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%%'是饼图面积的百分比,包含两位小数。
当用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)
由于百度AI提供了很方便的接口,所以可以很容易地调用百度AI实现人工智能。进入百度AI官网后,单击右上角的【控制台】按钮进行登录,使用已有的百度账号即可,如果没有百度账号,则需要注册一个并完成实名认证。
安装百度AI库的命令如下:
pip install baidu-aip
将光标移动到控制台左上角蓝色导航按钮
上,网页会自动弹出导航栏,如图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)所示。
图像文字识别只需简单传入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()函数换成相应的函数,准确率更高、速度更快,如果不换,则用通用方法识别。
依次选择【导航栏】→【语音技术】→【创建应用】,其他步骤与创建文字识别应用的步骤类似,最后将语音key保存为keyvoice.txt文件。
文字转语音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节。
语音文件转文字,代码如下:
#//第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表示中文普通话。
依次选择【导航栏】→【人脸识别】→【创建应用】→【应用名称】,可以任意填写,例如rlsb→【去领取】→【接口类别】全选,如果之前没有完成实名认证,则无法领取,实名认证完成后刷新网页,再选择【0元领取】,其他步骤与创建文字识别应用的步骤类似,最后将人脸识别key保存为keyface.txt文件。
对计算机上的图像人物进行“颜值”打分,代码如下:
#//第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
对网络上的图像人脸进行“颜值”打分,代码如下:
#//第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项检测内容。
现在的化妆技术十分强大,男性能化妆成女性,就让百度AI来分辨一下吧,代码如下:
运行结果如下:
相似度:78.56130981是同一人。
图像还可以是网上的URL链接指向的图像,还可以指定照片类型等。
进行人脸搜索需要先向人脸库上传人脸数据,然后用程序对照片与人脸库的照片进行对比,返回结果。选择【人脸检测】→【应用列表】→【查看人脸库】→【新建组】→【新建用户】,这样就可以上传照片了。人脸搜索,代码如下:
查询结果如下:
8 爱因斯坦
search()函数的第1个参数data是照片数据,第2个参数ABSE64是编码类型,第3个参数是在哪个组查询,笔者此处的查询组是mr。返回查询到的人脸库编号,这里简单地对返回的7号和8号进行了判断。
分组、上传、修改、删除等功能都可以通过程序完成,而不需要登录网站。
百度自然语言分析功能有词法分析、词法分析(定制版)、中文词向量表示、词义相似度、短文本相似度、依存句法分析、中文DNN语言模型、情感倾向分析、情感倾向分析(定制版)、评论观点抽取、评论观点抽取(定制版)、对话情绪识别、文本纠错、文章分类、文章标签、新闻摘要、地址识别、智能作诗、智能对联等。
依次选择【导航栏】→【机器翻译】→【创建应用】,其他步骤与创建文字识别应用的步骤类似,最后将自然语言key保存为keyyuyan.txt文件。
文本纠错功能可以提供正确示例参考,代码如下:
#//第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()换成相应方法即可。
图像增强与特效技术能对质量较低的图像进行去雾、对比度增强、无损放大等多种优化处理,重建高清图像,并提供黑白图像上色、图像风格转换、人物动漫化风格等多个图像特效API能力。
依次选择【导航栏】→【图像增强与特效】→【创建应用】,其他步骤与创建文字识别应用的步骤类似,最后将图像增强与特效key保存为keyimg.txt文件。
黑白图像上色功能可以把黑白照片处理成彩色照片,代码如下:
#//第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()换成相应的方法即可。
本节介绍免费的语音技术。
Python内置库winsound用于播放声频文件,代码如下:
import winsound winsound.PlaySound('baid/record.wav',winsound.SND_FILENAME)
winsound只能播放标准格式的WAV声频文件,不能播放MP3格式的声频文件,播放更多声频格式及播放控制,详见10.10节。
Python内置库win32com可以用语音形式播报文字内容,代码如下:
from win32com.client import Dispatch speaker=Dispatch('SAPI.SpVoice') #传入参数实例化 speaker.Speak('100分') #播放语音 del speaker #释放资源
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。
录音需要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空白,则停止录音。
语音文件转文字有一个开源的库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节。
工作中经常需要把许多文件、文件夹打包,最简单的压缩方法是直接调用Windows程序WinRAR进行压缩。
首先要保证计算机内安装了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的路径粘贴到这里,然后单击【确定】按钮。
压缩程序所在目录的所有文件,代码如下:
import os os.system("WinRAR.exe a data.rar*")
system()的参数WinRAR.exe用于指定压缩程序,参数a表示指定压缩的参数,data.rar是压缩后的文件,∗表示压缩当前目录的所有文件。运行结果是将当前目录下的所有文件压缩为data.rar文件。
图5-35 控制面板
图5-36 环境变量
图5-37 编辑环境变量
压缩指定目录,代码如下:
import os os.system("WinRAR.exe a data1.rar pic")
把pic整个目录压缩成data1.rar文件。
压缩多目标,代码如下:
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文件。
绝对路径就是带盘符的完整路径,例如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。