第一章:文本-difflib:比较序列-比较文本体

1.4 difflib:比较序列

difflib模块包含一些计算机和处理序列之间差异的工具。它对于比较文本尤其有用,其中的函数可以使用多种常用的差异格式生成报告。

# difflib_data.py
text1 = """Lorem ipsum dolor sit amet,consectetuer adipiscing
elit. Integer eu lacus accumsan arcu fermentum euismod.Donec
pulvinar porttitor tellus. Aliquam venenatis. Donec facilisis
pharetra tortor. In nec mauris eget magna consequat
convalis. Nam sed sem vitae odio pellentesque interdum. Sed
consequat viverra nisl. Suspendisse arcu metus, blandit quis,
rhoncus ac,pharetra eget,velit. Mauris urna. Morbi nonummy
molestie orci. Praesent nisi elit,fringilla ac,suscipit non,
tristique vel,mauris. Curabitur vel lorem id nisl porta
adipiscing. Suspendisse eu lectus. In nunc. Duis vulputate
tristique enim. Donec quis lectus a justo imperdiet tempus."""

text1_lines = text1.splitlines()

text2 = """Lorem ipsum dolor sit amet,consectetuer adipiscing
elit. Integer eu lacus accumsan arcu fermentum euismod.Donec
pulvinar, porttitor tellus. Aliquam venenatis. Donec facilisis
pharetra tortor.In nec mauris eget magna consequat
convalis. Nam cras vitae mi vitae odio pellentesque interdum. Sed
consequat viverra nisl. Suspendisse arcu metus, blandit quis,
rhoncus ac,pharetra eget,velit. Mauris urna. Morbi nonummy
molestie orci. Praesent nisi elit,fringilla ac,suscipit non,
tristique vel,mauris. Curabitur vel lorem id nisl porta
adipiscing. Duis vulputate tristique enim. Donec quis lectus a
justo imperdiet tempus. Suspendisse eu lectus. In nunc."""

text2_lines = text2.splitlines()

1.4.1 比较文本体
Differ类用于处理文本行序列,并生成人类可读的差异(deltas)或更改指令,包括各行中的差异。Differ生成的默认输出与UNIX下的diff命令行工具类似,包括两个列表的原始输入值(包含共同的值),以及指示做了哪些更改的标记数据。
有-前缀的行在第一个序列中,而非第二个序列。
有+前缀的行在第二个序列中,而非第一个序列。
如果某一行在不同版本之间存在增量差异,那么会使用一个加?前缀的额外行来强调新版本中的变更。
如果一行未改变,则会打印输出,而且其左列有一个额外的空格,使它与其他可能有差异的输出对齐。
将文本传入compare()之前先将其分解为由单个文本行构成的序列,与传入大字符串相比,这样可以生成更可读的输出。

import difflib
from difflib_data import *

d = difflib.Differ()
diff = d.compare(text1_lines,text2_lines)
print('\n'.join(diff))

ndiff()函数生成的输出基本上相同,通过特别“加工”来处理文本数据,并删除输入中的“噪声”。
运行结果:
在这里插入图片描述
其他输出格式
Differ类会显示所有输入行,统一差异格式(unified diff)则不同,它只包含有修改的文本行和一些上下文。unified_diff()函数会生成这种输出。

import difflib
from difflib_data import *

diff = difflib.unified_diff(
    text1_lines,
    text2_lines,
    lineterm = '',
    )

print('\n'.join(list(diff)))

lineterm参数用来告诉unified_diff()不必为它返回的控制行追加换行符,因为输入行不包括这些换行符。打印时所有行都会增加换行符。对于很多常用版本控制工具的用户来说,输出看上去应该很熟悉。
运行结果:
在这里插入图片描述
使用context_diff()会产生类似的可续输出。

import difflib
from difflib_data import *

diff = difflib.context_diff(
    text1_lines,
    text2_lines,
    lineterm = '',
    )

print('\n'.join(list(diff)))

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值