前言
不管是线下办公,还是居家办公,摸鱼必不可少(当然不提倡摸鱼),可是摸鱼归摸鱼,工作总得完成,KPI得好看,才能走向人生巅峰。不然月月3.25,年年得吃土,你有多痛苦,老板不清楚,让你加入毕业队伍,你只会大骂人心不古。押韵吧,KPI要好看,活得干的好,干的有效率,平时还想摸摸鱼,那摸鱼神器不得备一套,额。。。不,是高效办公神器必须得攒一套。这不,自动化办公的神器双手奉上,废话不多说,上才艺。
说到办公,每天都少不了要和各种文档打交道,csv,excel,word,ppt,pdf甚至txt文本文件,需要对这些文档做各种操作,有很多还是比较机械化的重复工作,枯燥且无味,花时间勉强能够处理,就是有点废手,特别是作为开发人员,有时候需要给大量数据做分析,要对excel表格和csv中数据整理操作必不可少。所以,作为爱动手的程序猿怎么能放过炫技的时刻呢。能用代码批量解决的绝不操作两次,神器在手,天下我有,代码一粘,两手一摊,一劳永逸。
多亏找到了这些神器,最近可被各种文档表格,各种数据搞疯了,脑瓜子嗡嗡的。在这上面还闹过一些小乌龙,为了相互转各种文档还当冤大头买了wps的超级会员我知道java写点代码能搞,但是太费时间,还不太理想,没想到python有些就几行代码的事。之前领导丢给我十几个excel让我合到一起,几行代码的事我硬是手工搞了半天。有一次让我根据他发给我的一堆PDF准备PPT,又搞了一天,因为word文档发给客户排版会变,让我转成PDF,为了这些事真是没辙,开了WPS的会员。流下了没技术的眼泪,心疼我白花花的银子。自从使用过python的神器之后,犹如哥伦布发现新大陆,都是几行代码的事,多的也就大概100行左右。就这。。
说了半天,下面接着进入期待已久的实操阶段,毕竟实践才是检验真理的唯一标准,有请最简单易上手的且对新手友好的python选手出战,Python在自动化方面有极大优势,其实
不管大数据分析,人工智能,自动办公……都不在话下,特别能打
环境准备
工欲善其事必先利其器,不管任何编程语言在开发之前,必须搭建好支撑代码运行的环境以及开发环境,运行环境是程序跑起来的基础,相当于一个翻译,所以没有环境的支撑,相当于语言不通,只能是鸡同鸭讲。这里推荐安装Anaconda,Anaconda是包管理器和环境管理器,是一个集成的环境,Anaconda已经自带安装好了Python,不需要你再安装Python,大大降低安装的难度,而且还自带了Jupyter Notebook代码编辑器,安装了Anaconda基本无需再安装其他工具就可以愉快地开发起来
不过还是建议安装pyCharm代码编辑器进行开发,而且这篇文章代码的编写也是基于pycharm
工具
Anaconda https://anaconda.en.softonic.com/
pyCharm https://www.jetbrains.com/pycharm/download/#section=windows
这里不再赘述两者的安装步骤,可参考官网或网上者其他教程。
安装第三方库的命令
pip install
xxx
、pip3 install
xxx
或者conda install xxx
1.PPT-能造一切的神器
ppt可谓是家喻户晓,不管各行各业都能用得上,会议必备,有一些公司的成功,完全就是因为ppt做得好,真的是只有你想不到,比如PPT造车,不仅如此,听说秀得好,还能用ppt做游戏,但是像我不想做ppt,对PPT一脸抗拒的人,只想应付了事,会议上简单展示即可,我宁愿写代码,所以我在想,能不能这段代码,生成PPT,一劳永逸,经过努力寻找,发现还真有这神奇的东西,上菜:
PPT自动化能干什么?有什么优势?
- 它可以代替你自动制作PPT
- 它可以减少你调整用于调整PPT格式的时间
- 它可以让数据报告风格一致
- 总之就是:它能提高你的工作效率!让你有更多时间去做其他事情!
a.pdf转ppt
这是快速制作会议PPT神技之一,值得收藏
# -*- coding: utf-8 -*-frompptximportPresentationfrompdf2imageimportconvert_from_path, convert_from_bytesfrompdf2image.exceptionsimport ( PDFInfoNotInstalledError, PDFPageCountError, PDFSyntaxError) fromsysimportargvfromPILimportImagefrompptx.enum.shapesimportMSO_SHAPEfrompptx.utilimportInches, Ptfrompptx.dml.colorimportRGBColorfrompathlibimportPathfff=argv[1] pp=Path.cwd() fn=fff+'.pdf'filename=pp/fnprint("Creating %s"%fff) prs=Presentation() width,height=argv[3].split('x') prs.slide_width=Inches(16) prs.slide_height=Inches(10) pages=convert_from_path(filename,dpi=int(argv[2]), size=(int(width)*100,int(height)*100)) jpgs=pp/'jpgs'ifnotjpgs.exists(): jpgs.mkdir() forindex, pageinenumerate(pages): name=fff+"-(%d).png"%indexjpg_file=jpgs/name# print(jpg_file)page.save(jpg_file, 'PNG') image=Image.open(jpg_file) height=image.heightwidth=image.width#ifheight>width: adjusted=image.rotate(270, expand=True) adjusted.save(jpg_file) ##title_slide_layout=prs.slide_layouts[6] slide=prs.slides.add_slide(title_slide_layout) left=top=0jpg_file=str(jpg_file) print(jpg_file) slide.shapes.add_picture(jpg_file, left,top,height=prs.slide_height) pptname='%s.pptx'%fffprs.save(pp/pptname) print("Saved")
pdf转图片,上面的代码的原理是先把PDF每一页转化为图片,然后写入PPT中
importosimportsysimportfitzfromreportlab.lib.pagesizesimportportraitfromreportlab.pdfgenimportcanvasfromPILimportImagedefpdf2img(filename=r'./pw.pdf'): # 打开PDF文件,生成一个对象doc=fitz.open(filename) print("共",doc.pageCount,"页") forpginrange(doc.pageCount): print("\r转换为图片",pg+1,"/",doc.pageCount,end="") page=doc[pg] rotate=int(0) # 每个尺寸的缩放系数为8,这将为我们生成分辨率提高64倍的图像。zoom_x=8.0zoom_y=8.0trans=fitz.Matrix(zoom_x, zoom_y).preRotate(rotate) pm=page.getPixmap(matrix=trans, alpha=False) pm.writePNG(r'./tu'+'{:02}.png' .format(pg)) print()
b.ppt转pdf
其实这里包含了合并多张图片到pdf文档中
importcomtypes.clientimportosdefinit_powerpoint(): powerpoint=comtypes.client.CreateObject("Powerpoint.Application") powerpoint.Visible=1returnpowerpointdefppt_to_pdf(powerpoint, inputFileName, outputFileName, formatType=32): ifoutputFileName[-3:] !='pdf': outputFileName=outputFileName[0:-4] +".pdf"deck=powerpoint.Presentations.Open(inputFileName) deck.SaveAs(outputFileName, formatType) # formatType = 32 for ppt to pdfdeck.SaveAs(inputFileName.rsplit('.')[0] +'.jpg', 17) deck.Close() defconvert_files_in_folder(powerpoint, folder): files=os.listdir(folder) pptfiles= [fforfinfilesiff.endswith((".ppt", ".pptx"))] forpptfileinpptfiles: fullpath=os.path.join(cwd, pptfile) ppt_to_pdf(powerpoint, fullpath, fullpath) if__name__=="__main__": powerpoint=init_powerpoint() cwd=os.getcwd() convert_files_in_folder(powerpoint, cwd) powerpoint.Quit()
运行之后,会循环所有的PPT文件,进行转化,如下图,PPT一共3页,转出3张图片,然年写入pdf
这是转化后的pdf:
c.word转ppt
有时候我们只拿到一些文字表述或者别人整理的word文档资料,这时候我们可以使用word转PPT的功能快速制作会议需要的PPT
word转ppt的原理是先把word转PDF然后把PDF转PPT,第一节(PPT-能打造一切的神器)和第二节(PDF与Word-办公文档常客)结合即可以实现.而且为控制文章篇幅这里不再重复展示代码.
d.ppt转word
会议之后,我们拿到别人分享的PPT,觉得很多很好的地方想写成一篇word,整理成自己会议心得以及归档,这时候这个功能就能起到很好的辅助作用
方法1.ppt转word的原理是先把PPT转PDF然后把PDF转word,第一节(PPT-能打造一切的神器)和第二节(PDF与Word-办公文档常客)结合即可以实现.而且为控制文章篇幅这里不再重复展示代码.
方法2
pip install python-pptx
pip install python-docx
代码如下:
frompptximportPresentationfromdocximportDocumentwordfile=Document() # 给定ppt文件所在的路径filepath=r'**.pptx'pptx=Presentation(filepath) # 遍历ppt文件的所有幻灯片页forslideinpptx.slides: # 遍历幻灯片页的所有形状forshapeinslide.shapes: # 判断形状是否含有文本框,如果含有则顺序运行代码ifshape.has_text_frame: # 获取文本框text_frame=shape.text_frame# 遍历文本框中的所有段落forparagraphintext_frame.paragraphs: # 将文本框中的段落文字写入word中wordfile.add_paragraph(paragraph.text) ifshape.has_table: # 获取表格myTable=shape.tableforrowinmyTable.rows: foriinrange(0, len(myTable.columns)): tx=row.cells[i].text_frame.text.strip() # 将文本框中的段落文字写入word中wordfile.add_paragraph(tx) save_path=r'***.docx'wordfile.save(save_path)
e.使用win32com操作ppt
安装pypiwin32
pip3 install pypiwin32
win32com复制ppt模板
有时候我们需要对ppt的模板进行复制,然后再添加相应内容,由于python-pptx对复制模板也没有很好的支持,所以我们用win32com对模板页进行复制,然后再用python-pptx增加ppt内容。
参考文档:https://docs.microsoft.com/zh-cn/office/vba/api/powerpoint.slide.copy
先准备好一张模板ppt
importwin32comfromwin32com.clientimportDispatchimportosppt=Dispatch('PowerPoint.Application') # 或者使用下面的方法,使用启动独立的进程:# ppt = DispatchEx('PowerPoint.Application')# 如果不声明以下属性,运行的时候会显示的打开wordppt.Visible=1# 后台运行ppt.DisplayAlerts=0# 不显示,不警告# 创建新的PowerPoint文档# pptSel = ppt.Presentations.Add() # 打开一个已有的PowerPoint文档pptSel=ppt.Presentations.Open(os.getcwd() +"\\"+"wamp开发环境的安装.pptx") # 复制模板页pptSel.Slides(1).Copy() #设置需要复制的模板页数pageNums=10# 粘贴模板页foriinrange(pageNums): pptSel.Slides.Paste() # pptSel.Save() # 保存pptSel.SaveAs(os.getcwd() +"\\"+"wamp开发环境的安装copy.pptx") # 另存为pptSel.Close() # 关闭 PowerPoint 文档ppt.Quit() # 关闭 office
效果图
python-pptx 创建PPT、编辑页面
安装pptx
pip install python-pptx
新建页面
frompptximportPresentation# 新建pptppt=Presentation() # 新建页面slide=ppt.slides.add_slide(ppt.slide_layouts[0]) # 保存pptppt.save('测试ppt.pptx')
效果图
编辑页面
frompptximportPresentationfrompptx.utilimportPt, Cm# 打开已存在pptppt=Presentation('测试ppt.pptx') # 设置添加到当前ppt哪一页n_page=0singleLineContent="我是单行内容"multiLineContent= \ """我是多行内容1 我是多行内容2 我是多行内容3 """# 获取需要添加文字的页面对象slide=ppt.slides[n_page] # 添加单行内容# 设置添加文字框的位置以及大小left, top, width, height=Cm(16.9), Cm(1), Cm(12), Cm(1.2) # 添加文字段落new_paragraph1=slide.shapes.add_textbox(left=left, top=top, width=width, height=height).text_frame# 设置段落内容new_paragraph1.paragraphs[0].text=singleLineContent# 设置文字大小new_paragraph1.paragraphs[0].font.size=Pt(15) # 添加多行# 设置添加文字框的位置以及大小left, top, width, height=Cm(16.9), Cm(3), Cm(12), Cm(3.6) # 添加文字段落new_paragraph2=slide.shapes.add_textbox(left=left, top=top, width=width, height=height).text_frame# 设置段落内容new_paragraph2.paragraphs[0].text=multiLineContent# 设置文字大小new_paragraph2.paragraphs[0].font.size=Pt(15) # 保存pptppt.save('添加文字.pptx')
效果图
这里仅仅是抛砖引玉,还有更多关于PPT的高级操作等你发现!
2.PDF与Word-办公文档常客
不管任何岗位几乎都会接触到这两种文档,特别是行政类岗位和管理类岗位,平时发布公告消息或者文档手册都会使用到。pdf和word文档之间的转换也是我们最常用到的操作,而且PDF相对于word来说,打印的布局更稳定,且不易变形,但是word的优点在于可自由编辑,接下来我们来了解他们之间的转换以及其他办公场景的应用
a.PDF转word
由于PDF不方便修改,所以当我们需要增加或者修改文档内容时,就需要把PDF转换为word进行修改,使用wps转换功能需要开通会员才可以转换多页。这时候Python这个转换功能就能派上用场。
代码如下:
使用到的模块:pdf2docx
将某个目录下的全部pdf转化成word
importosfrompdf2docximportConverterdefpdf_docx(): # 获取当前工作目录file_path=os.getcwd() # 遍历所有文件forfileinos.listdir(file_path): # 获取文件后缀suff_name=os.path.splitext(file)[1] # 过滤非pdf格式文件ifsuff_name!='.pdf': continue# 获取文件名称file_name=os.path.splitext(file)[0] # pdf文件名称pdf_name=os.getcwd() +'\\'+file# 要转换的docx文件名称docx_name=os.getcwd() +'\\'+file_name+'.docx'# 加载pdf文档cv=Converter(pdf_name) cv.convert(docx_name) cv.close() if__name__=='__main__': pdf_docx()
b.word转PDF
很多时候因为我们需要把自己整理的文档资料进行分享,但是word文档可能会因为版本的不同以及平台或者环境的不同导致文档排版错乱,变形,这时候就需要转为PDF再分享,
转化代码如下:
使用到的模块:docx2pdf
将某个目录下的全部word转化成pdf
fromdocx2pdfimportconvertimportosdirector=r'E:\prokect\AI\word'FileList=map(lambdax:director+'\\'+x, os.listdir(director)) forfileinFileList: convert(file,f"{file.split('.')[0]}.pdf")
c.提取PDF文字
当我们需要对PDF文件上的文字进行复用时,由于PDF不方便编辑,而如果PDF又有很多页的时候,直接使用Python对PDF进行文字提取,解放双手,一劳永逸
importPyPDF2pdfFile=open('example.pdf','rb') pdfReader=PyPDF2.PdfFileReader(pdfFile) print(pdfReader.numPages) page=pdfReader.getPage(0) print(page.extractText()) pdfFile.close()
还可以把提取到文字存入txt
importpdfplumberwithpdfplumber.open("example.pdf") asp: foriinrange(75): page=p.pages[i] textdata=page.extract_text() #print(textdata)data=open("text.text", "a") data.write(textdata)
d.提取PDF表格
当我们拿到的数据都存放在PDF的表格上,我们需要对数据做分析,就可以使用pdfplumber提取PDF上的表格数据
importpdfplumberwithpdfplumber.open("example.pdf") aspdf: page01=pdf.pages[0] #指定页码table1=page01.extract_table()#提取单个表格# table2 = page01.extract_tables()#提取多个表格print(table1)
我们还可以把提取到的表格数据存入Excel
importpdfplumberfromopenpyxlimportWorkbookwithpdfplumber.open("example.pdf") asp: workbook=Workbook() #新建空白Excel工作簿sheet=workbook.active#激活sheetforiinrange(68,75): #遍历69页-75页page=p.pages[i] table=page.extract_table() #提取表格数据#print(table)forrowintable: #遍历所有行#print(row)sheet.append(row) #按行追加写入数据workbook.save("Excel.xlsx") #保存文件,命名为Exceli+=1print("第%d页PDF提取完成"%i) #提示提取进度
e.提取Word文字
可以通过提取word的文字进行重新整理,然后通过其他自动化操作加工利用,比如通过word生成PPT,取word的文字和数据整理到Excel归档
fromdocximportDocumentdoc=Document(r"E:\python办公自动化\getword\test.docx") print(doc.paragraphs) forparagraphindoc.paragraphs: print(paragraph.text)
f.Python生成合同
在我们经济交往中,有时会涉及到销售合同的批量制作。比如我们需要根据如下合同数据(Excel),进行批量生成销售合同(Word)。
安装相关库
pip install openpyxl
pip install docxtpl
读取合同数据
我们可以通过load_workbook方法打开合同数据(Excel表),然后读取每一个合同数据并存入到data字典,再将每个字典放入到列表datas中。PS:由于读取的签约日期是一个时间戳,需要通过strftime方法转为标准的年月日格式
fromdocxtplimportDocxTemplatefromopenpyxlimportload_workbookwb=load_workbook("数据.xlsx") ws=wb['Sheet1'] datas= [] forrowinrange(2, ws.max_row): name1=ws[f"A{row}"].valuename2=ws[f"B{row}"].valueprice=ws[f"C{row}"].valueproduct=ws[f"D{row}"].valuecount=ws[f"E{row}"].valuedeadline=ws[f"F{row}"].valuetime=ws[f"G{row}"].valuetime=time.strftime("%Y-%m-%d") data= {"甲方": name1, "乙方": name2, "合同价款": price, "产品名称": product, "产品数量": count, "付款期限": deadline, "签约时间": time} datas.append(data) datas
批量生成合同
fordataindatas: tpl=DocxTemplate('销售合同.docx') tpl.render(data) tpl.save(f'合同生成/{data["甲方"]}的销售合同{data["签约时间"]}.docx') print(f'{data["甲方"]}的销售合同已生成')
效果图如下:
3.Excel-数据分析/数据收集神器
相对于其他办公工具,excel更加常用且更加重要。他是财会人员或者数据分析师手上分析的神兵利器。管理层可以通过Excel上的数据已经可视化图表,了解到整个企业的运营情况,从而制定公司下一步发展策略,不但是汇报工作的必备神器还是公司开疆扩土的利剑
a.Python处理Excel数据
可以使用pandas、xlwings、openpyxl等包来对Excel进行增删改查、格式调整等操作,甚至可以使用Python函数来对excel数据进行分析
importxlwingsasxwwb=xw.Book() # this will create a new workbookwb=xw.Book('FileName.xlsx') # connect to a file that is open or in the current working directorywb=xw.Book(r'C:\path\to\file.xlsx') # on Windows: use raw strings to escape backslashes
表格将matplotlib绘制excel
importmatplotlib.pyplotaspltimportxlwingsasxwfig=plt.figure() plt.plot([1, 2, 3]) sheet=xw.Book().sheets[0] sheet.pictures.add(fig, name='MyPlot', update=True)
b.合并Excel
批量合并现在是我最常用的功能,特别是做数据分析的时候,数据一般存储在一个或者多个excel表格中
# -*- coding: utf-8 -*-importosimportpandasaspdimportnumpyasnpdir="E:\\prokect\\AI\\office\\data"#设置工作路径#新建列表,存放文件名(可以忽略,但是为了做的过程能心里有数,先放上)filename_excel= [] #新建列表,存放每个文件数据框(每一个excel读取后存放在数据框)frames= [] forroot, dirs, filesinos.walk(dir): forfileinfiles: #print(os.path.join(root,file))filename_excel.append(os.path.join(root,file)) df=pd.read_excel(os.path.join(root,file)) #excel转换成DataFrameframes.append(df) #打印文件名print(filename_excel) #合并所有数据result=pd.concat(frames) #查看合并后的数据result.head() result.shaperesult.to_csv('E:\\prokect\\AI\\office\\data\\outmer.csv',sep=',',index=False)#保存合并的数据到电脑D盘的merge文件夹中,并把合并后的文件命名为outmer.csv
合并效果图:
4.python自动控制
对鼠标的自动控制,执行一些流水线的工作,解放双手.比如软件测试。
Python的pyautogui库可以任意地去控制你的鼠标。
鼠标左击/右击/控制左键以及测试脚本
# 获取鼠标位置importpyautoguiaspgtry: whileTrue: x, y=pg.position() print(str(x) +" "+str(y)) #输出鼠标位置if1746<x<1800and2<y<33: pg.click()#左键单击if1200<x<1270and600<y<620: pg.click(button='right')#右键单击if1646<x<1700and2<y<33: pg.doubleClick()#左键双击exceptKeyboardInterrupt: print("\n")
Python也可以通过pyautogui控制键盘。
写键盘
import pyautogui #typewrite()无法输入中文内容,中英文混合的只能输入英文 #interval设置文本输入速度,默认值为0 pyautogui.typewrite('你好,world!',interval=0.5)
5.python文字提取
别人分享的资料或者自己找到的资料可能是截图或者是张图片,你觉得内容很好,想借鉴一下,但是又不太想打字,就可以使用Python提取文字,特别是当你有多张图片的时候可以批量快速提取然后保存到Excel或者txt,以便使用.
使用Tesseract-OCR简单图片识别
安装所需的库
pip3 install pytesseract pip3 install pillow
具体代码如下:
importpytesseractfromPILimportImage#如果报错可能是没把tesseract设置到环境变量中,可以设置系统环境变量或者添加如下代码:在代码中指定识别程序pytesseract.pytesseract.tesseract_cmd='E:/Program Files/Tesseract-OCR/tesseract.exe'tessdata_dir_config='--tessdata-dir "E:/Program Files/Tesseract-OCR/tessdata"'image=Image.open("my.png") result=pytesseract.image_to_string(image, config=tessdata_dir_config) print(result)#打印识别的图片内容
批量识别图片(以识别证件为例)
批量文字识别(OCR)是
Python
办公自动化的基本操作,应用在我们工作生活中的方方面面,比如车牌识别、证件识别、银行卡识别、票据识别等等。Python中
OCR
第三方库非常多,比如easyocr
、PaddleOCR
、cnocr
等等。当然,直接调用百度API
也是可以的,不过超过一定限额后要收费,因此本文主要以开源免费的easyocr
来进行介绍。
运用easyocr
进行识别并保存为Excel
,效果如下:(详细代码)
安装easyocr
pip install easyocr
1.easyocr
识别图片代码非常简洁,只需要创建一个easyocr.Reader
类对象,指定以下两个常用参数:
- 需要识别的文字属于哪几种语言
- 是否启用GPU显卡加速
2.调用Reader
对象的readtext
方法,将图片中所有文字读入一个列表并返回。
代码如下:
importeasyocrimportos# 指明所有图片所在的文件夹images='./id_card'# 创建ocr的reader对象,识别中英文ocr=easyocr.Reader(['ch_sim', 'en']) # 识别图片文字content=ocr.readtext(images,detail=0) # 遍历所有图片并识别文字,切片提取有效信息data= [] forimageinos.listdir(images): content=ocr.readtext(f'{images}/{image}', detail=0) print(f"正在识别:{image}") name=content[0][4:] gender=content[1][-1] nation=content[2][-1] birth=content[-5] if"月"notinbirth: birth=content[-6] +"月"+content[-5] if"日"notinbirth: birth=birth[:-1] +"日"address=content[-4][4:] +content[-3] number=content[-1] print(f"完成识别:{image}") print("-"*50) data.append([name, gender, nation, birth, address, number])
图片文字识别之后,建议通过pandas
输出为Excel
,方便简洁。
#保存数据到Excelimportpandasaspd# 保存识别结果至Exceldf=pd.DataFrame(data, columns=["姓名", "性别", "民族", "出生", "住址", "身份证号"]) print(f"识别结果如下:") print(df) df.to_excel("识别结果.xlsx", index=False)
还有更简单的方式,使用百度的文字识别接口
importrequestsimportbase64defocr(img_path: str) ->list: ''' 根据图片路径,将图片转为文字,返回识别到的字符串列表 '''# 请求头headers= { 'Host': 'cloud.baidu.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.76', 'Accept': '*/*', 'Origin': 'https://cloud.baidu.com', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Dest': 'empty', 'Referer': 'https://cloud.baidu.com/product/ocr/general', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', } # 打开图片并对其使用 base64 编码withopen(img_path, 'rb') asf: img=base64.b64encode(f.read()) data= { 'image': 'data:image/jpeg;base64,'+str(img)[2:-1], 'image_url': '', 'type': 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic', 'detect_direction': 'false' } # 开始调用 ocr 的 apiresponse=requests.post( 'https://cloud.baidu.com/aidemo', headers=headers, data=data) # 设置一个空的列表,后面用来存储识别到的字符串ocr_text= [] result=response.json()['data'] ifnotresult.get('words_result'): return [] # 将识别的字符串添加到列表里面forrinresult['words_result']: text=r['words'].strip() ocr_text.append(text) # 返回字符串列表returnocr_text'''img_path 里面填图片路径,这里分两种情况讨论:第一种:假设你的代码跟图片是在同一个文件夹,那么只需要填文件名,例如 test1.jpg (test1.jpg 是图片文件名)第二种:假设你的图片全路径是 D:/img/test1.jpg ,那么你需要填 D:/img/test1.jpg'''img_path='test1.jpg'# content 是识别后得到的结果content="".join(ocr(img_path)) # 输出结果print(content)
6.提取word/PDF的图片
有时候我们需要用到的图片是存在word或者PDF中,手动一张张另存太费事了,批量保存图片你值得拥有
提取word图片
代码如下:
importzipfileimportosimportshutildefword2pic(path, zip_path, tmp_path, store_path): ''' :param path:源文件 :param zip_path:docx重命名为zip :param tmp_path:中转图片文件夹 :param store_path:最后保存结果的文件夹(需要手动创建) :return: '''# 将docx文件重命名为zip文件os.rename(path, zip_path) # 进行解压f=zipfile.ZipFile(zip_path, 'r') # 将图片提取并保存forfileinf.namelist(): f.extract(file, tmp_path) # 释放该zip文件f.close() # 将docx文件从zip还原为docxos.rename(zip_path, path) # 得到缓存文件夹中图片列表pic=os.listdir(os.path.join(tmp_path, 'word/media')) # 将图片复制到最终的文件夹中foriinpic: # 根据word的路径生成图片的名称new_name=path.replace('\\', '_') new_name=new_name.replace(':', '') +'_'+ishutil.copy(os.path.join(tmp_path+'/word/media', i), os.path.join(store_path, new_name)) # 删除缓冲文件夹中的文件,用以存储下一次的文件foriinos.listdir(tmp_path): # 如果是文件夹则删除ifos.path.isdir(os.path.join(tmp_path, i)): shutil.rmtree(os.path.join(tmp_path, i)) if__name__=='__main__': # 源文件path=r'E:\word2pdf\提取图片\log.docx'# docx重命名为zipzip_path=r'E:\word2pdf\提取图片\log.zip'# 中转图片文件夹tmp_path=r'E:\word2pdf\提取图片\tmp'# 最后保存结果的文件夹store_path=r'E:\word2pdf\提取图片\测试'm=word2pic(path, zip_path, tmp_path, store_path)
提取PDF图片
代码如下:
#安装pip install pymupdfimportfitzimporttimeimportreimportosdefpdf2pic(path, pic_path): ''' # 从pdf中提取图片 :param path: pdf的路径 :param pic_path: 图片保存的路径 :return: '''t0=time.clock() # 使用正则表达式来查找图片checkXO=r"/Type(?= */XObject)"checkIM=r"/Subtype(?= */Image)"# 打开pdfdoc=fitz.open(path) # 图片计数imgcount=0lenXREF=doc._getXrefLength() # 打印PDF的信息print("文件名:{}, 页数: {}, 对象: {}".format(path, len(doc), lenXREF-1)) # 遍历每一个对象foriinrange(1, lenXREF): # 定义对象字符串text=doc.getObjectString(i) isXObject=re.search(checkXO, text) # 使用正则表达式查看是否是图片isImage=re.search(checkIM, text) # 如果不是对象也不是图片,则continueifnotisXObjectornotisImage: continueimgcount+=1# 根据索引生成图像pix=fitz.Pixmap(doc, i) # 根据pdf的路径生成图片的名称new_name=path.replace('\\', '_') +"_img{}.png".format(imgcount) new_name=new_name.replace(':', '') # 如果pix.n<5,可以直接存为PNGifpix.n<5: pix.writePNG(os.path.join(pic_path, new_name)) # 否则先转换CMYKelse: pix0=fitz.Pixmap(fitz.csRGB, pix) pix0.writePNG(os.path.join(pic_path, new_name)) pix0=None# 释放资源pix=Nonet1=time.clock() print("运行时间:{}s".format(t1-t0)) print("提取了{}张图片".format(imgcount)) if__name__=='__main__': # pdf路径path=r'E:\word2pdf\提取图片\课件.pdf'pic_path=r'E:\word2pdf\提取图片\测试'# 创建保存图片的文件夹ifos.path.exists(pic_path): print("文件夹已存在,请重新创建新文件夹!") raiseSystemExitelse: os.mkdir(pic_path) m=pdf2pic(path, pic_path)
7.Python生成图文并茂的PDF报告
reportlab简直是工作报告神器,写完代码一劳永逸,毕竟我是宁愿写代码也不愿做文档的人,而且代码是可以复用的~
reportlab是Python的一个标准库,可以画图、画表格、编辑文字,最后可以输出PDF格式。它的逻辑和编辑一个word文档或者PPT很像。有两种方法:
1)建立一个空白文档,然后在上面写文字、画图等;
2)建立一个空白list,以填充表格的形式插入各种文本框、图片等,最后生成PDF文档。
因为需要产生一份给用户看的报告,里面需要插入图片、表格等,所以采用的是第二种方法。
安装第三方库
reportlab输入Python的第三方库,使用前需要先安装:pip install reportlab
提前导入相关内容,并且注册字体。(注册字体前需要先准备好字体文件)
fromreportlab.pdfbaseimportpdfmetrics# 注册字体fromreportlab.pdfbase.ttfontsimportTTFont# 字体类fromreportlab.platypusimportTable, SimpleDocTemplate, Paragraph, Image# 报告内容相关类fromreportlab.lib.pagesizesimportletter# 页面的标志尺寸(8.5*inch, 11*inch)fromreportlab.lib.stylesimportgetSampleStyleSheet# 文本样式fromreportlab.libimportcolors# 颜色模块fromreportlab.graphics.charts.barchartsimportVerticalBarChart# 图表类fromreportlab.graphics.charts.legendsimportLegend# 图例类fromreportlab.graphics.shapesimportDrawing# 绘图工具fromreportlab.lib.unitsimportcm# 单位:cm# 注册字体(提前准备好字体文件, 如果同一个文件需要多种字体可以注册多个)pdfmetrics.registerFont(TTFont('SimSun', 'SimSun.ttf'))
这里就不贴代码了.这个链接写的很详细(生成图文并茂的PDF报告代码)
效果图:
8.Python处理邮件
在 Python 中可以使用 smtplib 配合电子邮件库,来实现邮件的自动化传输,非常方便。
importsmtplibimportemail# 负责将多个对象集合起来fromemail.mime.multipartimportMIMEMultipartfromemail.headerimportHeader# SMTP服务器,这里使用163邮箱mail_host="smtp.163.com"# 发件人邮箱mail_sender="******@163.com"# 邮箱授权码,注意这里不是邮箱密码,如何获取邮箱授权码,请看本文最后教程mail_license="********"# 收件人邮箱,可以为多个收件人mail_receivers= ["******@qq.com","******@outlook.com"] mm=MIMEMultipart('related') # 邮件正文内容body_content="""你好,这是一个测试邮件!"""# 构造文本,参数1:正文内容,参数2:文本格式,参数3:编码方式message_text=MIMEText(body_content,"plain","utf-8") # 向MIMEMultipart对象中添加文本对象mm.attach(message_text) # 创建SMTP对象stp=smtplib.SMTP() # 设置发件人邮箱的域名和端口,端口地址为25stp.connect(mail_host, 25) # set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息stp.set_debuglevel(1) # 登录邮箱,传递参数1:邮箱地址,参数2:邮箱授权码stp.login(mail_sender,mail_license) # 发送邮件,传递参数1:发件人邮箱地址,参数2:收件人邮箱地址,参数3:把邮件内容格式改为strstp.sendmail(mail_sender, mail_receivers, mm.as_string()) print("邮件发送成功") # 关闭SMTP对象stp.quit()
9.Python处理文件
处理文件一直是个脏活累活,而且特别机械,枯燥,Python可以帮你脱离苦海。Python中有很多文件,sys、os、shutil、glob、path.py等等。
修改文件后缀名
日常工作中,除了查找文件就是修改文件后缀了,批量操作一劳永逸
importosdeffile_rename(): path=input("请输入你需要修改的目录(格式如'E:\\test'):") old_suffix=input('请输入你需要修改的后缀(需要加点.):') new_suffix=input('请输入你要改成的后缀(需要加点.):') file_list=os.listdir(path) forfileinfile_list: old_dir=os.path.join(path, file) print('当前文件:', file) ifos.path.isdir(old_dir): continueifold_suffix!=os.path.splitext(file)[1]: continuefilename=os.path.splitext(file)[0] new_dir=os.path.join(path, filename+new_suffix) os.rename(old_dir, new_dir) if__name__=='__main__': file_rename()
10.生成统计图表
在Python中处理图像的包有scikit Image、PIL、OpenCV等,处理图表的包有matplotlib、plotly、seaborn等。数据可视化让数据更加直观,更容易通过数据做出正确的决策
importnumpyasnpimportmatplotlib.pyplotaspltN=5menMeans= (20, 35, 30, 35, 27) womenMeans= (25, 32, 34, 20, 25) menStd= (2, 3, 4, 1, 2) womenStd= (3, 5, 2, 3, 3) ind=np.arange(N) # the x locations for the groupswidth=0.35# the width of the bars: can also be len(x) sequencep1=plt.bar(ind, menMeans, width, yerr=menStd) p2=plt.bar(ind, womenMeans, width, bottom=menMeans, yerr=womenStd) plt.ylabel('Scores') plt.title('Scores by group and gender') plt.xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5')) plt.yticks(np.arange(0, 81, 10)) plt.legend((p1[0], p2[0]), ('Men', 'Women')) plt.show()
效果图:
11.Python处理txt
txt文件是我们日常打交道最多的文件,甚至我们第一个认识的文档类型就是txt,除了存放文字,还可以按照一定格式存放我们所需的数据,所以在日常的数据处理中,除了xlsx和csv,我们还会接触到txt作为数据处理的文件对象
a.读取txt内容
#第一种方法f=open("data.txt","r") #设置文件对象line=f.readline() line=line[:-1] whileline: #直到读取完文件line=f.readline() #读取一行文件,包括换行符line=line[:-1] #去掉换行符,也可以不去f.close() #关闭文件#第二种方法data= [] forlineinopen("data.txt","r"): #设置文件对象并读取每一行文件data.append(line) #将每一行文件加入到list中#第三种方法f=open("data.txt","r") #设置文件对象data=f.readlines() #直接将文件中按行读到list里,效果与方法2一样20 f.close() #关闭文件#或者forlineinf: print(line)
效果图
b.写入txt
使用open()函数和write()函数
但是有两种写法,分别是'a'和'w'
原图
'a'
表示写入文件
若无该文件会直接创建一个
如果存在这个文件,会接着已有的内容的后面写入
withopen('D:\\test.txt','a',encoding='utf-8') asf: text='\n奔涌吧,后浪'f.write(text)
效果图
'w'
表示写入文件
若无该文件会直接创建一个
如果存在这个文件,里面的内容会被后面写入的内容替换掉
withopen('D:\\test.txt','w',encoding='utf-8') asf: text='一起向未来'f.write(text)
效果图
c.将读取到的数据转化为插入sql语句
这是我工作中常用的数据入库操作,当我需要把线下收集到的数据或者其他的系统数据导入我们的数据库时,我会将TXT数据通过以下代码转换为sql语句,然后分批执行入库
代码如下:
#生成sqlf=open("data2.txt","r") #设置文件对象forlineinf: print(line) line=line[:-1] withopen('test2.txt','a+',encoding='utf-8') aswf: text='insert into table (code) value ("'+line+'"); \n'wf.write(text)
效果图:
12.给图片添加水印
近年来,人们对知识产权保护的意识越来越强,为了防止别人抄袭或者盗图,怎么少得了给图片加水印的技能呢
给图片加水印首选pillow,pillow简单易用,非常适合初学者学习
Python处理图像的库还有OpenCV
、Scikit-image
,这里选择相对简单的pillow
安装库
pip install pillow
代码如下:
fromPILimportImage, ImageDraw, ImageFontim=Image.open('./img1.jpg') draw=ImageDraw.Draw(im) font=ImageFont.truetype(r'C:\Windows\Fonts\simhei.ttf',70) draw.text((400,280),"HELLO~你好",font=font,fill="gray") im.save('result.png')
原图
效果图
最近发现一个给图片加水印使用更简单的库filestools
安装库
pip3 install filestools
代码如下:
fromwatermarker.markerimportadd_markimportosadd_mark(file="./img1.jpg", #待添加水印的照片out=r'.\out', #添加水印后保存的位置mark="HELLO~你好", #水印文字opacity=0.5, #文字透明度size=80, #字体大小angle=30, #水印字体的旋转角度space=30, #水印字体之间的间隔color="gray") #水印字体的颜色#批量加水印forimginos.listdir("./imgs"): add_mark(file=f"{os.path.join(imgs,img)}", #待添加水印的照片out=r'.\out', #添加水印后保存的位置mark="HELLO~你好", #水印文字opacity=0.5, #文字透明度size=80, #字体大小angle=30, #水印字体的旋转角度space=30, #水印字体之间的间隔color="gray") #水印字体的颜色
效果图:
总结
生活不止眼前的苟且,还有诗和远方,解放双手,尽情享受居家办公美好与自由的时光,好好感受这个季节带来的小欢喜和惬意······
Python简直就是一个百宝箱,就像哆啦A梦的口袋,随时都能从时光之门变出一个自动化办公的神器,上面只是Python自动化办公中的冰山一角,得益于Python拥有各种各样丰富的第三方库,仅需少量的代码,即可实现你任何自动化办公的需求,且对新手同样友好。这里只是抛砖引玉,还有更多助力自动化办公的神器等你发现
除了自动化办公以外,Python还可以进行远程控制电脑,居家办公怎么能少得了远程呢,不过涉及到远程这块目前用的主要使用是teamview和向日葵等工具。Python在爬虫,自动化测试,大数据,AI等领域同样表现优秀,有一些天然的优势,这些方面的使用有待你的探索。。。学习就是在不断的探索中,不断地积累中成长的过程,总有一天你会羽翼丰满,飞上自由的蓝天--人生万事须自为,跬步江山即寥廓