104 votes

Vérifiez si deux fichiers ont le même contenu en python

Doublons possibles :
Trouver des fichiers en double et les supprimer.
En Python, y a-t-il un moyen concis de comparer si le contenu de deux fichiers texte est le même ?

Quel est le moyen le plus simple de voir si deux fichiers ont le même contenu en Python.

Une chose que je peux faire est de calculer le md5 de chaque fichier et de comparer. Y a-t-il un moyen meilleur ?

183voto

Anurag Uniyal Points 31931

Oui, je pense que le hachage du fichier serait le meilleur moyen si vous devez comparer plusieurs fichiers et stocker des hachages pour une comparaison ultérieure. Comme les hachages peuvent entrer en collision, une comparaison octet par octet peut être effectuée en fonction du cas d'utilisation.

En général, une comparaison octet par octet serait suffisante et efficace, ce que le module filecmp fait déjà + d'autres choses aussi.

Voir http://docs.python.org/library/filecmp.html par exemple.

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

Notez que par défaut, filecmp ne compare pas le contenu des fichiers, pour le faire, ajoutez un troisième paramètre shallow=False.

Considération de la vitesse: En général, si seulement deux fichiers doivent être comparés, les hacher et les comparer seraient plus lents que la simple comparaison octet par octet si elle est faite efficacement. par exemple le code ci-dessous essaie de mesurer le temps du hachage par rapport à l'octet par octet

Avertissement: ce n'est pas la meilleure façon de mesurer ou de comparer deux algorithmes et il y a besoin d'améliorations mais cela donne une idée approximative. Si vous pensez que cela devrait être amélioré, dites-le moi et je le changerai.

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

et la sortie est

cmpHash 0.234999895096
cmpByteByByte 0.0

7voto

Vinko Vrsalovic Points 116138

Je ne suis pas sûr que vous vouliez trouver des fichiers en double ou simplement comparer deux fichiers uniques. Si c'est le cas, l'approche ci-dessus (filecmp) est meilleure, si c'est le premier cas, l'approche suivante est meilleure.

Il y a beaucoup de questions concernant la détection de fichiers en double ici. En supposant qu'ils ne soient pas très petits et que la performance est importante, vous pouvez

  • Comparer d'abord les tailles de fichiers, en éliminant tous ceux qui ne correspondent pas
  • Si les tailles des fichiers correspondent, comparer en utilisant le hachage le plus grand possible que vous pouvez gérer, en hachant des morceaux de fichiers pour éviter de lire le fichier entier

Voici une réponse avec mises en œuvre de Python (je préfère celle de nosklo, au fait)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X