Word和Excel大概是我們最常碰到的兩種文件了,我前面寫過pandas的基本操作,利用它可以輕松完成Excel文件的批量處理,那么對於word文件的處理是否也有同樣簡單的方式,答案是肯定的,這涉及到python的另一個庫docx,這篇文章的主要內容是:
如何批量處理word中的表格
我隨便找了一個Word文件,它的部分內容如下:
這個文件中有多個這樣表格,我們要將它們處理成一個簡單表——屬性一行,值 一行
下面正式開始,docx之外的內容我將不做詳細說明,有問題請留言。
1.安裝docx:
pip install python-docx
2.導入docx庫
from docx import Document
import pandas as pd
3.讀Word文件
doc=Document('2007年三江源生態監測森林數據集.docx')
ps:docx不支持dox格式的word文件。
4.讀表格
tb=doc.tables
5.讀行
rows=tb[0].rows
6.讀列
cols=rows[0].cells
7.單元格
cell=cols[0]
text=cell.text
有了上面的基礎知識,讀取word中的表格應該沒什么問題了,下面是是完整代碼:
doc=Document('2007年三江源生態監測森林數據集.docx')
index,key,value=[],[],[]
table_index=0
for tb in doc.tables:
table_index+=1
row_index=0
for row in tb.rows:
row_index+=1
for cell in row.cells:
text=""
for p in cell.paragraphs:##如果cell中有多段,即有回車符
text+=p.text
if row_index%2==0:
value.append(text)#偶數行為值
index.append(table_index)#這行也可以放在else中
else:
key.append(text)#奇數行為屬性
現在word中所有表格的內容已經讀出來了,不過是在兩個列表中,將它們重新構造成一個表格。
8.重建表格
df=pd.DataFrame({'table_index':index,'key':key,'value':value})
但是這個表格並不是我們想要的結果,我們想要的是key為表頭,value為值,table_index為索引,所以我們還需要進一步的操作。
8.pviot
#刪除重復行,否則會報錯:Index contains duplicate entries, cannot reshape
df=df.drop_duplicates(['table_index','key'])
df1=df.pivot(index='table_index',columns='key',values='value')
#下面兩行用於去除列名和索引名,可有可無,加上只因為我有強迫症,為了美觀,感興趣的朋友可以對比加上這現行前后的差異
df1.columns=list(df1.columns)
df1.index=list(df1.index)
最終得到的表格是這樣的:
9.如何把表格寫入word文件
上面的表格內容太多,我們取一部分寫入word中
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.shared import Cm
df2=df1.iloc[:10,:6]
d=Document()
tb=d.add_table(rows=len(df2.index),cols=len(df2.columns))
tb.add_row()
for i in range(len(df2.columns)):
tb.cell(0,i).text=df2.columns[i]#添加表頭
for row in range(1,len(df2.index)+1):
for col in range(len(df2.columns)):
tb.cell(row,col).width=1
tb.cell(row,col).text=df2.iloc[row,col]
tb.cell(row,col).width=Cm(6)
tb.cell(row,col).ipynb
tb.style='Medium Grid 1 Accent 1'
tb.autofit=True
d.save('tb.docx')
最后生成的word表格是這樣的:
關於表格的樣式控制將在另一篇博客中展開討論:利用python批量處理Word文件——表格(二)樣式控制
關於word表格的處理就到這里了,現實中我們要處理的文件內容千變萬化,不過只要熟練這些基礎操作,就可以以不變應萬變,后面我會繼續寫word中其它內容的處理,感興趣的朋友可以多多關注。