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 :

soucis de resultat


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut soucis de resultat
    Bonjour a tous

    j'ai ecris un petit programme python qui est sensé lire 2 fichiers, et apres avoir fait un match, copier un fragment du 2 fichier dans le 1er.

    Un exemple pour mieux voir:

    Voici le fichier principal:

    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
    17
    18
    19
    20
    21
    22
    23
    =LDR  01416n{dollar}{dollar} a2200289   4500
    =035  \\$aDVD
    =245  10$a¡Qué bello es vivir!
    =260  \\$aMadrid$bSuevia Films
    =300  \\$aDisco óptico (DVD)
    =520  \\$aGeorge Bailey spends his entire life giving up his big dreams for the good of his town, Bedford Falls, as we see in flashback. But in the present, on Christmas Eve, he is broken and suicidal over the misplacing of an $8000 loan and the machinations of the evil millionaire, Mr. Potter. His guardian angel, Clarence, falls to Earth, literally, and shows him how his town, family, and friends would turn out if he had never been born. George meant so much to so many people; should he really throw it all away?
    =590  \\$aVersión en castellano e inglés con subtítulos en castellano
    =590  \\$aActores: James Stewart, Donna Reed, Lionel Barrymore
    =590  \\$aDuración aproximada : 128 mins
    =590  \\$aPelícula en blanco y negro
    =650  \\$aInglés
    =650  \\$aAprendizaje activo
    =597  \\$aInglés
    =597  \\$aEspañol
    =953  \\$a1120011734
    =591  \\$a. -- Madrid : Suevia Films, [19??] . -- Disco óptico (DVD)
    =592  \\$a¡Qué bello es vivir! = It's a wonderful life . -- Madrid : Suevia Films, [19??] . -- Disco óptico (DVD)
    =651  \\$aEnglish
    =651  \\$aAction learning
    =093  \\$a01/07/2003
    =080  \\$aV531
    =598  \\$awonderfullife.jpg
    =999  \\$c1$d1
    Je cherche le champs =650 \\$a
    j'ai ces 2 lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    =650  \\$aInglés
    =650  \\$aAprendizaje activo

    voici le second fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Ingles:English
    Inglés:English
    Apologética:Apologetics
    Aprendizaje:Learning
    Aprendizaje activo:Action learning
    Aprendizaje asistido por ordenador:Computeraided learning
    Le but est de chercher la valeur du champs =650 $a dans le 2 fichier et de recuperer la valeur apres les : (c'est la traduction)
    Et lorsque je l'ai le placer de cette façon dans le fichier 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    =650  \\$aInglés$iEnglish
    =650  \\$aAprendizaje activo$iAction learning
    Voici le code que j'ai fait, mais ça marche pas...Peu être quelqu'un peu m'aider:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    import re
     
    textos = "ficher1"
    traducciones = "fichier2.txt"
    salida = "salida.mrk"
     
    text = open(textos, 'r')
    trad = open(traducciones, 'r')
    salida = open(salida, 'r+')
     
    trad_lineas = trad.readlines()
    linea = text.readline()
    cont = 1
    while linea:
    	cont +=1
    	match = re.search(r'^=650', linea)
    	if match:
    		palabra = linea.split('$a')[-1].replace("\n","")
    		for linea_traduccion in trad_lineas:
    			if palabra in linea_traduccion:
    				print "ole"
    				salida.write("=650  \\$a%s$i%s\n" % (palabra, match.group(0)))
    		break
    	else:
    		salida.write(linea)
    	linea = text.readline()

  2. #2
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Outre plusieurs petite améliorations possibles (incluses dans le code ci-dessous), ton erreur réside dans cette ligne salida.write("=650 \\$a%s$i%s\n" % (palabra, match.group(0)))… Il sort d’où et correspond à quoi, ce “match.group(0)”*?

    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
    17
    import re
     
    textos = "ficher1"
    traducciones = "fichier2.txt"
    salida = "salida.mrk"
     
    with open(textos, 'r') as text, open(traducciones, 'r') as trad, open(salida, 'r+') as salida:
        trad_lineas = trad.readlines()
        for linea in text:
            match = re.search(r'^=650.*$a(.*)$', linea)
            if match:
                palabra = match.group(1).rstrip('\n')
                for linea_traduccion in trad_lineas:
                    if palabra in linea_traduccion:
                        print "ole"
                        linea = "=650  \\$a{}$i{}\n".format(palabra, linea_traduccion.split(':')[-1])
            salida.write(linea)
    Code non testé*!

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Merci de ta reponse !
    travailler un sanedi (mil excuses)

    alors voila, j'ai essayé ton bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ubuntu@ip-10-34-131-166:~/luis$ python script.py
    Traceback (most recent call last):
      File "script.py", line 7, in <module>
        with open(textos, 'r') as text, open(traducciones, 'r') as trad, open(salida                                          , 'r+') as salida:
    IOError: [Errno 2] No such file or directory: 'salida.mrk'
    Voyant cette erreur je fais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ubuntu@ip-10-34-131-166:~/luis$ touch salida.mrk
    ubuntu@ip-10-34-131-166:~/luis$ python script.py
    Mais ça marche pas

    Normalement il devrait y avoir la traduction sur la même ligne separé par $i

    alors que j'ai ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    =650  \\$aInglés
    =650  \\$aAprendizaje activo
    =597  \\$aInglés
    =597  \\$aEspañol
    =953  \\$a1120011734
    =591  \\$a. -- Madrid : Suevia Films, [19??] . -- Disco óptico (DVD)
    =592  \\$a¡Qué bello es vivir! = It's a wonderful life . -- Madrid : Suevia Films, [19??] . -- Disco óptico (DVD)
    =651  \\$aEnglish
    =651  \\$aAction learning
    Le champ =651 n'a pas lieu d'exister l'output serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    =650  \\$aInglés$iEnglish
    =650  \\$aAprendizaje activo$iAction learning
    D'avance merci de ton aide

  4. #4
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Grumph, la plus grosse erreur venait de la regex, le “$” n’était pas échappé…

    Sinon, le mode d’ouverture du fichier de sortie est plutôt 'w', s’il faut le créer…

    Ce code marche (pour moi)*:

    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
     
    textos = "ficher1"
    traducciones = "fichier2.txt"
    salida = "salida.mrk"
     
    with open(textos, 'r') as text, open(traducciones, 'r') as trad, open(salida, 'w') as salida:
        trad_lineas = dict(tr.strip().split(':') for tr in trad.readlines())
        for linea in text:
            match = re.search(r'^=650.*\$a(.*)$', linea)
            if match:
                palabra = match.group(1).rstrip('\n')
                if palabra in trad_lineas:
                    print "ole"
                    linea = "=650  \\\\$a{}$i{}\n".format(palabra, trad_lineas[palabra])
            salida.write(linea)
    Tant qu’à faire, j’ai aussi améliorer la gestion des traductions en créant un dico "original" -> "traduction", c’est nettement plus efficace, simple et sûr que de parcourir une liste (et d’utiliser “in”, qui peut faire un match partiel*!).

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Salut,

    alors sur mon ubuntu ça donne ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "script.py", line 8, in <module>
        trad_lineas = dict(tr.strip().split(':') for tr in trad.readlines())
    ValueError: dictionary update sequence element #13 has length 1; 2 is required
    J'attach les fichiers si tu veux essayer en reel.
    ce fichier 20130527 est fichier1 et le dico l'autre.
    Merci pour ton aide
    Fichiers attachés Fichiers attachés

  6. #6
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Et comme 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
    15
    16
    import re
     
    textos = "ficher1"
    traducciones = "fichier2.txt"
    salida = "salida.mrk"
     
    with open(textos, 'r') as text, open(traducciones, 'r') as trad, open(salida, 'w') as salida:
        trad_lineas = dict(tr.strip().split(':') for tr in trad.readlines() if ':' in tr)
        for linea in text:
            match = re.search(r'^=650.*\$a(.*)$', linea)
            if match:
                palabra = match.group(1).rstrip('\n')
                if palabra in trad_lineas:
                    print "ole"
                    linea = "=650  \\\\$a{}$i{}\n".format(palabra, trad_lineas[palabra])
            salida.write(linea)

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

Discussions similaires

  1. Souci d'utilisation de resultat d'une requete
    Par Avatar69 dans le forum ASP.NET
    Réponses: 9
    Dernier message: 10/02/2010, 09h49
  2. Proposer le resultat d'une requête en téléchargement
    Par Lux interior dans le forum XMLRAD
    Réponses: 5
    Dernier message: 17/02/2003, 15h44
  3. [VB6] [Excel] Résultat d'une requete ds une feuille
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 07/01/2003, 17h52
  4. Réponses: 2
    Dernier message: 03/10/2002, 17h24
  5. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43

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