zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Qt之根据扩展名获取文件图标、类型
    C++根据扩展名获取文件图标、类型
    Qt之QFileIconProvider(根据扩展名获取文件图标、类型)
    Qt之QTemporaryFile
    Qt之QFileIconProvider
    Qt之字典划词
    Qt之滚动字幕
    Qt之QThread
    Python 安装 httplib2
    Qt之QTimer
  • 原文地址:https://www.cnblogs.com/program-in-chinese/p/10500103.html
Copyright © 2011-2022 走看看