2018-10-04 [日常]用Python讀取word文檔中的表格並比較


最近想對某些word文檔(docx)的表格內容作比較, 於是找了一下相關工具. 參考Automate the Boring Stuff with Python中的word部分, 試用了python-docx - python-docx 0.8.7 documentation

演示如下. 兩個簡單的word文檔, 各有一個表格:
2018-10-04-docx_單列表比較

讀取文檔中的表格到列表(為演示只對單列表格操作):

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也提供兩個字典間的比較. 雙列表文件演示:
2018-10-04-docx_雙列表比較

讀取雙列表到字典后, 進行比較:

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'}}}

源碼在: program-in-chinese/house_of_10000_business


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM