前言
不管是線下辦公,還是居家辦公,摸魚必不可少(當然不提倡摸魚),可是摸魚歸摸魚,工作總得完成,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 -*-
from pptx import Presentation
from pdf2image import convert_from_path, convert_from_bytes
from pdf2image.exceptions import (
PDFInfoNotInstalledError,
PDFPageCountError,
PDFSyntaxError
)
from sys import argv
from PIL import Image
from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pathlib import Path
fff=argv[1]
pp=Path.cwd()
fn=fff+'.pdf'
filename=pp/fn
print("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'
if not jpgs.exists():
jpgs.mkdir()
for index, page in enumerate(pages):
name=fff+"-(%d).png" % index
jpg_file =jpgs/name
# print(jpg_file)
page.save(jpg_file, 'PNG')
image = Image.open(jpg_file)
height = image.height
width = image.width
#
if height > 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 = 0
jpg_file=str(jpg_file)
print(jpg_file)
slide.shapes.add_picture(jpg_file, left,top,height = prs.slide_height)
pptname='%s.pptx' % fff
prs.save(pp/pptname)
print("Saved")
pdf轉圖檔,上面的代碼的原理是先把PDF每一頁轉化為圖檔,然後寫入PPT中
import os
import sys
import fitz
from reportlab.lib.pagesizes import portrait
from reportlab.pdfgen import canvas
from PIL import Image
def pdf2img(filename=r'./pw.pdf'):
# 打開PDF檔案,生成一個對象
doc = fitz.open(filename)
print("共",doc.pageCount,"頁")
for pg in range(doc.pageCount):
print("\r轉換為圖檔",pg+1,"/",doc.pageCount,end="")
page = doc[pg]
rotate = int(0)
# 每個尺寸的縮放系數為8,這将為我們生成分辨率提高64倍的圖像。
zoom_x = 8.0
zoom_y = 8.0
trans = 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文檔中
import comtypes.client
import os
def init_powerpoint():
powerpoint = comtypes.client.CreateObject("Powerpoint.Application")
powerpoint.Visible = 1
return powerpoint
def ppt_to_pdf(powerpoint, inputFileName, outputFileName, formatType = 32):
if outputFileName[-3:] != 'pdf':
outputFileName = outputFileName[0:-4] + ".pdf"
deck = powerpoint.Presentations.Open(inputFileName)
deck.SaveAs(outputFileName, formatType) # formatType = 32 for ppt to pdf
deck.SaveAs(inputFileName.rsplit('.')[0] + '.jpg', 17)
deck.Close()
def convert_files_in_folder(powerpoint, folder):
files = os.listdir(folder)
pptfiles = [f for f in files if f.endswith((".ppt", ".pptx"))]
for pptfile in pptfiles:
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
代碼如下:
from pptx import Presentation
from docx import Document
wordfile = Document()
# 給定ppt檔案所在的路徑
filepath = r'**.pptx'
pptx = Presentation(filepath)
# 周遊ppt檔案的所有幻燈片頁
for slide in pptx.slides:
# 周遊幻燈片頁的所有形狀
for shape in slide.shapes:
# 判斷形狀是否含有文本框,如果含有則順序運作代碼
if shape.has_text_frame:
# 擷取文本框
text_frame = shape.text_frame
# 周遊文本框中的所有段落
for paragraph in text_frame.paragraphs:
# 将文本框中的段落文字寫入word中
wordfile.add_paragraph(paragraph.text)
if shape.has_table:
# 擷取表格
myTable = shape.table
for row in myTable.rows:
for i in range(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
import win32com
from win32com.client import Dispatch
import os
ppt = Dispatch('PowerPoint.Application')
# 或者使用下面的方法,使用啟動獨立的程序:
# ppt = DispatchEx('PowerPoint.Application')
# 如果不聲明以下屬性,運作的時候會顯示的打開word
ppt.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
# 粘貼模闆頁
for i in range(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
建立頁面
from pptx import Presentation
# 建立ppt
ppt = Presentation()
# 建立頁面
slide = ppt.slides.add_slide(ppt.slide_layouts[0])
# 儲存ppt
ppt.save('測試ppt.pptx')
效果圖
編輯頁面
from pptx import Presentation
from pptx.util import Pt, Cm
# 打開已存在ppt
ppt = Presentation('測試ppt.pptx')
# 設定添加到目前ppt哪一頁
n_page = 0
singleLineContent = "我是單行内容"
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)
# 儲存ppt
ppt.save('添加文字.pptx')
效果圖
這裡僅僅是抛磚引玉,還有更多關于PPT的進階操作等你發現!
2.PDF與Word-辦公文檔常客
不管任何崗位幾乎都會接觸到這兩種文檔,特别是行政類崗位和管理類崗位,平時釋出公告消息或者文檔手冊都會使用到。pdf和word文檔之間的轉換也是我們最常用到的操作,而且PDF相對于word來說,列印的布局更穩定,且不易變形,但是word的優點在于可自由編輯,接下來我們來了解他們之間的轉換以及其他辦公場景的應用
a.PDF轉word
由于PDF不友善修改,是以當我們需要增加或者修改文檔内容時,就需要把PDF轉換為word進行修改,使用wps轉換功能需要開通會員才可以轉換多頁。這時候Python這個轉換功能就能派上用場。
代碼如下:
使用到的子產品:pdf2docx
将某個目錄下的全部pdf轉化成word
import os
from pdf2docx import Converter
def pdf_docx():
# 擷取目前工作目錄
file_path = os.getcwd()
# 周遊所有檔案
for file in os.listdir(file_path):
# 擷取檔案字尾
suff_name = os.path.splitext(file)[1]
# 過濾非pdf格式檔案
if suff_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
from docx2pdf import convert
import os
director = r'E:\prokect\AI\word'
FileList = map(lambda x:director+ '\\'+x, os.listdir(director))
for file in FileList:
convert(file,f"{file.split('.')[0]}.pdf")
c.提取PDF文字
當我們需要對PDF檔案上的文字進行複用時,由于PDF不友善編輯,而如果PDF又有很多頁的時候,直接使用Python對PDF進行文字提取,解放雙手,一勞永逸
import PyPDF2
pdfFile = open('example.pdf','rb')
pdfReader = PyPDF2.PdfFileReader(pdfFile)
print(pdfReader.numPages)
page = pdfReader.getPage(0)
print(page.extractText())
pdfFile.close()
還可以把提取到文字存入txt
import pdfplumber
with pdfplumber.open("example.pdf") as p:
for i in range(75):
page = p.pages[i]
textdata = page.extract_text()
#print(textdata)
data = open("text.text", "a")
data.write(textdata)
d.提取PDF表格
當我們拿到的資料都存放在PDF的表格上,我們需要對資料做分析,就可以使用pdfplumber提取PDF上的表格資料
import pdfplumber
with pdfplumber.open("example.pdf") as pdf:
page01 = pdf.pages[0] #指定頁碼
table1 = page01.extract_table()#提取單個表格
# table2 = page01.extract_tables()#提取多個表格
print(table1)
我們還可以把提取到的表格資料存入Excel
import pdfplumber
from openpyxl import Workbook
with pdfplumber.open("example.pdf") as p:
workbook = Workbook() #建立空白Excel工作簿
sheet = workbook.active #激活sheet
for i in range(68,75): #周遊69頁-75頁
page = p.pages[i]
table = page.extract_table() #提取表格資料
#print(table)
for row in table: #周遊所有行
#print(row)
sheet.append(row) #按行追加寫入資料
workbook.save("Excel.xlsx") #儲存檔案,命名為Excel
i += 1
print("第%d頁PDF提取完成"%i) #提示提取進度
e.提取Word文字
可以通過提取word的文字進行重新整理,然後通過其他自動化操作加工利用,比如通過word生成PPT,取word的文字和資料整理到Excel歸檔
from docx import Document
doc = Document(r"E:\python辦公自動化\getword\test.docx")
print(doc.paragraphs)
for paragraph in doc.paragraphs:
print(paragraph.text)
f.Python生成合同
在我們經濟交往中,有時會涉及到銷售合同的批量制作。比如我們需要根據如下合同資料(Excel),進行批量生成銷售合同(Word)。
安裝相關庫
pip install openpyxl
pip install docxtpl
讀取合同資料
我們可以通過load_workbook方法打開合同資料(Excel表),然後讀取每一個合同資料并存入到data字典,再将每個字典放入到清單datas中。PS:由于讀取的簽約日期是一個時間戳,需要通過strftime方法轉為标準的年月日格式
from docxtpl import DocxTemplate
from openpyxl import load_workbook
wb = load_workbook("資料.xlsx")
ws = wb['Sheet1']
datas = []
for row in range(2, ws.max_row):
name1 = ws[f"A{row}"].value
name2 = ws[f"B{row}"].value
price = ws[f"C{row}"].value
product = ws[f"D{row}"].value
count = ws[f"E{row}"].value
deadline = ws[f"F{row}"].value
time = ws[f"G{row}"].value
time = time.strftime("%Y-%m-%d")
data = {"甲方": name1,
"乙方": name2,
"合同價款": price,
"産品名稱": product,
"産品數量": count,
"付款期限": deadline,
"簽約時間": time}
datas.append(data)
datas
批量生成合同
for data in datas:
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資料進行分析
import xlwings as xw
wb = xw.Book() # this will create a new workbook
wb = xw.Book('FileName.xlsx') # connect to a file that is open or in the current working directory
wb = xw.Book(r'C:\path\to\file.xlsx') # on Windows: use raw strings to escape backslashes
表格将matplotlib繪制excel
import matplotlib.pyplot as plt
import xlwings as xw
fig = 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 -*-
import os
import pandas as pd
import numpy as np
dir = "E:\\prokect\\AI\\office\\data"#設定工作路徑
#建立清單,存放檔案名(可以忽略,但是為了做的過程能心裡有數,先放上)
filename_excel = []
#建立清單,存放每個檔案資料框(每一個excel讀取後存放在資料框)
frames = []
for root, dirs, files in os.walk(dir):
for file in files:
#print(os.path.join(root,file))
filename_excel.append(os.path.join(root,file))
df = pd.read_excel(os.path.join(root,file)) #excel轉換成DataFrame
frames.append(df)
#列印檔案名
print(filename_excel)
#合并所有資料
result = pd.concat(frames)
#檢視合并後的資料
result.head()
result.shape
result.to_csv('E:\\prokect\\AI\\office\\data\\outmer.csv',sep=',',index = False)#儲存合并的資料到電腦D盤的merge檔案夾中,并把合并後的檔案命名為outmer.csv
合并效果圖:
4.python自動控制
對滑鼠的自動控制,執行一些流水線的工作,解放雙手.比如軟體測試。
Python的pyautogui庫可以任意地去控制你的滑鼠。
滑鼠左擊/右擊/控制左鍵以及測試腳本
# 擷取滑鼠位置
import pyautogui as pg
try:
while True:
x, y = pg.position()
print(str(x) + " " + str(y)) #輸出滑鼠位置
if 1746 < x < 1800 and 2 < y < 33:
pg.click()#左鍵單擊
if 1200 < x < 1270 and 600 < y < 620:
pg.click(button='right')#右鍵單擊
if 1646 < x < 1700 and 2 < y < 33:
pg.doubleClick()#左鍵輕按兩下
except KeyboardInterrupt:
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
具體代碼如下:
import pytesseract
from PIL import Image
#如果報錯可能是沒把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
方法,将圖檔中所有文字讀入一個清單并傳回。
代碼如下:
import easyocr
import os
# 指明所有圖檔所在的檔案夾
images = './id_card'
# 建立ocr的reader對象,識别中英文
ocr = easyocr.Reader(['ch_sim', 'en'])
# 識别圖檔文字
content = ocr.readtext(images,detail=0)
# 周遊所有圖檔并識别文字,切片提取有效資訊
data = []
for image in os.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 "月" not in birth:
birth = content[-6] + "月" + content[-5]
if "日" not in birth:
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
,友善簡潔。
#儲存資料到Excel
import pandas as pd
# 儲存識别結果至Excel
df = pd.DataFrame(data, columns=["姓名", "性别", "民族", "出生", "住址", "身份證号"])
print(f"識别結果如下:")
print(df)
df.to_excel("識别結果.xlsx", index=False)
還有更簡單的方式,使用百度的文字識别接口
import requests
import base64
def ocr(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 編碼
with open(img_path, 'rb') as f:
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 的 api
response = requests.post(
'https://cloud.baidu.com/aidemo', headers=headers, data=data)
# 設定一個空的清單,後面用來存儲識别到的字元串
ocr_text = []
result = response.json()['data']
if not result.get('words_result'):
return []
# 将識别的字元串添加到清單裡面
for r in result['words_result']:
text = r['words'].strip()
ocr_text.append(text)
# 傳回字元串清單
return ocr_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圖檔
代碼如下:
import zipfile
import os
import shutil
def word2pic(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')
# 将圖檔提取并儲存
for file in f.namelist():
f.extract(file, tmp_path)
# 釋放該zip檔案
f.close()
# 将docx檔案從zip還原為docx
os.rename(zip_path, path)
# 得到緩存檔案夾中圖檔清單
pic = os.listdir(os.path.join(tmp_path, 'word/media'))
# 将圖檔複制到最終的檔案夾中
for i in pic:
# 根據word的路徑生成圖檔的名稱
new_name = path.replace('\\', '_')
new_name = new_name.replace(':', '') + '_' + i
shutil.copy(os.path.join(tmp_path + '/word/media', i), os.path.join(store_path, new_name))
# 删除緩沖檔案夾中的檔案,用以存儲下一次的檔案
for i in os.listdir(tmp_path):
# 如果是檔案夾則删除
if os.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重命名為zip
zip_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 pymupdf
import fitz
import time
import re
import os
def pdf2pic(path, pic_path):
'''
# 從pdf中提取圖檔
:param path: pdf的路徑
:param pic_path: 圖檔儲存的路徑
:return:
'''
t0 = time.clock()
# 使用正規表達式來查找圖檔
checkXO = r"/Type(?= */XObject)"
checkIM = r"/Subtype(?= */Image)"
# 打開pdf
doc = fitz.open(path)
# 圖檔計數
imgcount = 0
lenXREF = doc._getXrefLength()
# 列印PDF的資訊
print("檔案名:{}, 頁數: {}, 對象: {}".format(path, len(doc), lenXREF - 1))
# 周遊每一個對象
for i in range(1, lenXREF):
# 定義對象字元串
text = doc.getObjectString(i)
isXObject = re.search(checkXO, text)
# 使用正規表達式檢視是否是圖檔
isImage = re.search(checkIM, text)
# 如果不是對象也不是圖檔,則continue
if not isXObject or not isImage:
continue
imgcount += 1
# 根據索引生成圖像
pix = fitz.Pixmap(doc, i)
# 根據pdf的路徑生成圖檔的名稱
new_name = path.replace('\\', '_') + "_img{}.png".format(imgcount)
new_name = new_name.replace(':', '')
# 如果pix.n<5,可以直接存為PNG
if pix.n < 5:
pix.writePNG(os.path.join(pic_path, new_name))
# 否則先轉換CMYK
else:
pix0 = fitz.Pixmap(fitz.csRGB, pix)
pix0.writePNG(os.path.join(pic_path, new_name))
pix0 = None
# 釋放資源
pix = None
t1 = time.clock()
print("運作時間:{}s".format(t1 - t0))
print("提取了{}張圖檔".format(imgcount))
if __name__=='__main__':
# pdf路徑
path = r'E:\word2pdf\提取圖檔\課件.pdf'
pic_path = r'E:\word2pdf\提取圖檔\測試'
# 建立儲存圖檔的檔案夾
if os.path.exists(pic_path):
print("檔案夾已存在,請重新建立新檔案夾!")
raise SystemExit
else:
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
提前導入相關内容,并且注冊字型。(注冊字型前需要先準備好字型檔案)
from reportlab.pdfbase import pdfmetrics # 注冊字型
from reportlab.pdfbase.ttfonts import TTFont # 字型類
from reportlab.platypus import Table, SimpleDocTemplate, Paragraph, Image # 報告内容相關類
from reportlab.lib.pagesizes import letter # 頁面的标志尺寸(8.5*inch, 11*inch)
from reportlab.lib.styles import getSampleStyleSheet # 文本樣式
from reportlab.lib import colors # 顔色子產品
from reportlab.graphics.charts.barcharts import VerticalBarChart # 圖表類
from reportlab.graphics.charts.legends import Legend # 圖例類
from reportlab.graphics.shapes import Drawing # 繪圖工具
from reportlab.lib.units import cm # 機關:cm
# 注冊字型(提前準備好字型檔案, 如果同一個檔案需要多種字型可以注冊多個)
pdfmetrics.registerFont(TTFont('SimSun', 'SimSun.ttf'))
這裡就不貼代碼了.這個連結寫的很詳細(生成圖文并茂的PDF報告代碼)
效果圖:
8.Python處理郵件
在 Python 中可以使用 smtplib 配合電子郵件庫,來實作郵件的自動化傳輸,非常友善。
import smtplib
import email
# 負責将多個對象集合起來
from email.mime.multipart import MIMEMultipart
from email.header import Header
# 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()
# 設定發件人郵箱的域名和端口,端口位址為25
stp.connect(mail_host, 25)
# set_debuglevel(1)可以列印出和SMTP伺服器互動的所有資訊
stp.set_debuglevel(1)
# 登入郵箱,傳遞參數1:郵箱位址,參數2:郵箱授權碼
stp.login(mail_sender,mail_license)
# 發送郵件,傳遞參數1:發件人郵箱位址,參數2:收件人郵箱位址,參數3:把郵件内容格式改為str
stp.sendmail(mail_sender, mail_receivers, mm.as_string())
print("郵件發送成功")
# 關閉SMTP對象
stp.quit()
9.Python處理檔案
處理檔案一直是個髒活累活,而且特别機械,枯燥,Python可以幫你脫離苦海。Python中有很多檔案,sys、os、shutil、glob、path.py等等。
修改檔案字尾名
日常工作中,除了查找檔案就是修改檔案字尾了,批量操作一勞永逸
import os
def file_rename():
path = input("請輸入你需要修改的目錄(格式如'E:\\test'):")
old_suffix = input('請輸入你需要修改的字尾(需要加點.):')
new_suffix = input('請輸入你要改成的字尾(需要加點.):')
file_list = os.listdir(path)
for file in file_list:
old_dir = os.path.join(path, file)
print('目前檔案:', file)
if os.path.isdir(old_dir):
continue
if old_suffix != os.path.splitext(file)[1]:
continue
filename = 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等。資料可視化讓資料更加直覺,更容易通過資料做出正确的決策
import numpy as np
import matplotlib.pyplot as plt
N = 5
menMeans = (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 groups
width = 0.35 # the width of the bars: can also be len(x) sequence
p1 = 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]
while line: #直到讀取完檔案
line = f.readline() #讀取一行檔案,包括換行符
line = line[:-1] #去掉換行符,也可以不去
f.close() #關閉檔案
#第二種方法
data = []
for line in open("data.txt","r"): #設定檔案對象并讀取每一行檔案
data.append(line) #将每一行檔案加入到list中
#第三種方法
f = open("data.txt","r") #設定檔案對象
data = f.readlines() #直接将檔案中按行讀到list裡,效果與方法2一樣20 f.close() #關閉檔案
#或者
for line in f:
print(line)
效果圖
b.寫入txt
使用open()函數和write()函數
但是有兩種寫法,分别是'a'和'w'
原圖
'a'
表示寫入檔案
若無該檔案會直接建立一個
如果存在這個檔案,會接着已有的内容的後面寫入
with open('D:\\test.txt','a',encoding='utf-8') as f:
text = '\n奔湧吧,後浪'
f.write(text)
效果圖
'w'
表示寫入檔案
若無該檔案會直接建立一個
如果存在這個檔案,裡面的内容會被後面寫入的内容替換掉
with open('D:\\test.txt','w',encoding='utf-8') as f:
text = '一起向未來'
f.write(text)
效果圖
c.将讀取到的資料轉化為插入sql語句
這是我工作中常用的資料入庫操作,當我需要把線下收集到的資料或者其他的系統資料導入我們的資料庫時,我會将TXT資料通過以下代碼轉換為sql語句,然後分批執行入庫
代碼如下:
#生成sql
f = open("data2.txt","r") #設定檔案對象
for line in f:
print(line)
line = line[:-1]
with open('test2.txt','a+',encoding='utf-8') as wf:
text = 'insert into table (code) value ("'+ line +'"); \n'
wf.write(text)
效果圖:
12.給圖檔添加水印
近年來,人們對知識産權保護的意識越來越強,為了防止别人抄襲或者盜圖,怎麼少得了給圖檔加水印的技能呢
給圖檔加水印首選pillow,pillow簡單易用,非常适合初學者學習
Python處理圖像的庫還有
OpenCV
、
Scikit-image
,這裡選擇相對簡單的pillow
安裝庫
pip install pillow
代碼如下:
from PIL import Image, ImageDraw, ImageFont
im = 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
代碼如下:
from watermarker.marker import add_mark
import os
add_mark(file = "./img1.jpg", #待添加水印的照片
out =r'.\out', #添加水印後儲存的位置
mark = "HELLO~你好", #水印文字
opacity= 0.5, #文字透明度
size = 80, #字型大小
angle=30, #水印字型的旋轉角度
space=30, #水印字型之間的間隔
color="gray") #水印字型的顔色
#批量加水印
for img in os.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") #水印字型的顔色
效果圖: