1. ホーム
  2. python

[解決済み] Pythonで2つのファイルが同じ内容かどうかを確認する [重複].

2023-06-24 15:48:05

質問

重複の可能性があります。

重複するファイルを見つけ、削除します。

Pythonでは、2つのテキストファイルの内容が同じであるかどうかを比較する簡潔な方法はありますか?

Pythonで2つのファイルがコンテンツ的に同じであるかどうかを確認する最も簡単な方法は何ですか。

私ができることの1つは、各ファイルをmd5して比較することです。 より良い方法はありますか?

どのように解決するのですか?

複数のファイルを比較し、後で比較するためにハッシュを保存する必要がある場合、ファイルをハッシュ化するのが最適な方法だと考えています。ハッシュは衝突する可能性があるので、ユースケースによってはバイト単位で比較することもあります。

一般的にはバイト単位の比較で十分かつ効率的であり、filecmpモジュールがすでに行っていることであり、他のことも行っています。

参照 http://docs.python.org/library/filecmp.html

>>> import filecmp
>>> filecmp.cmp('file1.txt', 'file1.txt')
True
>>> filecmp.cmp('file1.txt', 'file2.txt')
False

速度を考慮する。 通常、2つのファイルを比較する必要がある場合、それらをハッシュ化して比較すると、単純なバイト単位の比較よりも効率的に行われた場合、遅くなります。

免責事項: これは2つのアルゴリズムを比較する最良の方法ではなく、改善の必要がありますが、大まかなアイデアを与えるものです。もし、改善すべきと思われる点があれば教えてください。

import random
import string
import hashlib
import time

def getRandText(N):
    return  "".join([random.choice(string.printable) for i in xrange(N)])

N=1000000
randText1 = getRandText(N)
randText2 = getRandText(N)

def cmpHash(text1, text2):
    hash1 = hashlib.md5()
    hash1.update(text1)
    hash1 = hash1.hexdigest()

    hash2 = hashlib.md5()
    hash2.update(text2)
    hash2 = hash2.hexdigest()

    return  hash1 == hash2

def cmpByteByByte(text1, text2):
    return text1 == text2

for cmpFunc in (cmpHash, cmpByteByByte):
    st = time.time()
    for i in range(10):
        cmpFunc(randText1, randText2)
    print cmpFunc.func_name,time.time()-st

であり、出力は

cmpHash 0.234999895096
cmpByteByByte 0.0