[日常]用Python讀取word文件中的表格並比較 2018-10-04
阿新 • • 發佈:2019-01-13
最近想對某些word文件(docx)的表格內容作比較, 於是找了一下相關工具. 參考Automate the Boring Stuff with Python中的word部分, 試用了python-docx - python-docx 0.8.7 documentation
演示如下. 兩個簡單的word文件, 各有一個表格:
讀取文件中的表格到列表(為演示只對單列表格操作):
import docx
def 取表格(檔名):
檔案 = docx.Document(檔名)
首個表 = 檔案.tables[0]
值 = []
for 行 in 首個表.rows:
for 格 in 行.cells:
值.append(格.text)
print(檔名 + " -> " + str(值))
return 值
表1 = 取表格('表1.docx')
讀取結果:
表1.docx -> ['值1', '值2', '值3']
接著找到這個做比較的python庫seperman/deepdiff, 來源: Get difference between two lists
from deepdiff import DeepDiff
表1 = 取表格('表1.docx')
表2 = 取表格('表2.docx' )
print(DeepDiff(表1, 表2))
輸出結果(為更可讀, 已手動格式化):
{
'values_changed':
{'root[1]':
{'new_value': '值2.5', 'old_value': '值2'}
},
'iterable_item_added':
{'root[3]': '值4'}
}
顯示了修改的值和新增的值, 還挺好用. 實際的表格是兩列, 需要按照某個鍵值作對比. 於是用字典, 正好DeepDiff也提供兩個字典間的比較. 雙列表檔案演示:
讀取雙列表到字典後, 進行比較:
import docx
from deepdiff import DeepDiff
from pprint import pprint
def 取表格(檔名):
檔案 = docx.Document(檔名)
首個表 = 檔案.tables[0]
值 = {}
for 行 in 首個表.rows:
格 = 行.cells
值[格[0].text] = 格[1].text
print(檔名 + " -> " + str(值))
return 值
表1 = 取表格('雙列表1.docx')
表2 = 取表格('雙列表2.docx')
pprint(DeepDiff(表1, 表2), indent=2)
輸出如下:
{ 'dictionary_item_added': {"root['鍵3']"},
'values_changed': {"root['鍵2']": {'new_value': '值2.5', 'old_value': '值2'}}}