python運維常用模塊(四)——文件對比模塊difflib


1.difflib介紹

difflib作為Python的標准庫模塊,無需安裝,作用是對比文本之間的差異,且支持輸出可讀性較強的HTML文檔,與linux下的diff命令類似。我們可以使用difflib對比代碼,配置文件的差別,在版本控制方面是非常有用。Python2.3或更高版本默認自帶difflib模塊,無需額外安裝。

實例1:兩個字符串差異對比

#!/usr/bin/python3
import difflib
# 定義字符串1
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()
# 定義字符串2
text2="""test2
This module provides classes and functions for Comparing sequences.
including HTML and context and unified diffs.
difflib document v7.5"""
text2_lines=text2.splitlines()
# 創建Differ()對象
d=difflib.Differ()
# 采用compare方法對字符串進行比較
diff=d.compare(text1_lines,text2_lines)
print('\n'.join(list(diff)))

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

[root@prometheus01 ~]# python3 simple6.py 
- text1
+ test2
- 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()類,運行python3 simple7.py > diff.html,再使用瀏覽器打開diff.html文件,結果如圖所示,HTML文檔包括了行號,差異標志,圖例等信息,可讀性增強了許多。make_file()方法就可以生成美觀的HTML文檔,代碼如下:

#!/usr/bin/python3
import difflib
# 定義字符串1
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()
# 定義字符串2
text2="""test2
This module provides classes and functions for Comparing sequences.
including HTML and context and unified diffs.
difflib document v7.5"""
text2_lines=text2.splitlines()
## 創建Differ()對象
#d=difflib.Differ()
## 采用compare方法對字符串進行比較
#diff=d.compare(text1_lines,text2_lines)
#print('\n'.join(list(diff)))

# 使用HtmlDiff()方法生成html風格對比文件
d=difflib.HtmlDiff()
print(d.make_file(text1_lines,text2_lines))

實例2:對比Nginx配置文件差異

當我們維護多個Nginx配置時,時常會對比不同版本配置文化的差異,使運維人員更加清晰地了解到不同版本迭代后的更新項,實現的思路是讀取兩個需對比的配置文件,再以換行符作為分隔符,調用difflib.HtmlDiff()生成HTML格式的差異文檔,實現代碼如下:

#!/usr/bin/python
#_*_coding:utf-8_*_
import difflib
import sys
try:
    textfile1=sys.argv[1] #第一個配置文件路徑參數
    textfile2=sys.argv[2] #第二個配置文件路徑參數
except Exception as e:
    print("Error: " +str(e))
    print("Usage:  simple83.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: simple83.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文件的對比結果

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

python simple8.py nginx.conf.v1 nginx.conf.v2  >diff.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM