python3标准库difflib

参考于标准库,关于difflib详细说明可以查看标准库
difflib中文说明文档

difflib模块有什么用?

可以比较序列之间的差异,然后返回增量信息,增量信息前面符号说明

符号意义
‘-’序列1独有
‘+’序列2独有
‘ ‘两个序列都有
‘?’行不在任一输入序列

difflib提供的用于比较的API

函数的a,b参数均为接收字符串列表如[‘a’,‘b’,‘c’,‘d’],如果是文件可以f.readlines()直接获得字符串列表
作用都为比较a,b两个序列,返回增量信息
diff_bytes是字节串的比较

函数简单用法
context_diff(a,b,fromfile=’’,tofile=’’,fromfiledate=’’,tofiledate=’’,n=3,lineter=’\n;)context_diff([‘1’,’2’,’3’], [‘1’,’2’,’5’],fromfile=’one.py’,tofile=”two.py”)
ndiff(a,b,linejunk=None,charjunk=IS_CHARACTER_JUNK)difflib.ndiff([‘a’,’b’,’c’],[‘a’,’bb,’c’])
unified_diff(a,b,fromfile=’’,tofile=’’,fromfiledate=’’,tofiledate=’’,n=3,lineterm=’\n’)unified_diff([‘a’,’v’,’c’,’d’],[‘aa,’cv’,’dd’,’d’],fromfile=’brefore’,tofile=’after’)
diff_bytes(dfunc,a,b,fromfile=b’’,tofile=b’’,fromfiledate=b’’,tofiledate=b’’,n=3,lineterm=b’\n’)unified_diff([b‘a’,b’v’,b’c’,b’d’],[b‘aa,b’cv’,b’dd’,b’d’],fromfile=’brefore’,tofile=’after’)

difflib提供的类

  • SequenceMatcher
    • 灵活的类,比较任何类型的序列对,只要序列元素为hashable
#初始化时候给定两个序列
s = SequenceMatcher(None,’abcd’,’abcd abcd’)
#可以用函数更改要比较的两个序列
s.setseqs(111,222)
s.set_seqs1(‘aaa’)
s.set_seq2(‘bbb’)

#找到最长的子串匹配
s.find_longest_match(0,5,0,9)  --> Match(a=0,=4,size=5)

#找到所有的子串匹配
s.get_matching_blocks()
-->[Match(a=0,b=0,size=2),Match(a=3,b=2,size=2),Match(a=5,b=4,size=0)]

#返回描述如何把a变成b的5元组列表,每个元组的形式为(tag,i1,i2,j1,j2),第一个元组中i1==j1==0,其余元组中i1等于前一个元组的i2,j1也等于前一个元组的j2
a = ‘qabxcd’
b = ‘abycdf’
s = SequenceMatcher(None,a,b)
for tag, i1, i2, j1, j2 in s.get_opcodes():
print('{:7}   a[{}:{}] --> b[{}:{}] {!r:>8} --> {!r}'.format(tag, i1, i2, j1, j2, a[i1:i2], b[j1:j2]))
  • Differ
    – 比较由文本行组成的序列(每个字符串后面要是\n),产生可供人阅读的差异信息:
d = Differ() #初始化
#该类比较的对象需要\n为结尾
a=’’’
a
b
‘’’.splitlines()
b = ‘’’
c
b
‘’’.splitlines()

d.compare(a,b) #比较,返回增量信息
  • HtmlDiff
    – 创建HTLM表格,并排逐行显示文本比较
a = HtmlDiff() #初始化
b1 = [‘a’,’b’,’c’,’d’]
b2 = [‘aa’,’bb’,’cc’,’x’]
#两个函数都会返回html字符串
c = a.make_file(b1,b2) 
d = a.make_table(b1,b2)

如果要快速得到比较可以使用difflib提供的四个函数,Differ类也可用于比较可能更麻烦
如果需要结果为HTML表格,则使用HtmlDiff类
如果需要得到两个文本串的相似度,匹配,如果从一个转换到另一个就使用SequenceMatcher

实例:比较两个文件的差异

import sys
import difflib
from pprint import pprint


def main():
    #获取命令行的输入
    if len(sys.argv) <= 2:
        print('你需要输入两个文件')
        print('例如这样:python test.py 1 2')
        return 0
    a = sys.argv[1]
    b = sys.argv[2]

    #读取文件
    f1 = open(a,'r')
    f2 = open(b,'r')
    text1 = f1.readlines()
    text2 = f2.readlines()
    #print(text1)
    #print(text2)

    #产生差异增量格式信息,三个函数和一个类结果差不多
    #rel = difflib.context_diff(text1,text2)
    #rel = difflib.unified_diff(text1,text2)
    #rel = difflib.ndiff(text1,text2)
    d = difflib.Differ()
    rel = d.compare(text1,text2)

    print('-------开始显示比较结果-------')
    pprint(list(rel))

if __name__ == "__main__":
    main()
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值