我有两个 txt 文件,我想通过 Python 去比较这两个文件,我不 care 这两个文件具体不同的地方,我就想要的结果就是,这两个文件相同或者不相同。
我尝试使用 difflib 库,具体代码:
import difflib
text1 = open("1.txt").readlines()
text2 = open("2.txt").readlines()
for line in difflib.unified_diff(text1, text2):
print(line)
1.txt 和 2.txt 是我要做对比的两个 txt 文件,通过 for 循环,找不的是不同的部分。
请问,如何才能去判断,直接输出文件相同或者不相同?
https://docs.python.org/zh-cn/3/library/filecmp.html
filecmp.cmp(f1, f2, shallow=True)
比较名为 f1 和 f2 的文件,如果它们似乎相等则返回 True ,否则返回 False 。
另一個方法(我來亂的.....)
事先提取每個檔案的SHA256放資料庫㳼JSON檔裡,日後只要比對HASH值便知是否相同,不然你日後比對檔案就要byte by byte來比對,就算是函數也一樣,如果有10個檔案就要比對45次(n-1)!,就,能快的起來都難
放資料庫或用lambda去group by hashvalue ..... group 裡的肯定是相同內容的資料
(姑且相信sha256的重複率極低....在檔案大小相同的條件下)
import sys
import hashlib
BUF_SIZE = 65536
sha256 = hashlib.sha256()
with open('/file/1.txt', 'rb') as f:
while True:
data = f.read(BUF_SIZE)
if not data:
break
sha256.update(data)
print("SHA256: {0}".format(sha256.hexdigest()))
題外話,如果你選用filecmp,比對之前你可以先抓檔案大小,相同的才往下比,才不會浪費時間讀檔比對.....
import os
asize = os.stat('/file/1.txt').st_size
bsize = os.stat('/file/2.txt').st_size
if asize==bsize :
if filecmp.cmp('1.txt','2.txt') :
#todo something you want..........................
新手問一下: 10個Hash不是也是比較(n-1)!次嗎? 而且還事先先計算10次再加上json檔讀寫或DB讀寫
ch_lute
json只是偷懶不用SQL存資料,又懶的裝LOCALDB,我都會用JSON存,方便以後取用
至於檔案比對,如果兩個檔案都是上百MB的大檔,你覺得從頭比較尾會比事先提取HASH日後比對來的有效嗎?HASH頂多才幾十個字....我用10個檔案比對45次為例,AHASH==BHASH,字串相同則檔案相同(以相同大小為前提),比對不用零點零幾秒,但如果是兩個大檔案比對,幾十秒跑不掉(看電腦效能)
不過比對手段各高手都有高招,我也只是提出我個人的做法吧..