difflib模块文件内容差异对比

摘要:
简介difflib作为python的标准库模块,无需安装,作用是比对文本之间的差异,且支持输出可读性比较强的HTML文档,与Linux下的diff命令相似。可以使用该模块比对代码和配置文件的差异,在版本控制方面非常有用。Python2.3以后的版本默认自带difflib模块,无需额外安装。/usr/bin/envpython#-*-coding:utf-8-*-importdifflibtext1="""text1:Thismoduleprovidesclassesandfunctionsforcomparingsequences.includingHTMLandcontextandunifieddiffs.difflibdocumentv7.4addstring"""text1_lines=text1.splitlines()text2="""text2:ThismoduleprovidesclassesandfunctionsforComparingsequences.includingHTMLandcontextandunifieddiffs.difflibdocumentv7.5"""text2_lines=text2.splitlines()d=difflib.Differ()#创建Differ对象diff=d.compare#采用compare方法对字符串进行比较print"".join#join将序列中的元素以指定的字符连接生成一个新的字符串str.join结果显示-text1:?

简介

difflib作为python的标准库模块,无需安装,作用是比对文本之间的差异,且支持输出可读性比较强的HTML文档,与Linux下的diff命令相似。可以使用该模块比对代码和配置文件的差异,在版本控制方面非常有用。Python2.3以后的版本默认自带difflib模块,无需额外安装。

使用方法

  • 字符串差异的比对
#!/usr/bin/env python
# -*- coding: utf-8 -*-


import difflib

text1 = """text1:
This module provides classes and functions for comparing sequences.
including HTML and context and unified diffs.
difflib document v7.4
add string
"""

text1_lines = text1.splitlines()

text2 = """text2:
This module provides classes and functions for Comparing sequences.
including HTML and context and unified diffs.
difflib document v7.5"""

text2_lines = text2.splitlines()

d = difflib.Differ() #创建Differ对象

diff = d.compare(text1_lines,text2_lines) #采用compare方法对字符串进行比较

print "
".join(list(diff)) #join将序列中的元素以指定的字符连接生成一个新的字符串str.join(sequence)
结果显示
- text1:
?     ^

+ text2:
?     ^

- This module provides classes and functions for comparing sequences.
?                                                ^

+ This module provides classes and functions for Comparing sequences.
?                                                ^

  including HTML and context and unified diffs.
- difflib document v7.4
?                     ^

+ difflib document v7.5
?                     ^

- add string

各个差异符号表示含义

'-':包含在第一个序列行中,不包含在第二个序列行中

'+':包含在第二个序列行中,不包含在第一个序列行中

'':两个序列行一致

'?':标志两个序列行存在增量差异

'^':标志出两个序列存在的差异字符

  • 生成美观的HTML文档

采用HtmlDiff()的make_file()方法就可以生成美观的HTML文档,可以对上面的例子进行如下修改:

d = difflib.Differ() 
diff = d.compare(text1_lines,text2_lines) 
print "
".join(list(diff)) 

将以上修改为

d = difflib.HtmlDiff()
diff = d.make_file(text1_lines,text2_lines)
print  diff

将以上程序保存为sample2.py ,运行python sample2.py > diff.html,用浏览器打开保存的html文件

difflib模块文件内容差异对比第1张

  • 比对nginx配置文件差异

当我们维护多个Nginx配置时,时长会比对不同版本配置文件的差异,使运维人员更加清晰地了解不同版本迭代后的更新项,实现的思路是读取两个需对比的配置文件,再以换行符作为分隔符,调用difflib.HtmlDiff()生成HTML格式的差异文档。具体实现如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import difflib
import sys

try:
    textfile1 = sys.argv[1]
    textfile2 = sys.argv[2]
except Exception,e:
    print "Error:" +str(e)
    print "Usage: python sample3.py filename1 filename2"
    sys.exit()

def readfile(filename):
    try:
        filehandle = open(filename,'rb')
        text = filehandle.read().splitlines()
        filehandle.close()
        return text
    except IOError as error:
        print ('Read file Error:' +str(error))
        sys.exit()

text1_lines = readfile(textfile1)
text2_lines = readfile(textfile2)

d = difflib.HtmlDiff()
print d.make_file(text1_lines,text2_lines)  

运行代码ython sample3.py nginx.conf.v1 nginx.conf.v2 > sample3_diff.html

通过浏览器查看两个文件差异

difflib模块文件内容差异对比第2张

附nginx配置文件

nginx.conf.zip

免责声明:文章转载自《difflib模块文件内容差异对比》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用 video.js 开发 HTML5 视频页面如何在Windows XP 的IIS中增加多个站点以及如何增大最大连接数。下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python连接真机或模拟器

前言: 最近写自动化代码的时候,使用模拟器运行 python + appium代码时,APP闪退了,只能使用真机运行代码了。真机要怎么配置设备的信息呢? 怎么配置设备的信息? 配置是使用真机还是模拟器的参数【deviceName】,如果使用模拟器运行的,填【Android Emulator】,真机运行的直接填写真机的手机型号,其他信息根据需要配置。...

拷贝obsidian的markdown到anki, 处理图片和语法高亮

动机: 笔记app我用的是obsidian, markdown, 我还用anki进行复习. 但有个问题. 拷贝markdown纯文本, 在anki中并没有渲染语法. 因为它渲染的是html. 所以问题是怎么把markdown转换为html. 我想要有这样的效果: command+shift+C(某一个快捷键) 时, 自动把markdown转换为html,...

Python操作远程机器

操作远程机器主要使用的有paramiko,WMI(Windows Management Instrumentation),SMBConnection. paramiko paramiko使用SSH2协议操作远程机器,是Python语言写的一个模块。 安装 pip install paramiko 使用 使用主要包括执行命令,上传文件和下载文件。 连接...

Python——pyHook监听鼠标键盘事件

pyHook包为Windows中的全局鼠标和键盘事件提供回调。底层C库报告的信息包括事件的时间,事件发生的窗口名称,事件的值,任何键盘修饰符等。而正常工作需要pythoncom等操作系统的API的支持。 先链上一篇《pyHook和pythoncom的安装》。 然后开始讲pyHook的使用。 关于pyHook的使用,网上现存的大多教程如下: import p...

WSGI详解

WSGI接口 了解了HTTP协议和HTML文档,我们其实就明白了一个Web应用的本质就是: 浏览器发送一个HTTP请求; 服务器收到请求,生成一个HTML文档; 服务器把HTML文档作为HTTP响应的Body发送给浏览器; 浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。 所以,最简单的Web应用就是先把HTML用文件保存好,用...

es查询示例

1. 建立连接 from elasticsearch import Elasticsearch es = Elasticsearch(["localhost:9200"]) 2. 查询所有数据 # 方式1: es.search(index="index_name", doc_type="type_name") # 方式2: body...