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 :

Comparer 2 fichiers avec python


Sujet :

Python

  1. #1
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut Comparer 2 fichiers avec python
    Bonjour a tous

    j'ai 2 fichiers type txt et je voudrais comparer le contenu pour savoir les ID qui existent dans un des fichiers et qui n'existe pas dans l'autre.
    Je voudrais le faire avec python pour apprendre, car je n'ai aucune idée de comment programmer avec python.

    Ce que je demande est hors du forum j'en ai conscience.
    Je poste quand même pour si quelqu'un peu perdre un peu de son temps.

    Voici le format des fichiers:
    Chaque block LDR est un registre et les fichiers contienent multitude de registres.
    Le champs que je veux comparer est le =001
    ici comme valeur: .b13965621


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    =LDR  00730nam a2200253 a 4500
    =001  .b13965621
    =005  20140101192443.0
    =008  090921s1990\\\\sp\a\\\\\\\\\\000\0\spa\d
    =010  \\$a.b13965621
    =020  \\$a8437602092
    =650  04$aGravat$z--Espanya$x--Història$911
    =830  \0$aCuadernos de arte (Cátedra)
    =952  \\$p3$d2009/09/15$t2011/09/27$cSGG$7P$adhub$bdhub$yLL$oG121.03 Gal$4B$eMAAB$m3$s2009/11/04$0C$zMAAB - GAG
    =952  \\$p187$d2009/11/19$t2011/09/27$cSGG$7P$adhub$bdhub$yLL$oG121.03 Gal$4B$eMAAB$m0$0C$zMAAB - GAG
    =999  \\$c1$d1
    Je vais essayer de le faire en pseudo code juste pour la logique:
    1 lire le 1er fichier
    detecter chaque registre grace a =LDR
    A l'interieur de chaque registre detecter le champo =001
    placer sa valeur dans un array
    2 Faire idem avec le 2 eme fichier
    3 comparer les valeur de chaque array et imprimer le report.

    Quelqu'un saurait le faire ou m'aider pas a pas?
    Si oui je passe les 2 fichiers.

    D'avancer merci

  2. #2
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Salut !!!

    Alors on va te fiare le code a ta place, mais on t'aidera avec plaisir, ce forum est là pour ça

    Alors en Python tu as differente façon de lire un fichier (tu peux lire CECI)

    Ce que tu récupère est donc au final une string, une chaine de caractère. Au sein de cette chaine de caractère tu peut faire une recherche avec un string.find (info d'utilisation sur la DOC OFFICIELLE).

    Après ce n'est qu'un simple test de comparaison. Cela te convient-il?
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  3. #3
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Salut
    a sympa... Alors grace a ces doc j'ai pu faire ce bout de code:

    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 re
     
    # lecture fichier 1
    f=file("dhub-items4.mrk", "r")
    content=f.read().splitlines()
    f.close()
     
    # creation fichier destination
    f=file("item_001.txt","w")
    # parcour de toutes les lignes du fichier original
    for line in content:
            # avec un match du champs que je veux comparer
            if re.match("^[=001]",line):
                    # sauvagarde de la ligne dans le nouveau fichier
                    f.write(line+"\n")
    f.close()
    Grace a ce code j'arrive a creer un autre fichier avec des lignes.. Mais j'arrive pas a isoler seulement la ligne que je veux comparer.
    Je souaite recuperer seulement ceci:
    =001 .b13965621


    Et je recupere tout.. Le match ne marche pas.

    Dans le fichier original les lignes se presentent comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    =LDR  00000nam  2200000Ia 45e0
    =001  .b35697039
    =952  \\$p7$d2009/09/25$t2011/09/15$cSGI$7P$adhub$bdhub$yLL$oI2.038.1/3 Mod$4B$eMAAB$m3$s2012/10/02$0C$zMAAB - MADB
    Comment faire pour isole seulement le =001 ?

    D'avance merci

  4. #4
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Salut,

    Une fois que tu a recupere le contenu de ton fichier dans un string, utilise la mtehode ".split("\n")" (info ICI) afin de récupérer une liste contenant chacune de tes lignes du fichier. A partir de là, tu n'a qu'à comparer le debut de chaque ligne (liste[:4]) à la chaine recherchée ("=001").
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Hello,

    Normal, ta regexp matche toutes les lignes qui commencent par =, 0 ou 1. Vu que toutes tes lignes commencent par =, bah voila.

    Plus simplement un objet str fournit la méthode startswith() pour faire ce que tu veux. C'est plus simple et plus efficace qu'utiliser des regexp.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if line.startswith('=001'):
        ...blabla...
    Pourfendeur de singletons en croisade

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Essaye avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if re.search("(?<==001)", line):

  7. #7
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Citation Envoyé par Petibidon Voir le message
    Hello,

    Normal, ta regexp matche toutes les lignes qui commencent par =, 0 ou 1. Vu que toutes tes lignes commencent par =, bah voila.

    Plus simplement un objet str fournit la méthode startswith() pour faire ce que tu veux. C'est plus simple et plus efficace qu'utiliser des regexp.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if line.startswith('=001'):
        ...blabla...
    J'adore ce forum, on en apprend tous les jours. Je ne le conaissais pas ce startwith(). Je note. Merci beaucoup
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  8. #8
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Salut a tous

    ok j'ai essayé avec

    et effectivement le fichier qui se cré est exactement la liste des champs =001, genial !!
    Maintenant j'ai 2 fichiers avec le champs =001.
    Le dernier truc a faire c'est de comparer les 2 pour voir quels sont les 001 du 1er qui n'existe pas dans le 2eme.
    Surement il existe une forme facile avec python.. E attendant de trouver la reponse (j'ai vu difflib)
    Je vais faire ça avec sql...
    Merci a tous !! le python c'est cool

  9. #9
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Bonjour a tous

    maintenant je dois faire une autre prouesse (pour moi).. J'ai essayé le code mais y'a une erreur.
    Voila le plan.
    A partir du même fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    =LDR  02030nam a2200313 a 4500
    =001  .b18020409
    =005  20140311231137.0
    =710  2\$aMuseu de les Arts Decoratives (Barcelona, Catalunya)$91060
    =852  4\$aDHUB.$c Res.$j A-XX-693.$z-- Fons MADB.$q-- Enq. rústica (malmesa). Segell del Museu d'Arts Decoratives. Antoacions ms.$t 1
    =852  4\$aDHUB.$c Res.$j A-XX-694.$q-- Enq. rústica.$t 2
    =852  4\$aDHUB.$c Res.$j A-XX-695.$z-- Fons MTIB.$q-- Enq. rústica (malmesa). Taques d'òxid. Segell del Museu Tèxtil i d'Indument▒| ria de Barcelona. Antoacions mm
    s.$t 3
    =852  4\$aDHUB.$c Res.$j A-XX-696.$z-- Fons MTIB.$q-- Enq. rústica (molt malmesa). Taques d'òxid. Segell i etiqueta de la Biblioteca de la Junta de Museus. Antoacii
    ons ms.$t 4
    =852  4\$aDHUB.$c Res.$j A-XX-697.$z-- Fons MTIB.$q-- Enq. rústica. P▒| gina 9 estripada i enganxada amb cinta adhesiva. Antoacions ms.$t 5
    =999  \\$c323$d323
    =952  \\$w2014-03-11$p294$r2011-09-26$40$eMAAB$6DHUB_MTIB_1935_000000000000000$9413$bdhub$m1$10$odhub MTIB
    Je souhaite placer le curseur a la fin des lignes qui commence par =852
    et ajouter ceci: $P et un numero incremental

    J'ai ecrit ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import re
     
    # lecture fichier 1
    f=file("852.mrk", "r")
    content=f.read().splitlines()
    pegar='$p'
    numbase=1602000001
     
    for line in content:
            if line.startswith('=852'):
                    base=line.find('\n')
                    result=base + pegar + numbase +=1
                    print result
    f.close()
    Le num doit commencer par la valeur de numbase
    L'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /root > python test.py
      File "test.py", line 12
        result=base + pegar + numbase +=1
                                       ^
    SyntaxError: invalid syntax
    Une idée ?
    d'avance merci

  10. #10
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    De toute façons ça n'aurait pas eu de sens parce que find() retourne un entier.

    Utilise ceci plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for line in content:
            if line.startswith('=852'):
                    numbase +=1
                    result= "".join([line.rstrip(), pegar, str(numbase), '\n'])

    Edit: ... oublié de convertir numbase en string

  11. #11
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Salut Vins

    merci pour ton ajout... J'ai ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     python test.py
    Traceback (most recent call last):
      File "test.py", line 11, in <module>
        numbase +=1
    TypeError: cannot concatenate 'str' and 'int' objects
    j'ai numbase comme ceci:
    numbase='1602000001'

    avec des single quote..

  12. #12
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Vins
    pardon...ça marche impecable.
    Je voudrais avoir le fichier entier comme sortie... Avec ce code j'ai que les lignes qui commencent par =850
    Comment faire?
    D'avance merci

  13. #13
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Bonsoir
    personne alors?
    je n'arrive pas a imprimer le cotenu complet du fichier avec la ligne =852 modifiée, j'arrive a sortir que la ligne en question.
    Comment faire pour appliquer le changement a l'interieur du fichier ?

    D'avance merci

  14. #14
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Ben, si ton print est conditionné au "if" c'est normal.

    recule-le d'une indentation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for line in content:
            if line.startswith('=852'):
                    numbase +=1
                    line = "".join([line.rstrip(), pegar, str(numbase), '\n'])
            print(line)

  15. #15
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Salut Vins
    ok ça marche
    maintenant je vais tenté de piger:

    d'abord on lit le fichier
    Ensuite cette ligne... je vois pas trop ce que ça produit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    content=f.read().splitlines()
    Ok
    ensuite je parcours les lignes du fichier et je cherche celles qui commencent par =852
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for line in content:
            if line.startswith('=852'):
    Vue que le reste est a l'interieur du if ça sera executé seulement en cas que le if est matché c'est bien ça?
    donc a incremente:
    et ça concatene
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     line = "".join([line.rstrip(), pegar, str(numbase), '\n'])
    et pour finir ça imprime line qui represente l'ensemble des lignes ?? c'est bien ça?

  16. #16
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Ça imprime line au fur et à mesure de la lecture du fichier.

Discussions similaires

  1. Comparer deux fichiers en Python
    Par Gamoth dans le forum Général Python
    Réponses: 7
    Dernier message: 06/07/2009, 12h51
  2. copier fichier avec python
    Par fboss dans le forum Général Python
    Réponses: 2
    Dernier message: 19/05/2009, 14h01
  3. comparer données fichier avec données sql
    Par jad dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 21/02/2008, 20h23
  4. comparer un fichier avec une table
    Par mohammed_amine_wardy dans le forum SQL
    Réponses: 6
    Dernier message: 03/01/2008, 18h10
  5. comparer deux fichiers avec une api windows
    Par sweetdreamer dans le forum Windows
    Réponses: 4
    Dernier message: 25/05/2006, 22h10

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