参考于标准库,关于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()