1.difflib介紹
difflib作為 Python的標準庫模塊,無需安裝,作用是對比文本之間的差異,且支持 輸出可讀性比較強的HTML文檔,與Linux下的diff命令相似。我們可以 使用difflib對比代碼、配置文件的差別,在版本控制方面是非常有用。 Python 2.3或更高版本默認自帶difflib模塊,無需額外安裝。
?
示例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格式
示例運行結果
符號含義說明
生成美觀的對比HTML格式文檔
采用HtmlDiff()類將新文件命名為simple2.py,運行# python simple2.py>diff.html,再 使用瀏覽器打開diff.html文件,結果如圖示2-2所示,HTML文檔包括了 行號、差異標志、圖例等信息,可讀性增強了許多的make_file()方法就可以生成美觀的HTML 文檔,對示例1中代碼按以下進行修改:
示例2:對比Nginx配置文件差異
當我們維護多個Nginx配置時,時常會對比不同版本配置文件的差 異,使運維人員更加清晰地了解不同版本迭代后的更新項,實現的思路 是讀取兩個需對比的配置文件,再以換行符作為分隔符,調用 difflib.HtmlDiff()生成HTML格式的差異文檔。實現代碼如下:
【/home/test/difflib/simple3.py】
?
# !/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配置文件對比結果
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
