python difflib模塊講解示例

2021-12-30 測試工程師小站

difflib模塊提供的類和方法用來進行序列的差異化比較,它能夠比對文件並生成差異結果文本或者html格式的差異化比較頁面,如果需要比較目錄的不同,可以使用filecmp模塊。

class difflib.SequenceMatcher

此類提供了比較任意可哈希類型序列對方法。此方法將尋找沒有包含『垃圾』元素的最大連續匹配序列。

通過對算法的複雜度比較,它由於原始的完形匹配算法,在最壞情況下有n的平方次運算,在最好情況下,具有線性的效率。

它具有自動垃圾啟發式,可以將重複超過片段1%或者重複200次的字符作為垃圾來處理。可以通過將autojunk設置為false關閉該功能。

class difflib.Differ

此類比較的是文本行的差異並且產生適合人類閱讀的差異結果或者增量結果,結果中各部分的表示如下:

class difflib.HtmlDiff

此類可以被用來創建HTML表格 (或者說包含表格的html文件) ,兩邊對應展示或者行對行的展示比對差異結果。

make_file(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])

make_table(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])

以上兩個方法都可以用來生成包含一個內容為比對結果的表格的html文件,並且部分內容會高亮顯示。

difflib.context_diff(a, b[, fromfile][, tofile][, fromfiledate][, tofiledate][, n][, lineterm])

比較a與b(字符串列表),並且返回一個差異文本行的生成器

示例:

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> for line in context_diff(s1, s2, fromfile='before.py', tofile='after.py'):
...     sys.stdout.write(line)  
*** before.py
--- after.py
***************
*** 1,4 ****
! bacon
! eggs
! ham
  guido
--- 1,4 ----
! python
! eggy
! hamster
  guido

difflib.get_close_matches(word, possibilities[, n][, cutoff])

返回最大匹配結果的列表

示例:

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('apple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']

difflib.ndiff(a, b[, linejunk][, charjunk])

比較a與b(字符串列表),返回一個Differ-style 的差異結果

示例:

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(1),
...              'ore\ntree\nemu\n'.splitlines(1))
>>> print ''.join(diff),
- one
?  ^
+ ore
?  ^
- two
- three
?  -
+ tree
+ emu

difflib.restore(sequence, which)

返回一個由兩個比對序列產生的結果

示例

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(1),
...              'ore\ntree\nemu\n'.splitlines(1))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print ''.join(restore(diff, 1)),
one
two
three
>>> print ''.join(restore(diff, 2)),
ore
tree
emu

difflib.unified_diff(a, b[, fromfile][, tofile][, fromfiledate][, tofiledate][, n][, lineterm])

比較a與b(字符串列表),返回一個unified diff格式的差異結果.

示例:

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> for line in unified_diff(s1, s2, fromfile='before.py', tofile='after.py'):
...     sys.stdout.write(line)   
--- before.py
+++ after.py
@@ -1,4 +1,4 @@
-bacon
-eggs
-ham
+python
+eggy
+hamster
 guido

實際應用示例

比對兩個文件,然後生成一個展示差異結果的HTML文件

#coding:utf-8
'''
file:difflibeg.py
date:2017/9/9 10:33
author:lockey
email:lockey@123.com
desc:diffle module learning and practising 
'''
import difflib
hd = difflib.HtmlDiff()
loads = ''
with open('G:/python/note/day09/0907code/hostinfo/cpu.py','r') as load:
    loads = load.readlines()
    load.close()

mems = ''
with open('G:/python/note/day09/0907code/hostinfo/mem.py', 'r') as mem:
    mems = mem.readlines()
    mem.close()

with open('htmlout.html','a+') as fo:
    fo.write(hd.make_file(loads,mems))
    fo.close()

運行結果:

生成的html文件比對結果: 

相關焦點

  • python基礎系列|示例講解時間模塊datetime
    Python 有很多種方式處理日期和時間,常見的時間處理的模塊是datetime、time、calendar。能融匯貫通的了解和使用這三個模塊,才能輕而易舉地用python處理時間。本文以此為目的,通過講述各個時間模塊的概述、函數及相關知識細節、以及相應的示例來講透它們的使用方式。
  • Python運維中常用的庫和模塊
    2、IPy(http://github.com/haypo/python-ipy),輔助IP規劃。3、dnspython(http://dnspython.org)Python實現的一個DNS工具包。4、difflib:difflib作為Python的標準模塊,無需安裝,作用是對比文本之間的差異。
  • Python學習筆記:模塊和包
    ,示例:1# 導入sys模塊的argv,winver成員2from sys import argv, winver3# 使用導入成員的語法,直接使用成員名訪問4print(argv[0])5print(winver)為多個模塊指定別名,示例:1# 導入sys模塊的argv,winver成員,並為其指定別名v
  • glob - 被忽略的python超強文件批量處理模塊
    Python-glob模塊簡介glob模塊通配符glob模塊是python自己帶的一個文件操作模塊,可以查找符合自己需求的的文件,並且支持通配符操作,主要包括以下三種匹配模式:**匹配所有文件,包括目錄,子目錄和子目錄裡面的文件。
  • python命令參數及模塊的導入學習
    python已經成為程式語言排行榜的老大了,要向不被時代淘汰,就要緊跟時代步伐,在IT編程世界的今天,不會python可是不行的,今天繼續學習python的命令及相關模塊導入學習。import 與 from...import
  • 三分鐘從入門到精通——Python模塊
    中的模塊:假設您正在使用python解釋器。因此,python有一種方法可以將該函數定義放入文件中並隨時使用。模塊是ModuleType類型的對象。該模塊基本上是一個python文件(擴展名為的文件.py),其中包含定義和語句(例如:類,函數,變量等)。Python中的模塊為我們提供了邏輯上組織代碼的靈活性。我們使用模塊將大型程序分解為小的可管理文件。
  • Python通過fnmatch模塊實現文件名匹配
    這篇文章主要介紹了Python通過fnmatch模塊實現文件名匹配,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,
  • python基礎--自定義模塊、import、from......import......
    如果你退出python解釋器然後重新進入,那麼你之前定義的函數或者變量都將丟失,因此我們通常將程序寫到文件中以便永久保存下來,需要時就通過python test.py方式去執行,此時test.py被稱為腳本script。所以,腳本就是一個python文件,比如你之前寫的購物車,模擬博客園登錄系統的文件等等。3.模塊的分類Python語言中,模塊分為三類。
  • python教程之七模塊與函數庫
    模塊上一章,我們講解了函數的概念及其使用方法和案例等,我們定義了函數後,可以多次調用該函數來使用,但是如果我們從python解釋器退出後,這些函數信息就都無效了,為此,我們本章提供了模塊這個概念。我們把這些定義存放在文件裡,保存在磁碟裡,這個文件被稱為模塊。模塊是包含所有我們定義的函數和變量的文件,可以被別的程序引入,用來使用模塊裡面的信息。
  • Python2.7安裝sympy模塊
    現在這個程序庫包括26個模塊,可以滿足常用的計算需求,如符號計算、積分、代數、離散數學、量子物理、畫圖與列印等,計算結果輸出為LaTeX或其他格式。SymPy程序庫分為一個核心模塊和多個高級可選模塊: ·Assumptions:假設引擎 ·Concrete:符號積和符號總和 ·Core basic class structure:基本的,及加、乘、指數等 ·Functions:基本的函數和特殊的函數 ·Galgebra:幾何代數 ·Geometry
  • python String模塊在實際應用的代碼介紹
    python String模塊在實際應用的代碼介紹 本文以python String模塊的相關代碼的方式來介紹python String模塊的具體應用方法的介紹,那麼下面的文章就讓我們一起分享吧!
  • 萬字長文詳解Python正則表達式及re模塊
    exp) 零寬度負回顧後發斷言,來斷言此位置的前面不能匹配表達式exp,Python中提供的re模塊使Python擁有全部正則表達式的功能!))  # None開局導入re模塊,r""表示為一個正則表達式,因為string2中間出現了一個數字5 所以不匹配!
  • python unittest關鍵API說明及示例
    前言本次就python unittest單元測試框架的一些基本的、常用的API 進行分享,以便大家後續更深入的熟悉和應用unittest。TestCase類APITeseCase類實例化的對象是最小的可測單元顆粒。
  • python中的Requests模塊
    講解對象:python中的Requests模塊作者:融水公子 rsgz介紹:1 Requests 是一個第三方 Python 模塊2 Requests 唯一的一個非轉基因的apt-get update  #更新軟體列表2 安裝pip3執行命令:sudo apt-get install python3
  • python的模塊和序列
    前言概要本章節主要講述python中的模塊和序列的概念以及如何使用模塊和序列化方面的知識。模塊的概念在python中有個關鍵詞是import,代表的是導入、加載的意思。通常import加載的模塊分為四個通用類別:使用python語言編寫的代碼(後綴名為py的文件)已被編譯為共享庫或DLL的C或C++的擴展使用C編寫並連接到python解釋器的內置模塊
  • 第38天:Python decimal 模塊
    在我們開發工作中浮點類型的使用還是比較普遍的,對於一些涉及資金金額的計算更是不能有絲毫誤差,Python 的 decimal  模塊為浮點型精確計算提供了支持。1 簡介 decimal 模塊設計以十進位數、算術上下文和信號這三個概念為中心。
  • python之Argparse模塊
    argparse 模塊可以輕鬆編寫用戶友好的命令行接口。
  • 第31天:Python random 模塊
    在本節中繼續介紹 Python 提供的常用模塊 random 模塊,它的主要功能是用來生成偽隨機數的。random 模塊Python 提供的 random 模塊實現了各種分布式的偽隨機數生成器。該模塊主要包含以下幾種常用的函數。random()函數random()函數可以隨機生成一個[0,1)的浮點數。
  • 基於Python的Modbus RTU應用示例
    Python主站程序首先要在自己的電腦中部署python環境,請參閱歷史文章《基於python的MQTT客戶端》一文。python代碼中會用到modbus_tk庫,如何安裝modbus_tk請翻看《使用Python操作Ge Fanuc PLC》內容。