文章目录
1.什么是difflib?
- difflib是python中的标准库模块,无需安装
- 作用:对比文本之间的差异;并且支持输出可读性比较强的HTML文档,与Linux下的diff 命令相似;在版本控制方面非常有用。
2. 符号理解
‘-’ | 包含在第一个系列行中,但不包含第二个。 |
‘+’ | 包含在第二个系列行中,但不包含第一个。 |
’ ’ | 两个系列行一致 |
‘?’ | 存在增量差异 |
‘^’ | 存在差异字符 |
3.difflib的使用
3.1 实现与linux中diff命令类似功能
import difflib
text1 = ''' 1. Beautiful is better than ugly.
2. Explicit is better than implicit.
3. Simple is better than complex.
4. Complex is better than complicated. '''.splitlines(keepends=True)
text2 = ''' 1. Beautiful is better than ugly.
3. Simple is better than complex.
4. Complicated is better than complex.
5. Flat is better than nested.
'''.splitlines(keepends=True)
##splitlines()按照行分割
##返回一个包含各行作为元素的列表
##参数:
##keepends=True 保留换行符
##keepends=False 不包含换行符
d = difflib.Differ()
print(''.join(list(d.compare(text1,text2))))
运行结果:
1. Beautiful is better than ugly.
- 2. Explicit is better than implicit.
- 3. Simple is better than complex.
+ 3. Simple is better than complex.
? ++
- 4. Complex is better than complicated. ? ^ ---- ^ ^
+ 4. Complicated is better than complex.
? ++++ ^ ^ ^
+ 5. Flat is better than nested.
+
3.2 difflib生成html对比文件
import difflib
text1 = ''' 1. Beautiful is better than ugly.
2. Explicit is better than implicit.
3. Simple is better than complex.
4. Complex is better than complicated. '''.splitlines(keepends=True)
text2 = ''' 1. Beautiful is better than ugly.
3. Simple is better than complex.
4. Complicated is better than complex.
5. Flat is better than nested.
'''.splitlines(keepends=True)
d = difflib.HtmlDiff()
htmlContent = d.make_file(text1,text2)
with open('diff.html','w') as f:
f.write(htmlContent)
3.3difflib对比linux下的文件内容
import difflib
filename1 = '/tmp/passwd'
filename2 = '/tmp/passwd1'
with open(filename1) as f1,open(filename2) as f2:
content1 = f1.read().splitlines(keepends=True)
content2 = f2.read().splitlines(keepends=True)
d = difflib.HtmlDiff()
htmlContent = d.make_file(content1,content2)
with open('passwdDiff.html','w') as f:
f.write(htmlContent)