說明一下這個代碼所有的考量.

首先是 順序,這裡的順序有兩個部分,一個是輸出行的順序,一個是項目合併之後的順序.我們觀察到:

pr333 sd23a2 thisisa 1001 1005

pr333 sd23a2 sentence 1001 1005

pr33w sd11aa we 1022 1002

pr33w sd11aa have 1022 1002

pr33w sd11aa adream 1033 1002

要變成:

pr333 sd23a2 thisisa|sentence 1001 1005

pr33w sd11aa we|have|adream 1022|1033 1002

輸出行的順序要顧及: pr333 先於 pr33w

項目合併之後的順序要顧及: thisisa 先於 sentence

這代表我們 使用的資料型態必須要能維持順序

其次是速度,我們都知道序列型態是線性搜尋,為了效率,使用映射型態是比較好的.

三種考量之下,就如同 moling3650 大所言,OrderedDict 是個好選擇.這可以解決行輸出的問題,不過合併項目由於只需要用到 key 而不需要用到 value 所以使用 OrderedDict 有點可惜,不過目前標準庫中沒有 OrderSet 的選擇,所以只好將就著用一下.

有關於 OrderedDict 可以參閱 OrderedDict

最後 linkse7en 大的觀點非常好,這類文檔處理的問題,如果能夠邊讀邊寫,邊讀邊處理絕對是 有效率(因為只需要進行一次文檔的走訪)(討論請見評論部分 moling 大的觀點) 且 省資源(馬上輸出完畢,不必浪費空間儲存資料).但因為考慮到有可能重複的 數據對 有可能跨行出現,所以依然是多花一點資源來確保穩固性.

代碼(Python3):

from collections import OrderedDict

data = OrderedDict()

DPAIR = slice(0,2)

MSG = slice(2,None)

with open('data.txt', 'r') as reader:

for line in reader:

line = line.strip()

items = tuple(line.split())

msgs = data.setdefault(items[DPAIR], [OrderedDict({}) for msg in items[MSG]])

for idx, msg in enumerate(msgs):

msg.setdefault(items[MSG][idx], None)

for (dp1, dp2), msgs in data.items():

print(dp1, dp2, *['|'.join(msg.keys()) for msg in msgs])

關於代碼部分也做個說明(也許我寫的不是最好,但有些心得可以分享).

首先是 slice 類的應用.

身為一個 Python programmer,我們對 序列型態 取切片(slicing) 應該都不陌生.

items[start:stop:step]

其實可以寫成:

items[slice(start, stop, step)]

# example

items[:5] 可以寫成 items[slice(0,5)]

items[7:] 可以寫成 items[slice(7,None)]

那好處是什麼呢?

我們可以利用這個特性對切片進行命名,以這個問題的代碼為例,原本要取出 數據對 與 其他資料 可以用:

items = tuple(line.split())

items[0:2] # 這是用來做 key 的數據對

items[2:] # 這是其他的資料項

但是這種方式其實閱讀起來不夠清晰,我們可以幫這兩個範圍取個名字,所以:

DPAIR = slice(0,2)

MSG = slice(2,None)

items[DPAIR] # 這是用來做 key 的數據對

items[MSG] # 這是其他的資料項

我們可以用比較優雅易讀的方式來從 items 中取值.

其次是 setdefault,這個函數相當實用,舉例:

dic.setdefault(key, default_value)

如果字典(或其他相符的映射型態)中存在鍵值 key 則回傳 dic[key] 否則回傳自動在字典中插入新的鍵值對 dic[key] = default_value 並且回傳 default_value.

最後一個想分享的是嵌套 tuple 的拆解:

for (a, b), c, d in ((1,2) ,3, 4):

print(a, b, c, d) # 印出 1 2 3 4

這個技巧可以很方便的用來拆解巢狀嵌套的 tuple.

感謝大家不嫌我話多...

python合并word全部_python:怎样合并文档中有重复部分的行?相关推荐

  1. python合并word内容相同单元格_python:怎样合并文档中有重复部分的行?

    說明一下這個代碼所有的考量. 首先是 順序,這裡的順序有兩個部分,一個是輸出行的順序,一個是項目合併之後的順序.我們觀察到: pr333 sd23a2 thisisa 1001 1005 pr333 ...

  2. python 合并word内容_python如何合并两个文档内容

    1.两个文档合并之前 2.合并两个文件的代码:file1 = open("name,tel.txt", "rb") file2 = open("nam ...

  3. python docx 提取图片_Python提取docx文档中所有嵌入式图片和浮动图片

    术语: 浮动图片,是指在Word文档中位置可以自由移动.可以环绕文字或放置于文字上方.下方的图片,不占文档流的位置,可以和文字或嵌入式图片重叠. 嵌入式图片或行内图片,和文档中的文字一样占文档流的位置 ...

  4. python改word域_Python自动化修改word实例

    前言 利用Python docx模块,可以很方便地打开和修改Word 2007及以后的文档.本文简单地介绍了如何使用python修改word文档中的内容. 例子与代码 word文档的内容是一封表扬信, ...

  5. java计算机毕业设计酒店后厨供应商订单合并系统源码+数据库+lw文档+系统

    java计算机毕业设计酒店后厨供应商订单合并系统源码+数据库+lw文档+系统 java计算机毕业设计酒店后厨供应商订单合并系统源码+数据库+lw文档+系统 本源码技术栈: 项目架构:B/S架构 开发语 ...

  6. python读取docx中表格 图片_python 解析docx文档的方法,以及提取插入的文本对象和图片...

    首先安装docx模块,通过pip install docx或者在docx官方链接上下载安装都可以 下面来看下如何解析docx文档:文档格式如下 有3个部分组成 1 正文:text文档 2 一个表格. ...

  7. java计算机毕业设计酒店后厨供应商订单合并系统源程序+mysql+系统+lw文档+远程调试

    java计算机毕业设计酒店后厨供应商订单合并系统源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计酒店后厨供应商订单合并系统源程序+mysql+系统+lw文档+远程调试 本源码技术栈 ...

  8. Python量化交易平台:JQData | API使用文档(转)

    Python量化交易平台:JQData | API使用文档(转) #原文地址:https://www.joinquant.com/help/api/help?name=JQData JQData说明书 ...

  9. java操作office和pdf文件java读取word,excel和pdf文档内容

    在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...

最新文章

  1. linux grep 例子,Linux中Grep常用的15个例子
  2. C语言函数sscanf:从一个字符串中读进与指定格式相符的数据
  3. python制作一个教学网站_小白如何入门Python? 制作一个网站为例
  4. c++ 动态规划(数塔)
  5. scrapy爬取百万小说
  6. Cortex-M3-复位(序列)
  7. 2020教育OMO模式落地应用研究报告
  8. el-table 树形表格 自定义展开图标_实践一个树形组件
  9. SAP License:SAP Business One系统功能
  10. 借一本可以编辑HTML,index.html
  11. 基于Matlab----16QAM调制与解调
  12. Java并发编程学习笔记(一)线程安全性 1
  13. android 程序员 计算器,程序员计算器(进制转换)
  14. CTF常见的php函数
  15. 如何在线制作二维码?学校通知二维码的3种制作方法
  16. jsp外文期刊免费下载_外文期刊下载
  17. 极简之SVN使用,入职必备
  18. 勒索病毒解密SQL数据库修复文档文件服务器中毒远程处理数据恢
  19. 广东省中医院微信公众号医保个账支付功能
  20. 直击GITC2018 尚德机构苏万松:从消费互联网到产业互联网

热门文章

  1. oracle静默安装访问数据库慢,Oracle数据库静默安装总结
  2. win2003 apache php5.4 mysql_【php】在Windows2003下配置Apache2.4与php5.4
  3. 错误诊断:索引数据错误导致ORA-00600 [kdsgrp1]处理
  4. Oracle绑定变量和审计功能影响性能吗?Python告诉你
  5. 直播丨分布式数据库:从PG-XL到TBASE
  6. 案例详解:MTU不一致导致主机和RAC不断重启
  7. Cloudarrow V2.0 正式发布!
  8. 毫秒级从百亿大表任意维度筛选数据,是怎么做到的…
  9. [技术分享]【DLI跨源】当DLI遇见MongoDB
  10. Python精确指南——第二章 界面开发