iT邦幫忙

1

使用 Python 比较两个文件

我有两个 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 循环,找不的是不同的部分。
请问,如何才能去判断,直接输出文件相同或者不相同?

harutsuki iT邦新手 5 級 ‧ 2020-08-06 18:03:34 檢舉
檢查兩邊的MD5 應該就能解決
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
一級屠豬士
iT邦大師 1 級 ‧ 2020-08-05 22:00:27
最佳解答

https://docs.python.org/zh-cn/3/library/filecmp.html

filecmp.cmp(f1, f2, shallow=True)

比较名为 f1 和 f2 的文件,如果它们似乎相等则返回 True ,否则返回 False 。

不等就不等,相等就相等
似乎相等

像極了愛情
/images/emoticon/emoticon24.gif

4
japhenchen
iT邦超人 1 級 ‧ 2020-08-06 08:00:10

另一個方法(我來亂的.....)

事先提取每個檔案的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..........................
ch_lute iT邦新手 5 級 ‧ 2020-08-06 11:51:14 檢舉

新手問一下: 10個Hash不是也是比較(n-1)!次嗎? 而且還事先先計算10次再加上json檔讀寫或DB讀寫

ch_lute
json只是偷懶不用SQL存資料,又懶的裝LOCALDB,我都會用JSON存,方便以後取用

至於檔案比對,如果兩個檔案都是上百MB的大檔,你覺得從頭比較尾會比事先提取HASH日後比對來的有效嗎?HASH頂多才幾十個字....我用10個檔案比對45次為例,AHASH==BHASH,字串相同則檔案相同(以相同大小為前提),比對不用零點零幾秒,但如果是兩個大檔案比對,幾十秒跑不掉(看電腦效能)

不過比對手段各高手都有高招,我也只是提出我個人的做法吧..

我要發表回答

立即登入回答