介紹如何在 Python 使用各種函數判斷兩個檔案是否相同的方法。
os.path.samefile
函數
os.path.samefile
函數可以依據儲存設備的編號與檔案的 inode 編號來判斷兩個檔案路徑是否為同一個檔案:
#!/usr/bin/python3 import os # 檢查 file1.txt 與 file2.txt 是否相同 if os.path.samefile("file1.txt", "file2.txt"): print("檔案相同") else: print("檔案不同")
os.path.samefile
函數會將連結檔(包含硬連結與軟連結)跟原始檔都視為相同的檔案,而如果是透過複製產生的新檔案,縱使檔案內容都一樣,也會被視為不同的檔案。
檔案類型 | os.path.samefile 判斷結果 |
---|---|
硬連結檔案 | 相同 |
軟連結檔案 | 相同 |
複製檔案 | 不同 |
filecmp.cmp
函數
filecmp.cmp
函數可以依據檔案的類型、大小、修改時間或檔案內容,判斷兩個檔案內容是否相同。
#!/usr/bin/python3 import filecmp # 檢查 file1.txt 與 file2.txt 是否相同 if filecmp.cmp("file1.txt", "file2.txt"): print("檔案相同") else: print("檔案不同")
filecmp.cmp
函數是純粹針對兩個檔案內容進行比較,只要實際的內容相同,則判定為相同。
檔案類型 | filecmp.cmp 判斷結果 |
---|---|
硬連結檔案 | 相同 |
軟連結檔案 | 相同 |
複製檔案 | 相同 |
MD5 檢查碼
MD5 檢查碼是常用來確認檔案是否一致的方法之一,在 Python 中若要計算檔案的 MD5 檢查碼,可以使用 hashlib.md5
函數:
#!/usr/bin/python3 import hashlib # 建立 MD5 物件 md5 = hashlib.md5() # 計算檔案的 MD5 檢查碼 with open("file.txt", "rb") as f: for chunk in iter(lambda: f.read(4096), b""): md5.update(chunk) # 取得 MD5 結果 digest = md5.hexdigest() print(digest)
這裡我們每次從檔案中讀取 4096
位元組的資料進行 MD5 的檢查碼計算,這樣可以避免大型檔案占用過量的記憶體問題。
透過 MD5 檢查碼的比較,即可確認兩個檔案內容是否一致。
SHA1 檢查碼
SHA1 檢查碼是 MD5 檢查碼的替代方案,使用方式幾乎跟 MD5 相同:
#!/usr/bin/python3 import hashlib # 建立 SHA1 物件 sha1 = hashlib.sha1() # 計算檔案的 SHA1 檢查碼 with open("file.txt", "rb") as f: for chunk in iter(lambda: f.read(4096), b""): sha1.update(chunk) # 取得 SHA1 結果 digest = sha1.hexdigest() print(digest)
SHA256 檢查碼
MD5 與 SHA1 目前皆由於安全性因素,已經不被大多數的加密場景所接受,而 SHA256 則是目前最常被採用的檢查碼之一:
#!/usr/bin/python3 import hashlib # 建立 SHA256 物件 sha256 = hashlib.sha256() # 計算檔案的 SHA256 檢查碼 with open("file.txt", "rb") as f: for chunk in iter(lambda: f.read(4096), b""): sha256.update(chunk) # 取得 SHA256 結果 digest = sha256.hexdigest() print(digest)