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