如何在 Python 中查詢兩個檔案之間的差異?


當您涉足檔案處理領域時,經常需要識別兩個檔案之間的差異。Python 為我們提供了一系列強大的工具,可以輕鬆而精確地完成此任務。在本文中,我們將介紹幾種不同的方法來揭示 Python 中兩個檔案之間的差異。每種方法都具有獨特的功能和適應性,使您能夠無縫地比較不同大小和格式的檔案。作為一名 Python 編碼愛好者,我們將引導您完成每種方法,並以使用者友好的方式提供分步說明。在本文結束時,您將掌握進行檔案比較的知識,並充滿信心和準確性。因此,讓我們開始這段冒險之旅,學習 Python 中檔案比較的奧秘!

瞭解 Python 中檔案比較的重要性

在我們開始檢查程式碼示例之前,我們最好先了解 Python 中檔案比較的重要性。檔案比較使我們能夠識別兩個檔案之間的更改、相似之處和差異。此過程是版本控制、資料驗證和檢測配置檔案更改的重要方面。

利用 filecmp 模組

我們的第一個方法展示了透過使用 filecmp 模組進行檔案比較,該模組以其高效和簡單的功能而聞名。

示例

import filecmp

file1 = "file1.txt"
file2 = "file2.txt"

comparison = filecmp.cmp(file1, file2)
print("Files are the same:", comparison)

輸出

對於某些檔案,輸出如下

Files are the same: False

在此示例中,我們呼叫 filecmp 模組,這是一個用於比較檔案的已知函式庫。檔案 file1.txt 和 file2.txt 的路徑分別透過 file1 和 file2 變數得知。filecmp.cmp() 函式繼續比較這兩個檔案的內容。如果檔案相同,則該函式返回 True;否則,它返回 False。控制檯透過顯示比較結果來提供幫助。

採用 difflib 模組

我們的第二個示例解釋了透過 difflib 模組進行檔案比較,該模組是用於比較序列和檔案的工具庫。

示例

import difflib

file1 = "file1.txt"
file2 = "file2.txt"

with open(file1, "r") as f1, open(file2, "r") as f2:
   diff = difflib.unified_diff(f1.readlines(), 
f2.readlines(), fromfile=file1, tofile=file2)

for line in diff:
   print(line)

輸出

對於某些檔案,輸出如下

--- file1.txt
+++ file2.txt
@@ -1 +1 @@
-hello
+hi

在這裡,我們匯入 difflib 模組,這是一個用於比較序列(包括文字檔案中的行)的函式庫。我們呼叫 open() 函式,讀取兩個檔案的內容,並將它們儲存在不同的變數 f1 和 f2 中。difflib.unified_diff() 函式開始工作,揭示檔案之間的差異。fromfile 和 tofile 引數使我們能夠在輸出中指定檔名。我們有效地確定差異並在控制檯中顯示它們。

掌握 hashlib 模組

第三種方法教授了透過 hashlib 模組進行檔案比較的技術,它是 SHA-1 雜湊值的先驅。

示例

import hashlib

def file_hash(filename):
   sha1_hash = hashlib.sha1()
   with open(filename, "rb") as f:
     while chunk := f.read(8192):
       sha1_hash.update(chunk)
   return sha1_hash.hexdigest()

file1 = "path/to/first/file"
file2 = "path/to/second/file"

hash1 = file_hash(file1)
hash2 = file_hash(file2)

comparison = (hash1 == hash2)
print("Files are the same:", comparison)

輸出

對於某些檔案,輸出如下

Files are the same: False

在此示例中,hashlib 模組為我們提供了加密雜湊函式。一個函式 file_hash() 繼續接受一個檔名並返回其 SHA-1 雜湊值。檔案以二進位制模式讀取,逐漸使用資料塊更新雜湊物件。我們使用 == 運算子比較兩個檔案的雜湊值,輸出顯示在控制檯上。

揭示 fileinput 模組

我們的下一個示例展示了檔案比較的用例,透過使用 fileinput 模組,簡化了對多個檔案的處理。

示例

import fileinput

file1 = "file1.txt"
file2 = "file2.txt"

for line1, line2 in zip(fileinput.input(file1), 
fileinput.input(file2)):
   if line1 != line2:
     print(f"File1: {line1.strip()}\nFile2: {line2.strip()}\n")

輸出

對於某些檔案 file1.txt 和 file2.txt,輸出如下

File1: hello
File2: hi

在此演示中,fileinput 模組使得能夠簡化逐行讀取多個檔案。zip() 函式繼續同步迭代兩個檔案的對應行。如果在行之間發現差異,我們將兩個檔案中的行重定向到控制檯。strip() 方法確保行中沒有多餘的前導或尾隨空格字元。

利用 difflib.HtmlDiff 類

在最後一個示例中,我們透過 difflib.HtmlDiff 類完成檔案比較,它是 HTML 格式差異的建立者。

示例

import difflib

file1 = "file1.txt"
file2 = "file2.txt"

with open(file1, "r") as f1, open(file2, "r") as f2:
   diff = difflib.HtmlDiff().make_file(f1.readlines(), 
f2.readlines(), fromdesc=file1, todesc=file2)

with open("diff.html", "w") as html_file:
   html_file.write(diff)

在此示例中,difflib 模組再次出現,因為我們使用 HtmlDiff 類建立 HTML 格式的比較。兩個檔案的內容透過 open() 函式呼叫,分配給單獨的變數 f1 和 f2。difflib.HtmlDiff().make_file() 成為焦點,將檔案差異定義為 HTML,並透過使用 fromdesc 和 todesc 引數提供檔案描述。生成的 HTML 比較被寫入名為“diff.html”的檔案中。

簡而言之,在 Python 中比較兩個檔案的技能對於任何從事檔案處理和資料驗證的開發人員來說都是一項寶貴的財富。在本文中,我們已經遍歷了一些不同的示例來確定檔案之間的差異,每個示例都擁有自己的一套獨特的優勢和用途。

無論是透過 filecmp 模組、difflib 模組、hashlib 模組、fileinput 模組,還是透過使用 difflib.HtmlDiff 建立 HTML 格式的差異,每種方法都賦予您輕鬆比較檔案並以堅定精確度檢測差異的能力。

隨著您的 Python 之旅繼續,請利用您新獲得的檔案比較技能來簡化資料驗證、版本控制和檔案處理。願這些檔案比較技術將您的 Python 專業知識提升到新的高度,因為您將構建強大而高效的檔案處理應用程式。

更新於: 2023 年 8 月 3 日

9K+ 瀏覽量

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.