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

Calcul scientifique Python Discussion :

Traitement d'un fichier texte [Python 2.X]


Sujet :

Calcul scientifique Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 24
    Points : 19
    Points
    19
    Par défaut Traitement d'un fichier texte
    Bonjour!!
    mon problème c'est que je dois exploiter les données dans un fichier texte pour les traitées

    du coup premièrement je dois calculer pour chaque ensemble de mesures la moyenne de ces valeurs (il ne faut pas prendre en compte les valeurs nuls) qui ont séparés par $.


    et voila mon Code mais j'ai pas pu avancer malheureusement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    import numpy as np
    f = open ( 'fichier.txt' , 'r')
    for f in f.read().split("$") : 
        n=0
        D= f.split("\n")[1:] #On split par \n pour prendre ligne par ligne et prend pas le premier ligne
        for line in D: #On passe ligne par ligne
             if line not in ('\n', '\r\n', " \n",''): #On verifie est ce que la ligne n'est pas vide
                n=n+1
    pour n est le nombre des lignes qui sont pas vides (je calcule n pour autre calculs )


    Merci d'avance

  2. #2
    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,

    on peut y arriver facilement en lisant le fichier ligne à ligne, rstrip() permet de virer les fins de lignes, et pour vérifier qu'une ligne est vide on peut s'en remettre à une petite regex

    le seul truc un peu pénible c'est que le $ symbolise le début d'une série de valeurs plutôt que la fin, mais comme on a pas de délimiteur spécifique on est obligé de l'utiliser pour déterminer la fin d'une série de valeurs
    du coup il faut traiter le premier $ pour ne rien faire, et le cas où l'on a pas de $ qui termine le fichier, auquel cas on aurait des résultats non affichés :

    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
    import re
     
    with open('fichier.txt', 'r') as f:
       first_time, n, total = True, 0, 0
       for l in f:
          line = l.rstrip()                    # on vire les fins de lignes
          if not re.match(r'^[ \t]*$', line):  # on s'assure que la ligne n'est pas vide
             if line == '$':
                if first_time:                 # c'est le premier dollar qu'on rencontre ?
                   first_time = False          # si oui on le zappe
                   continue
                else:                          # sinon on affiche les resultats
                   print 'n = {}, total = {}, moyenne = {:.6f}'.format(n , total, total/n)
                   n, total = 0, 0             # et on reinitialise les compteurs
             else:                             # si c'est pas un dollar, alors c'est une valeur
                n += 1
                total += float(line)           # si c'est pas un nombre le programme plantera
    if n:                                      # derniere occurrence
       print 'n = {}, total = {}, moyenne = {:.6f}'.format(n , total, total/n)
    note dans le cas où on a autre chose sur la ligne qu'un dollar, des espaces ou une valeur numérique, le programme plantera immanquablement
    si on veut s'assurer que ça fonctionne à tous les coups on peut prendre le problème dans l'autre sens et uniquement spécifier les lignes valides (plutôt qu'interdire les lignes non-valides)
    il suffira de modifier un peu la regex comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    - if not re.match(r'^[ \t]*$', line):
    + if re.match(r'^\$|\d+(?:\.\d+)?$', line):

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    salut,
    Merci pour votre réponse,
    Le code en principe fonctionne parfaitement en revanche le seule truc qui manque ce que le code prend en considération les valeurs nuls donc le calcul de la moyenne est *faux*. Je voudrais juste savoir si je dois insérer les valeurs de la moyenne dans une list pour que je puisse les présentées graphiquement par plot().




    on peut y arriver facilement en lisant le fichier ligne à ligne, rstrip() permet de virer les fins de lignes, et pour vérifier qu'une ligne est vide on peut s'en remettre à une petite regex

    le seul truc un peu pénible c'est que le $ symbolise le début d'une série de valeurs plutôt que la fin, mais comme on a pas de délimiteur spécifique on est obligé de l'utiliser pour déterminer la fin d'une série de valeurs
    du coup il faut traiter le premier $ pour ne rien faire, et le cas où l'on a pas de $ qui termine le fichier, auquel cas on aurait des résultats non affichés :

    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
    import re
     
    with open('fichier.txt', 'r') as f:
       first_time, n, total = True, 0, 0
       for l in f:
          line = l.rstrip()                    # on vire les fins de lignes
          if not re.match(r'^[ \t]*$', line):  # on s'assure que la ligne n'est pas vide
             if line == '$':
                if first_time:                 # c'est le premier dollar qu'on rencontre ?
                   first_time = False          # si oui on le zappe
                   continue
                else:                          # sinon on affiche les resultats
                   print 'n = {}, total = {}, moyenne = {:.6f}'.format(n , total, total/n)
                   n, total = 0, 0             # et on reinitialise les compteurs
             else:                             # si c'est pas un dollar, alors c'est une valeur
                n += 1
                total += float(line)           # si c'est pas un nombre le programme plantera
    if n:                                      # derniere occurrence
       print 'n = {}, total = {}, moyenne = {:.6f}'.format(n , total, total/n)
    note dans le cas où on a autre chose sur la ligne qu'un dollar, des espaces ou une valeur numérique, le programme plantera immanquablement
    si on veut s'assurer que ça fonctionne à tous les coups on peut prendre le problème dans l'autre sens et uniquement spécifier les lignes valides (plutôt qu'interdire les lignes non-valides)
    il suffira de modifier un peu la regex comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    - if not re.match(r'^[ \t]*$', line):
    + if re.match(r'^\$|\d+(?:\.\d+)?$', line):

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Il faut réfléchir un petit peu ...

    Suffit de remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             else:                             # si c'est pas un dollar, alors c'est une valeur
                n += 1
                total += float(line)           # si c'est pas un nombre le programme plantera
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
             else:                             # si c'est pas un dollar, alors c'est une valeur
                val = float(line)            # si c'est pas un nombre le programme plantera
                if val != 0 :             # on injecte dans le calcul de la moyenne seulement si la valeur est non nulle
                     n += 1
                     total += val

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 823
    Points : 7 119
    Points
    7 119
    Par défaut
    On pourrait déjà se demander, pourquoi une version obsolète de python ?

    Voici une proposition un peu plus courte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with open('test.txt') as f:
        values = None
        for value in f:
            if value.rstrip('\n') == '$':
                if values:
                    mysum = sum(values)
                    print('somme: {}, moyenne: {}'.
                         format(mysum, mysum/len(values)))
                values = []
            elif value != '0':
                values.append(float(value))
    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)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    je vous remercie infiniment



    Citation Envoyé par lg_53 Voir le message
    Il faut réfléchir un petit peu ...

    Suffit de remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             else:                             # si c'est pas un dollar, alors c'est une valeur
                n += 1
                total += float(line)           # si c'est pas un nombre le programme plantera
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
             else:                             # si c'est pas un dollar, alors c'est une valeur
                val = float(line)            # si c'est pas un nombre le programme plantera
                if val != 0 :             # on injecte dans le calcul de la moyenne seulement si la valeur est non nulle
                     n += 1
                     total += val

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

Discussions similaires

  1. requete de traitement d'un fichier texte
    Par AlternantOracle dans le forum Langage
    Réponses: 2
    Dernier message: 07/12/2009, 15h32
  2. Traitement d'un fichier texte.
    Par riou34 dans le forum 4D
    Réponses: 4
    Dernier message: 25/01/2009, 12h23
  3. traitement d'un fichier texte
    Par benselma dans le forum Général Java
    Réponses: 4
    Dernier message: 14/05/2008, 16h26
  4. Réponses: 8
    Dernier message: 14/09/2006, 16h43
  5. [INFO] Traitement d'un fichier texte
    Par doudine dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 25/04/2006, 09h23

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