Bah tu va pas avoir beaucoup d'autres choix que de calculer l'empreinte de ton fichier et de la comparer à celle de tous les fichiers. Par contre avec des itérateurs tu dois pouvoir t’arrêter facilement dès que le fichier est trouvé
Tu dois pouvoir faire un truc comme ça :
| import hashlib
from os import listdir
from os.path import isfile, join
def hash_file(path):
return hashlib.md5(open(path, 'rb').read()).hexdigest()
def file_present(file_path, dir_path):
h_file = hash_file(file_path)
dir_content = (join(dir_path,f) for f in listdir(dir_path))
return any(hash_file(f) == h_file for f in dir_content if isfile(f))
|
C'est tellement rapide a faire (et dépendant de ta fonction de comparaison), que je ne suis pas surs qu'uil y ai un truc tout fait dans la lib standard pour ça.
edit: Tu peux probablement gagner un peu de temps en comparant tout d’abord la taille des fichier avant le hash car la taille est un élément fort discriminant des fichiers tout en étant rapide à obtenir (plus rapide que calculer un hash en tout cas). En gros ne comparer le hash que si les fichiers sont de taille identique. Mais bon ça dépend beaucoup de ton cas d'utilisation car cette solution est largement la plus simple et relativement rapide.
Par contre ici j'ai considéré que tu ne cherchais pas dans les sous dossier. Si tu veux rechercher dans les sous-dossier, il faut utiliser os.walk
en lieu et place de listdir