用python比較兩個文件的內容是否相同

有兩個文件,考慮編寫算法,儘量快的比較這兩個文件的內容是否相同。看起來這是一個很是簡單的事情,但仔細思考就會發現,有不少能夠琢磨的地方。我在學習filecmp模塊的cmp方法時,閱讀它的源碼,感慨於做者的思路之縝密,決定寫下這篇文章與你分享這其中的奧妙之處。
最容易想到的方法就是讀取這兩個文件的內容,而後進行比較,可若是文件內容很大怎麼辦?讀取幾個G的內容進行比較是否相等,即使內存上能夠接受,算法性能也不能接受。
考慮計算兩個文件的MD5值並進行比較,弊端和上面所說的同樣,遇到大文件時效率過低。
考慮算法時,一個行之有效的提高性能的方法是將那些簡單但有效的邏輯放在最前面,以期能用最小的代價針對部分輸入得出計算結果,就這個算法而言,能夠先考慮比較兩個文件的大小,若是文件大小都不一樣,那麼文件內容也就不必比較了。
若是文件大小相同,那麼就只能比較文件的內容了,但不該該一次性讀取整個文件的內容,這樣太耗費內存。兩個文件也許在靠前的內容就已經不一樣,不必所有讀取。有人想到逐行比較,這個方法看起來可行,實則存在弊端,一來,咱們只對文本文件按行讀取,二來,一行數據最大能夠有多少個字符,操做系統是沒有什麼限制的,仍是存在內存上的困擾。
最合理的作法是,以二進制讀的方式打開文件,每次讀取固定大小的數據,逐塊來比較,這樣,不論文件是何種類型,均可以快速進行比較。
雖然只是一件很是小的事情,但整個分析的過程卻能考察一我的的功力,細細揣摩,當真收穫不少,如下是示例代碼,感興趣的能夠閱讀filecmp的源碼。
import os

def cmp_file(f1, f2):
st1 = os.stat(f1)
st2 = os.stat(f2)

# 比較文件大小
if st1.st_size != st2.st_size:
return False

bufsize = 8*1024
with open(f1, 'rb') as fp1, open(f2, 'rb') as fp2:
while True:
b1 = fp1.read(bufsize) # 讀取指定大小的數據進行比較
b2 = fp2.read(bufsize)
if b1 != b2:
return False
if not b1:
return True

print(cmp_file('./data/1.txt', './data/2.txt'))


本文分享自微信公衆號 - coolpython(coolpython)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。python

相關文章
相關標籤/搜索