1.difflib介紹
difflib作為 Python的標(biāo)準(zhǔn)庫模塊,無需安裝,作用是對比文本之間的差異,且支持 輸出可讀性比較強(qiáng)的HTML文檔,與Linux下的diff命令相似。我們可以 使用difflib對比代碼、配置文件的差別,在版本控制方面是非常有用。 Python 2.3或更高版本默認(rèn)自帶difflib模塊,無需額外安裝。
?
示例1:兩個(gè)字符串的差異對比
[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() # 以行進(jìn)行分隔 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() # 創(chuàng)建Differ()對象 diff=d.compare(text1_lines,text2_lines) # 采用compare方法對字符串進(jìn)行比較 print ' \n ' .join(list(diff))
本示例采用Differ()類對兩個(gè)字符串進(jìn)行比較,另外difflib的 SequenceMatcher()類支持任意類型序列的比較,HtmlDiff()類支持 將比較結(jié)果輸出為HTML格式
示例運(yùn)行結(jié)果
符號(hào)含義說明
生成美觀的對比HTML格式文檔
采用HtmlDiff()類將新文件命名為simple2.py,運(yùn)行# python simple2.py>diff.html,再 使用瀏覽器打開diff.html文件,結(jié)果如圖示2-2所示,HTML文檔包括了 行號(hào)、差異標(biāo)志、圖例等信息,可讀性增強(qiáng)了許多的make_file()方法就可以生成美觀的HTML 文檔,對示例1中代碼按以下進(jìn)行修改:
示例2:對比Nginx配置文件差異
當(dāng)我們維護(hù)多個(gè)Nginx配置時(shí),時(shí)常會(huì)對比不同版本配置文件的差 異,使運(yùn)維人員更加清晰地了解不同版本迭代后的更新項(xiàng),實(shí)現(xiàn)的思路 是讀取兩個(gè)需對比的配置文件,再以換行符作為分隔符,調(diào)用 difflib.HtmlDiff()生成HTML格式的差異文檔。實(shí)現(xiàn)代碼如下:
【/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] # 第一個(gè)配置文件路徑參數(shù) textfile2=sys.argv[2] # 第二個(gè)配置文件路徑參數(shù) except Exception, e: print " Error: " + str(e) print " Usage: simple3.py filename1 filename2 " sys.exit() def readfile(filename): # 文件讀取分隔函數(shù) 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() # 創(chuàng)建HtmlDiff()對象 print d.make_file(text1_lines,text2_lines) # 通過make_file的方法生成HTML文件的對比結(jié)果
?
[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配置文件對比結(jié)果
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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