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 correctement des valeurs d'un fichier .txt


Sujet :

Python

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Récupérer correctement des valeurs d'un fichier .txt
    Bonjour à tous,

    Je tiens déjà à vous remercier pour toutes les réponses que j'ai pu trouver sur ce site concernant différents soucis avec Python.

    J'ai un petit souci avec Python, à vrai dire, je ne sais pas comment récupérer de la manière adéquate des valeurs d'un fichier .txt.

    Si vous voulez, je réalise une optimisation de coûts, avec un autre logiciel, au pas horaire sur une année (8760 points) et je récupère le fichier solution avec Python.

    Les variables que je veux récupérer sont : v1, v2 et v3, ..., v6 qui sont définies pour chaque pas de temps. Lorsqu'elles sont activées j'ai un certain pourcentage, et lorsqu'elles ne le sont pas, les valeurs ne sont pas affichées dans mon .txt. J'ai donc des résultats de la forme


    v1[250] 68
    v1[2850] 80
    v1[3550] 0.5
    .......
    v2[2] 10
    v2[2508] 75
    v2[4000] 45
    v2[5466] 10
    v2[6528] 22
    v2[7053] 88
    ......
    ainsi de suite.

    J'ai rentré ce 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
    34
    35
    36
     
     
    def resultatsV1():
     
        res = np.genfromtxt("sorties.txt", dtype=str, delimiter=';')
        valeur = []
        for row in res[2:len(res)-1]:
            ligne = row.split()
            if ligne[1].split("[", 1)[0]=='v1':
    ##            index.append(ligne[1].split("[", 1)[1].split("]", 1)[0])
                valeur.append(ligne[2])
        d = {'valeur':valeur}
        return pd.DataFrame(d)
     
    def resultatsV2():
     
        res = np.genfromtxt("sorties.txt", dtype=str, delimiter=';')
        valeur = []
        for row in res[2:len(res)-1]:
            ligne = row.split()
            if ligne[1].split("[", 1)[0]=='v2':
                valeur.append(ligne[2])
        d = {'valeur':valeur}
        return pd.DataFrame(d)
     
    # ......ainsi de suite, la même chose pour les 4 autres variables
     
     
                    res_V1 = resultatsV1()['valeur']
                    res_V2 = resultatsV2()['valeur']
     
                    export['valeur1'] = res_V1
                    export['valeur2'] = res_V2
     
     
    export.to_csv(RACINE+"res/resultats_calcul.csv", sep = ';')
    Le problème c'est que dans mon fichier csv, ça me sort les valeurs à partir de la première ligne.
    C'est-à dire, si j'ai :

    v1[250] 80
    puis
    v1[4502] 63,

    ça me met ses deux valeurs à la suite, comme si elles avaient lieu à des pas horaires consécutifs, alors que je voudrais qu'elles apparaissent à la ligne 250, puis à la ligne 4502.....

    Voilà, je ne sais pas trop comment modifier mon code.

    Merci pour vos réponses.

  2. #2
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Help ?
    Personne ?

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 452
    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 452
    Points : 37 048
    Points
    37 048
    Par défaut
    Salut,

    Votre truc est incompréhensible.

    Vous écrivez:
    J'ai un petit souci avec Python, à vrai dire, je ne sais pas comment récupérer de la manière que je veux des valeurs d'un fichier .txt.
    Soit un fichier contient des lignes de caractères que vous ne montrez pas.

    Vous écrivez:
    Les variables que je veux récupérer sont : v1, v2 et v3, ..., v6 qui sont définies pour chaque pas de temps. Lorsqu'elles sont activées j'ai un certain pourcentage, et lorsqu'elles ne le sont pas, les valeurs ne sont pas affichées dans mon .txt. J'ai donc des résultats de la forme


    v1[250] 68
    v1[2850] 80
    v1[3550] 0.5
    Un fichier contient des bytes, pas des variables.
    Pire, le code que vous montrez ne lit rien mais "écrit".

    - W

  4. #4
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Quelques précisions
    Merci de votre réponse.
    Le document texte en question se présente sous la forme décrite dans mon premier post.

    v1[2050] 10
    v1[3000] 45
    ....
    Peut-être que mon intitulé n'est pas le bon. Désolée si je n'utilise pas les bons termes j'ai appris Python sur le tas. Cela étant, mon code écrit bien des valeurs dans un .csv

    Sauf que j'aimerais qu'au lieu de m'afficher ces valeurs à la suite si dans mon txt il m'affiche

    v1[2050] 10
    v1[3000] 45

    J'aimerais retrouver dans mon csv la valeur 10 à la ligne 2050 et le nombre 45 à la ligne 3000.

    Je ne sais pas si c'est plus compréhensible ?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 452
    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 452
    Points : 37 048
    Points
    37 048
    Par défaut
    Je ne sais pas si c'est plus compréhensible ?
    Hélas! N'oubliez pas que si vous ne savez pas décrire ce que vous voulez en français, il sera prématuré de coder.

    Moi ce que je comprend c'est:
    Le fichier d'entrée contient des lignes de la forme:
    v1[2050] 10
    v1[3000] 45
    ....
    Comme on ne sait pas si le fichier est rangé par ordre alphabétique ou pas, impossible de savoir s'il y a des v[2051],... ailleurs.
    Techniquement, çà pourrait être une matrice 1-colonne non dense: les v[i] qui ne sont pas renseignés sont à 0, pas la peine de les écrire.

    Ceci dit pourquoi pas.
    Dans ce cas prenez une liste non dense [ 10, 25, 100 ].
    Faites une boucle qui incrémente un entier k
    Si l'entier est dans la liste, çà affiche k, 1 sinon çà affiche k, 0

    - W

  6. #6
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Informations
    Le fichier texte se présente comme suit (j'ai fait un copier coller) :

    22 v1[17] 0.0017934762
    103 v1[98] 0.019709183
    158 v1[153] 0.012757304
    200 v1[195] 0.018680234
    244 v1[239] 0.02295755
    246 v1[241] 0.011695934
    353 v1[348] 0.058565998
    442 v1[437] 0.0037710083
    485 v1[480] 0.026922834
    494 v1[489] 0.03730308
    500 v1[495] 0.01982797
    502 v1[497] 0.0076401484
    504 v1[499] 0.0052297871
    598 v1[593] 0.014086762
    600 v1[595] 0.0065855955
    681 v1[676] 0.0025114803
    692 v1[687] 0.040361018
    45671 v2[5614] 0.0040441264
    46007 v2[5950] 0.0074938235
    47015 v2[5958] 0.039936625
    47111 v2[6054] 0.099706472
    47543 v2[6486] 0.014374455
    47591 v2[6534] 0.02710617
    47831 v2[6774] 0.03766935
    47879 v2[6822] 0.031759087
    47927 v2[6870] 0.027568239
    48023 v2[6966] 0.052747292
    48119 v2[7062] 0.019958889
    48167 v2[7110] 0.027153025
    48257 v2[7200] 0.060702989
    48375 v2[7318] 0.028987599
    49573 v2[7516] 0.031716008

    ......
    Ces valeurs apparaissent par ordre alphabétique, il n'y a pas de doublon.

  7. #7
    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.
    Juste un exemple. Les données sont organisées dans un defaultdict de OrderedDicts. Je les lis en une seule fois, mais comme tu utilises pandas, c'est peut-être pas ce qui a de mieux.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import re
    import sys
    from collections import defaultdict, OrderedDict
    import matplotlib.pyplot as plt
     
    PATTERN = re.compile(r'([0-9]+) (.+)\[([0-9]+)\] (.+)')
    NBHOURS = 8760
    COLORS = ['b', 'r', 'y', 'm', 'c']
    NBCOLORS = len(COLORS)
     
    def get_one(data):
        for x in data:
            mobj = re.match(PATTERN, x)
            if not mobj:
                continue
            name = mobj.group(2)
            index = int(mobj.group(3))
            value = float(mobj.group(4))
            yield name, index, value
     
    def write(records, fw=sys.stdout):
        towrite = list()
        for rec, items in records.items():
            for h in range(1, NBHOURS + 1):
                towrite.append('{:2s}[{:4d}] {:12.6E}'.format(
                    rec, h, items.get(h, 0)))
        fw.write('\n'.join(towrite))
     
    def plot(records):
        leg = list()
        for idx_c, (name, values) in enumerate(records.items()):
            plt.scatter(*zip(*values.items()), color=COLORS[idx_c % NBCOLORS])
            leg.append(name)
        plt.legend(leg, fontsize='small')
        plt.show()
     
    def main():
        filename = 'data_example.txt'
     
        with open(filename, 'r') as fr:
            data = fr.read().splitlines()
     
        records = defaultdict(OrderedDict)
        for name, index, value in get_one(data):
            records[name][index] = value
     
        write(records)
        plot(records)
     
    if __name__ == '__main__':
        main()

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/03/2012, 11h47
  2. Extraire des valeurs d'un fichier txt
    Par boby35 dans le forum Octave
    Réponses: 5
    Dernier message: 16/04/2008, 13h05
  3. Récupérer des valeurs d'un fichier dat
    Par triaguae dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 28/11/2007, 21h59
  4. récupérer une valeur dans un fichier .txt ?
    Par _n1n1_ dans le forum VB.NET
    Réponses: 5
    Dernier message: 27/04/2007, 20h19
  5. Comment sauvegarder des valeurs dans un fichier txt
    Par NELLLY dans le forum MATLAB
    Réponses: 3
    Dernier message: 16/04/2007, 18h39

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