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 :

Récupérer données dans fichier .txt


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Points : 7
    Points
    7
    Par défaut Récupérer données dans fichier .txt
    Bonjour à tous,
    Je suis débutant en programmation, j'utilise plutôt des codes de calcul de Monte Carlo (MCNP) et j'aurai grand besoin de 'trier' un fichier texte.
    Voici le format de mon fichier:
    EC 1
    C 0 1983
    EC 2
    C 1 217
    EC 2
    C 1 583
    EC 2
    C 1 0
    EC 1
    C 0 64
    EC 3
    C 0 505
    C 1 89
    J'aimerais récupérer les lignes après EC 3 pour créer des graphs 2D. Par exemple pour le morceau de fichier j'aurai un point (505,89).
    J'imagine que c'est un code trivial pour un utilisateur moyen, mais j'ai cherché sur le net et j'arrive pour le moment seulement à ouvrir mon fichier et le lire ...
    De l'aide serait la bienvenue.
    Bien cordialement

  2. #2
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Bonjour,
    Citation Envoyé par hugues6358 Voir le message
    …j'aurai grand besoin de 'trier' un fichier texte.

    J'aimerais récupérer les lignes après EC 3 pour créer des graphs 2D. Par exemple pour le morceau de fichier j'aurai un point (505,89).
    …j'arrive pour le moment seulement à ouvrir mon fichier et le lire ...
    Pourriez-vous montrer votre code permettant d'ouvrir et de lire le fichier?
    Une fois le fichier ouvert et "lu" il n'est, normalement, pas très compliqué de parcourir les lignes afin de repérer la ligne contenant "EC 3" puis de récupérer les lignes suivantes.
    Ces lignes récupérées ne devraient pas poser de problème quand à la conversion en un format numérique. Non?

    PS: pourquoi parler de "trier" ce fichier?

    Clodion

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Il y a des petites difficultés tout de même...

    De temps en temps:


    • Il y a 2 lignes C 0 valeur et C 1 valeur
    • Il y a 1 ligne C 0 valeur
    • Il y a 1 ligne C 1 valeur
    • Il y a des lignes identiques EC 2 avec des coordonnées différentes pour la position 1 (que fait-on dans ce cas pour des coordonnées du type (pos 0, pos 1) ? )


    Va falloir expliquer un peu plus la démarche dans tel ou tel cas de figure...

    Que représente EC?
    Que représente

    • C
    • 0
    • 1983

    par exemple,

    Que faire au cas où on tombe sur

    EC 2
    C 1 217
    EC 2
    C 1 583

    ?

    Que devrait être le retour attendu, une fois toutes ces lignes traitées ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous,
    Tout d'abord merci pour vos réponses rapides,

    J'ai quelque peu avancé et pour le moment je 'tri' les lignes "CO xxxx" et "C1 XXXX" dans deux fichiers .txt. voici mon code:
    k=open('17ml2012.txt','r')
    n = 0
    for line in k:
    n += 1
    k.close()
    y=open('17ml2012.txt','r')
    for i in range(n):
    a=y.readline()
    if 'EC 3' in a:
    b=y.readline()
    c=y.readline()
    fd=open('resu.txt','a')
    fd.write(b)
    fd.write(c)
    y.close()
    k=open('resu.txt','r')
    n = 0
    for line in k:
    n += 1
    k.close()
    y=open('resu.txt','r')
    for i in range(n):
    b=y.readline()
    c=y.readline()
    fd=open('resu1.txt','a')
    fd.write(b)
    fd=open('resu2.txt','a')
    fd.write(c)
    y.close()
    Mon objectif est de récupérer les XXXX après "CO" ou "C1" et tracer un graph avec le nombre XXXX de la ligne "C0" en abscisse et le nombre xxxxx de la ligne "C1" en ordonnée.
    Le fichier .txt que j'utilise est un fichier de sortie de détecteurs doubles, avec les lignes "EC1" qui donne une information sur le détecteur 1, la ligne"EC2" sur le détecteur 2 et enfin la ligne "EC3" sur la coincidence entre les deux détecteurs.
    Vous l'aurez compris, mon objectif est de tracer un matrice de coincidence les deux détecteurs.
    Je suis utilisateur de LabVIEW pour traiter mes données habituellement, mais vu la taille des fichiers .txt (80Giga) j'ai peut des temps de calcul ...

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Points : 7
    Points
    7
    Par défaut Code simplifié
    Je suis désolé mais j'avance en même tps, j'ai simplifié le code:
    k=open('17ml2012.txt','r')
    n = 0
    for line in k:
    n += 1
    k.close()
    y=open('17ml2012.txt','r')
    for i in range(n):
    a=y.readline()
    if 'EC 3' in a:
    b=y.readline()
    fd=open('resu1.txt','a')
    fd.write(b)
    c=y.readline()
    fd1=open('resu2.txt','a')
    fd1.write(c)
    y.close()

    Bien cordialement,
    Hugues

  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,

    Quand tu postes du code, utilise les balises code. Le # dans la barre d'outils.

    Ton 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    k=open('17ml2012.txt','r')  #
    n = 0                       # Ces 5 lignes ne servent donc qu'à
    for line in k:              # compter les lignes du fichier.
        n += 1                  # Pas utile bien sur.
    k.close()                   #
     
    y=open('17ml2012.txt','r')
    for i in range(n):
        a=y.readline()
        if 'EC 3' in a:
            b=y.readline()
            c=y.readline()
            fd=open('resu.txt','a') # On va le réouvrir à chaque fois ?
            fd.write(b)
            fd.write(c)
    y.close()                   # et fd, on ferme pas ?
     
    k=open('resu.txt','r')      #
    n = 0                       #
        for line in k:          # Même chose que pour le premier bloc.
        n += 1                  #
    k.close()                   #
     
    y=open('resu.txt','r')
    for i in range(n):
        b=y.readline()
        c=y.readline()
        fd=open('resu1.txt','a')    # Même réouverture ...
        fd.write(b)
        fd=open('resu2.txt','a')    # idem, à cause du réemploi du nom 'fd' ?
        fd.write(c)
    y.close()                   # et fd ?
    ... mais vu la taille des fichiers .txt (80Giga) ...
    Qu'est-ce qui fait 80 Go, le fichier 17ml2012.txt ? dans ce cas une fonction génératrice s'impose.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Oui le fichier d'entré peut aller jusqu'à 80Giga, je voulais commencer avec quelque chose de simple pour essayer de me mettre un peu en main python.
    Pour les commentaires, j'ai essayé en utilisant le # du clavier mais python ne veut pas exécuter...
    import os
    k=open('17ml2012.txt','r')
    n = 0
    for line in k:
    n += 1
    k.close()
    y=open('17ml2012.txt','r')
    os.remove('resu1.txt')
    os.remove('resu2.txt')
    for i in range(n):
    a=y.readline()
    if 'EC 3' in a:
    b=y.readline()
    d=b[4:10]
    fd=open('resu1.txt','a')
    fd.write(d)
    c=y.readline()
    e=c[4:10]
    fd1=open('resu2.txt','a')
    fd1.write(e)
    y.close()

    Avec ce code j'obtiens deux fichiers resu1 et resu2 que j'essaie maintenant d'utiliser pour tracer mon graph, mais j'ai des erreurs que je n'arrive pas à expliquer sur la fonction matplot...

    Lorsque j'aurai réussi à tracer avec cette méthode "simple" je m'occuperai des génératrices, donc je n'ai aucune idée de leur utilisation.

    Merci pour les réponses,

    Bien cordialement,

    Hugues,

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Bon ça commence à être plus clair, seulement j'ai pas le temps aujourd'hui...

    Je verrais cela ce soir, si possible.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Merci c'est très gentil,

    Je travaille dessus de mon côté, j'ai réinstallé python xy car je pense qu'il y avait un problème avec la bibliothèque matplotlib.

    Si j'ai qqch qui fonctionne je vous poste la réponse.

    Encore merci,

    Cdlt,

    Hugues

  10. #10
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut,
    Comme ça a l’air d’être la galère, je te propose ma version :

    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
    from array import array
     
    def next_line(fobj):
        curr_line = fobj.readline()
        val = curr_line.split()[2]
        return int(val)
     
    def read_file(fobj, key = "EC 3"):
        x, y = array('I'), array('I')
        for line in fobj:
            if key in line:
                x.append(next_line(fobj))
                y.append(next_line(fobj))
        return x, y
     
    if __name__ == '__main__':
        import matplotlib.pyplot as plt
        with open('data/file.txt') as fr:
            plt.scatter( *read_file(fr))
            plt.show()

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Merci pour le code,
    j'étudie ça de suite
    Hugues

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Plusieurs questions...
    1. fobj=open('17ml2012.txt','r') ? il ouvre mon fichier d'entrée ou pas du tout?

    2. Comment arrive t'il à supprimer les C0 et C1 devant les nombres, ex:
    "EC 3
    C 0 3523
    C 1 453"
    Seuls 3523 (x) et 453 (y) sont d'intérêts.

    3. je ne comprends pas le " if __name__ == '__main__' "

    Questions sans doutes triviales mais posées par un débutant ...

    Bien cordialement,

    Hugues

  13. #13
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    OK. Pas de souci.

    1. fobj=open('17ml2012.txt','r') ? il ouvre mon fichier d'entrée ou pas du tout?
    Oui, le fichier est ouvert en lecture. J’ai utilisé un with qui gère automatiquement l’ouverture, mais qui fait la même chose.

    2. Comment arrive t'il à supprimer les C0 et C1 devant les nombres, ex:
    "EC 3
    C 0 3523
    C 1 453"
    Seuls 3523 (x) et 453 (y) sont d'intérêts.
    Dans la fonction read_file, le programme itère sur chaque ligne du fichier objet fobj. Lorsque la clef est détectée dans la ligne courante, les valeurs à extraire dans les lignes suivantes sont extraites à l’aide de la fonction next_line (qui prend en argument fobj et pas la ligne courante).
    Cette fonction lit une nouvelle ligne dans le fichier objet, découpe la ligne en plusieurs valeurs (split), et sélectionne la troisième (indice [2]). Les valeurs "C" et "0" de "C 0 3523" seraient associées au indice 0 et 1 ; elles ne sont pas utilisées ici.

    3. je ne comprends pas le " if __name__ == '__main__' "
    Les instructions de ce bloc sont exécutées seulement lorsque le fichier est traité par l’interpréteur comme celui du programme principal. Il n’y a donc pas d’exécution lorsque le fichier est importé comme module.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Merci pour les éclaircissements, je me remets au code.
    Encore merci,
    Bien cordialement,
    Hugues

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    J'ai bien compris la deuxième partie concernant la sélection unique du nombre.

    Pour l'ouverture du fichier, vous employez le fonction 'with' à la fin du code, comment peut il se reporter au fichier d'entrée dès le début du code?

    Pour la fin du code, pas moyen de voir comment il construit le graph, j'ai modifié certaines choses et j'obtiens une fenêtre de graph mais sans le graph...

    Je pense que mes connaissances sont trop limitées en python pour bien assimiler la procédure ....

    Cordialement,

    Hugues

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    J'ai enfin compris le code je pense, les deux premiers blocs sont des fonctions...
    Je ne l'avais pas remarqué.
    J'ai remplacé datafile.txt par mon fichier d'entré: 17ml2012.txt et j'obtiens une erreur.
    Voici l'erreur que j'obtiens dans le terminal:
    File "test.py", line 19, in <module>
    plt.scatter( *read_file(fr))
    File "test.py", line 12, in read_file
    x.append(next_line(fobj))
    File "test.py", line 4, in next_line
    curr_line = fobj.readline()
    ValueError: Mixing iteration and read methods would lose data

    Je ne sais pas si cela vous parle?

    Je suis conscient que je pause bcp de questions et que j'ai peu de compétences pour comprendre les réponses.

    Merci encore pour l'aide.

    Cordialement,

    Hugues

  17. #17
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    File "test.py", line 19, in <module>
    plt.scatter( *read_file(fr))
    File "test.py", line 12, in read_file
    x.append(next_line(fobj))
    File "test.py", line 4, in next_line
    curr_line = fobj.readline()
    ValueError: Mixing iteration and read methods would lose data
    C’est un problème de version de PYTHON. J’ai travaillé avec la 3.2, mais en effet ça ne marche pas avec la 2.7.
    Si tu débutes, il vaut mieux prendre l’habitude d’utiliser la V3.

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    J'utilise la version python xy 2.7.5.1, j'ai bien l'impression que c'est la dernière version.
    En tout cas sur le site python où je l'ai téléchargé:
    https://code.google.com/p/pythonxy/wiki/Downloads

    Cordialement
    Hugues

  19. #19
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Bonsoir,
    Citation Envoyé par hugues6358 Voir le message
    J'utilise la version python xy 2.7.5.1, j'ai bien l'impression que c'est la dernière version.
    En tout cas sur le site python où je l'ai téléchargé:
    https://code.google.com/p/pythonxy/wiki/Downloads
    En ce qui concerne Python, le mieux est quand même la page officielle!!
    (Sur laquelle sont aussi présentes de nombreuses aides et explications!)

    python.org

    PS: actuellement, la dernière version est la 3.3!! Les versions 2.7.x ne sont utiles que pour la compatibilité d'anciens scripts!

    Clodion

  20. #20
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Bonjour,
    C'est Python XY que j'utilise et non python classique.
    Bien cordialement,
    Hugues

Discussions similaires

  1. Enregistrer données dans fichier txt
    Par man0n dans le forum Tkinter
    Réponses: 14
    Dernier message: 30/04/2014, 15h31
  2. Extraire des données dans fichier txt
    Par islande dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 28/03/2013, 13h42
  3. Récupérer donnée dans fichier texte
    Par all4linux dans le forum Web
    Réponses: 6
    Dernier message: 12/06/2010, 12h01
  4. [XL-2003] Données dans fichier .txt vers tableau en .xls
    Par Invité1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/08/2009, 19h30
  5. lire données dans fichier txt
    Par flo456 dans le forum Langage
    Réponses: 5
    Dernier message: 14/09/2006, 08h01

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