IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Comparaison de deux fichiers txt avec une reponse IDENTIQUE: oui ou non [Python 3.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 17
    Points : 7
    Points
    7
    Par défaut Comparaison de deux fichiers txt avec une reponse IDENTIQUE: oui ou non
    Bonjour
    Une question est souvent posée: la comparaison de deux fichiers texte avec une reponse = identique oui ou non.
    Je fais parti de ceux qui bute sur ce code, malgres plusieurs essais (le nombre un dans chaque fichiers) le resultat est toujours "faux"
    Voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    test_lines = open("test.txt").readlines()
    correct_lines = open("correct.txt").readlines()
     
    for test, correct in zip(test_lines, correct_lines):
        print(test)
        print(correct)
     
    if test == correct:
            print ('ok')
    else:
        print('faux')
    Ma question est, pourquoi mon resultat est " faux"

    En remerciant ceux qui connaissent la reponse.
    Pascal

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    re-re-voyez vos indentations car votre test n'est pas dans le block de la boucle "for".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    Tu t'y prends mal pour comparer deux fichiers "texte".

    Déjà, ont-ils (les deux fichiers) le même nombre de lignes ?
    Zip s'arrête sur la plus petite liste (ici de lignes).

    Et, sinon, pour quoi c'est faux ? Les deux éléments du dernier couple (test, couple) ne sont pas égaux.

    Impossible de t'en dire plus avec les infos que tu donnes.

    Mais sinon, comparer deux fichiers est l'affaire de l'OS. Sauf si c'est un exercice.

    [EDIT après le message de Wiztricks]
    J'ai mis les balises codes ... Forcément, avec un code en vrac, il faut "deviner" ce qu'il y a dans la tête du PO... Pas toujours facile.
    Ai-je bien restitué le code initial ?
    Mais, de toute façon, ici, ça part mal.[EDIT]
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par pascaljqt Voir le message
    Une question est souvent posée: la comparaison de deux fichiers texte avec une reponse = identique oui ou non.
    Souvent posée ? Moi je ne l'ai jamais vue. C'est peut-être parce que c'est assez trivial. On lit en parallèle et tant que les octets lus sont égaux on continue à lire...

    Citation Envoyé par pascaljqt Voir le message
    Ma question est, pourquoi mon resultat est " faux"
    Allez, je tente: parce que la variable "test" n'est pas égale à la variable "correct"...

    Sans déconner, tu ne vois pas que ton test ne prouve rien ? Déjà moi je veux faire un test de mon code, je le fais sur le même fichier ouvert 2 fois. Au-moins je suis certain qu'il est égal à lui-même.
    Ensuite tu traites toutes les lignes deux à deux mais tu ne vérifies rien. Tu fais ensuite la vérification après que la boucle soit terminée (donc seulement sur la dernière ligne). Donc si les deux fichiers sont différents sur une ligne autre que la dernière, ton algo ne le voit pas !!! Apparemment il semble toutefois qu'ils soient différents au-moins sur la dernière donc là au-moins tu sais qu'il sont différents.

    Quelques remarques annexes: quand on ouvre un fichier, c'est bien de spécifier son mode d'ouverture, c'est bien aussi de le fermer après l'avoir lu (comme les poissons d'Ordralphabétix une fois que le devin les a lus !!!). Ou alors tu utilises with qui gère lui-même la fermeture...

    Au fait, ton code (testé chez-moi sur le même fichier) m'affiche bien "ok"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    perso je ferais directement un truc comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import hashlib
    with open("test.txt", "r") as f1, open("correct.txt", "r") as f2:
       print ("IDENTIQUE:", "oui" if hashlib.md5(f1.read()).hexdigest() == hashlib.md5(f2.read()).hexdigest() else "non")
    edit: ou même comme ça en carrément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import filecmp
    print ("IDENTIQUE:", "oui" if filecmp.cmp("correct.txt", "test.txt") else "non")

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans la mesure où on cherche seulement une réponse binaire "identique ou pas" , le plus rapide est de comparer les blocs d'octets (lecture 'rb') et de s'arrêter au 1er bloc qui n'est pas identique (s'il y en a un) pour renvoyer False. Si on arrive à la fin sans rencontrer de différence, on renvoie True. C'est donc quand les fichiers sont identiques que c'est le plus long parce qu'il faut tout lire! La taille du buffer de lecture est un paramètre d'efficacité de l'opération (4k? 8ko? 16ko? 32ko?) en fonction des tailles des fichiers à comparer.

    A noter que si les fichiers sont de petite taille (code source par exemple), on peut lire en binaire (lecture 'rb' avec .read()) la totalité des 2 fichiers en une seule fois pour les comparer.

    C'est plus rapide que de lire les lignes. C'est plus rapide, aussi, que de comparer les hash codes parce qu'il faut lire complètement les 2 fichiers pour cela, même quand ils sont différents à partir du début. De plus, les hash codes ne donnent pas la certitude d'identité (même si la probabilité d'erreur est faible).

    Cas particuliers: si on voulait comparer les textes avec la possibilité que les fins de lignes soient différentes entre les 2 fichiers (fin de ligne Windows ou Unix), la comparaison des lignes aurait un sens, mais il faudrait neutraliser les fins de lignes (avec .rstrip() par exemple) pour faire les comparaisons. Attention également si il y avait une possibilité que les textes soient identiques mais avec un encodage différent (utf-8, latin1, ...) entre les 2 fichiers.

    [edit] voilà un petit code qui fait le boulot (Python 3.4):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import os
     
    def comparefichiers(fichier1, fichier2, lgbuf=16*1024):
        """Compare les 2 fichiers et renvoie True s'ils sont identiques
           lgbuf est la taille du buffer de lecture
        """
        if os.path.getsize(fichier1) != os.path.getsize(fichier2):
            return False # les fichiers n'ont pas la même longueur
        with open(fichier1, "rb") as f1, open(fichier2, "rb") as f2:
            while True:
                buf1 = f1.read(lgbuf)
                if len(buf1)==0:
                    return True # fin de lecture: pas de différence
                buf2 = f2.read(lgbuf)
                if buf1!=buf2:
                    return False # on a trouvé une différence
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/08/2014, 16h37
  2. [XL-2010] Modifier fichier .txt avec une macro
    Par QuentinR dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 18/09/2013, 15h52
  3. comparaison de deux fichiers textes avec un script python
    Par zekruss dans le forum Général Python
    Réponses: 1
    Dernier message: 10/11/2009, 05h52
  4. Réponses: 2
    Dernier message: 01/05/2007, 18h50
  5. Réponses: 3
    Dernier message: 05/03/2007, 23h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo