python運維開發經常使用模塊(四)文件對比模塊difflib

1.difflib介紹

difflib做爲 Python的標準庫模塊,無需安裝,做用是對比文本之間的差別,且支持 輸出可讀性比較強的HTML文檔,與Linux下的diff命令類似。咱們能夠 使用difflib對比代碼、配置文件的差異,在版本控制方面是很是有用。 Python 2.3或更高版本默認自帶difflib模塊,無需額外安裝。html

 

示例1:兩個字符串的差別對比

[yhl@myhost part2]$ cat simple1.py
#!/usr/bin/python
#_*_coding:utf-8_*_
#****************************************************************#
# ScriptName: simple1.py
# Author: BenjaminYang
# Create Date: 2019-05-13 11:08
# Modify Author: BenjaminYang
# Modify Date: 2019-05-13 11:08
# Function: 
#***************************************************************#

import difflib
text1 = """text1: #定義字符串1
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: #定義字符串2
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 '\n'.join(list(diff))

本示例採用Differ()類對兩個字符串進行比較,另外difflib的 SequenceMatcher()類支持任意類型序列的比較,HtmlDiff()類支持 將比較結果輸出爲HTML格式python

示例運行結果nginx

符號含義說明瀏覽器

生成美觀的對比HTML格式文檔運維

採用HtmlDiff()類將新文件命名爲simple2.py,運行# python simple2.py>diff.html,再 使用瀏覽器打開diff.html文件,結果如圖示2-2所示,HTML文檔包括了 行號、差別標誌、圖例等信息,可讀性加強了許多的make_file()方法就能夠生成美觀的HTML 文檔,對示例1中代碼按如下進行修改:ide

示例2:對比Nginx配置文件差別

當咱們維護多個Nginx配置時,時常會對比不一樣版本配置文件的差 異,使運維人員更加清晰地瞭解不一樣版本迭代後的更新項,實現的思路 是讀取兩個需對比的配置文件,再以換行符做爲分隔符,調用 difflib.HtmlDiff()生成HTML格式的差別文檔。實現代碼以下:函數

【/home/test/difflib/simple3.py】spa

 

#!/usr/bin/python
#_*_coding:utf-8_*_
#****************************************************************#
# ScriptName: simple3.py
# Author: BenjaminYang
# Create Date: 2019-05-13 12:32
# Modify Author: BenjaminYang
# Modify Date: 2019-05-13 12:32
# Function: 
#***************************************************************#
import difflib
import sys
try:
    textfile1=sys.argv[1] #第一個配置文件路徑參數
    textfile2=sys.argv[2] #第二個配置文件路徑參數
except Exception, e:
    print "Error: " +str(e)
    print "Usage:  simple3.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()
if textfile1=="" or textfile2=="":
    print "Usage: simple3.py filename1 filename2"
    sys.exit()
text1_lines=readfile(textfile1)
text2_lines=readfile(textfile2)
d=difflib.HtmlDiff()  #建立HtmlDiff()對象
print d.make_file(text1_lines,text2_lines)#經過make_file的方法生成HTML文件的對比結果

 

[yhl@myhost part2]$ python simple3.py /home/yhl/devpython/part2/nginx.conf.v1 /home/yhl/devpython/part2/nginx.conf.v2 >diff.html

 

nginx.conf.v1與nginx.conf.v2配置文件對比結果3d

相關文章
相關標籤/搜索