Python

Python 比較兩個檔案內容是否相同的各種方法

介紹如何在 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)

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago