difflib模塊文件內容差異對比


簡介    

      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 "\n".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 "\n".join(list(diff)) 

  將以上修改為

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

 將以上程序保存為sample2.py ,運行python sample2.py > diff.html,用瀏覽器打開保存的html文件

  • 比對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 

通過瀏覽器查看兩個文件差異

附nginx配置文件

nginx.conf.zip

 


免責聲明!

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



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