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 :

Lire et écrire des fichiers textes colonnés


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Août 2014
    Messages : 40
    Points : 33
    Points
    33
    Par défaut Lire et écrire des fichiers textes colonnés
    Bonjour,

    Je suis novice en Python et j'éprouve quelques difficultés à lire et écrire des fichiers textes qui sont colonnés.
    Dans l'idéal, j'aimerais venir sélectionner telle ou telle colonne et changer la valeur.
    J'arrive à lire chaque colonne et à remplir un vecteur avec la fonction "genfromtxt" de Numpy. Mais pas moyen de modifier les colonnes de manière précise >_>
    Auriez-vous des conseils à m'apporter ?

    Merci !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Exemple
     
    500  1  0   1.32478        98           0  0                                    
    500  9  0   1.27844       218           0  0                                    
    500 21  0   1.10189       700           0  0                                    
    500 61  0   1.09385       700           0  0
    edit : Je vais compléter un peu mon message car pas vraiment clair !

    En utilisant la fonction "genfromtxt" je récupère un vecteur. Vecteur que je peux parcourir pour modifier les données qui m'intéresse. Mais ensuite, impossible de réécrire ce vecteur dans un fichier texte en conservant la mise en forme colonné spécifique à mon fichier !
    J'aimerais définir un format du type : le 1er élément du vecteur sera écrit sur les 3 premières colonnes, le 2eme élément sur les 3 colonnes d'après etc...
    Et bien sûr, commencer à remplir les colonnes par la droite... je ne sais pas si c'est beaucoup plus clair ^^ ! Par exemple, si je veux modifier 98 par 300 je voudrais obtenir ce document en sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Exemple 98 --> 300
     
    500  1  0   1.32478       300           0  0                                    
    500  9  0   1.27844       218           0  0                                    
    500 21  0   1.10189       700           0  0                                    
    500 61  0   1.09385       700           0  0

  2. #2
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    le pendant de la fonction genfromtxt (lecture) dans numpy est la fonction savetxt (écriture).

    Pour lire ton fichier, il a bien fallu que tu modifies les valeurs par défaut de certains paramètres (à cause de l'absence d'espace entre les 2 premières colonnes de la dernière ligne, l'espace étant le caractère "délimiteur" par défaut), non ? Tu dois faire grosso modo la même chose côté savetxt en jouant sur fmt et/ou delimiter.

    Ce serait plus simple si tu postais la partie de ton code qui permet de lire le fichier. On aurait une base sur laquelle travailler.

    ps : sur ton exemple, la 5ième colonne est bizaremment formattée : valeurs entières ? réelles ? point décimal aléatoire ?

    [EDIT] pour comprendre les remarques et le post-scriptum, voici le fichier exemple initial, modifié depuis par le PO.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    500  1  0   1.32478       98.           0  0 
    500  9  0   1.27844      218.           0  0 
    500 21  0   1.10189       700           0  0 
    500 61  0   1.09385       700           0  0 
    500101  0   1.08236       700           0  0
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Août 2014
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    Merci pour ton retour.
    J'ai modifié mon exemple pour rester dans la cas général.
    J'ai aussi abandonné l'utilisation de genfromtxt. Voici mon code actuel :

    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
    # -*- coding: utf-8 -*-
    import numpy as np
    import os
     
     
    def Modif_input(path,NumNoeuds,  P, T):
            i=1
            j=4
            k=0
            fread=open(path, 'r')
            lignes=fread.readlines()
     
     
     
            for ligne in lignes:
                pos = ligne.find("500")
                if pos != -1:
                    print i
                    break
                i+=1   
     
            tab_500=[0]*(j-i+1)
            tab_num=[0]*(j-i+1)
            tab_p=[0]*(j-i+1)
            tab_t=[0]*(j-i+1)
            tab_reste=[0]*(j-i+1)
            tab_inter=[0]*(j-i+1)
     
            for ligne in lignes[i:j]:
                tab_500[k]=ligne[0:3]
                tab_num[k]=ligne[3:6]
                tab_inter[k]=ligne[6:9]
                tab_p[k]=ligne[9:19]
                tab_t[k]=ligne[19:29]
                tab_reste[k]=ligne[29:45]
                print tab_num[k]
                k+=1
     
            for l in range(0, k):
                if tab_num[l]==NumNoeuds:
                    break
                l+=1
            print l
            tab_p[l]=P
            tab_t[l]=T    
     
     
            lignes[0]=tab_500[l]+tab_num[l]+tab_inter[l]+tab_p[l]+tab_t[l]+tab_reste[l]
            print lignes[0]
     
            fread.close

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Août 2014
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    J'ai résolu mon problème :p

    Pour ceux que ça intéresse :
    - J'ai d'abord lu le fichier texte et j'ai remplie une liste avec les caractères (cf bout de code du message d'avant)
    - J'ai réécris une nouvelle liste en modifiant les caractères que je souhaitais changer (car en python à priori on ne peut pas modifier les caractères d'une liste existante ?)
    - J'ai concaténé la liste avec la fonction "".join(MaListe)


    Rien de très difficile en fait mais bon mon problème ne l'était pas non plus :p

  5. #5
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Citation Envoyé par coolpix77 Voir le message
    J'ai résolu mon problème :p

    Pour ceux que ça intéresse :
    - J'ai d'abord lu le fichier texte et j'ai remplie une liste avec les caractères (cf bout de code du message d'avant)
    - J'ai réécris une nouvelle liste en modifiant les caractères que je souhaitais changer (car en python à priori on ne peut pas modifier les caractères d'une liste existante ?)
    - J'ai concaténé la liste avec la fonction "".join(MaListe)
    Tant mieux, mais ... il y a des tas de (très !) "vilaines choses" dans le code que tu as posté (c'est normal, tu débutes).

    Tu aurais sans doute intérêt à poster ton code (lecture, modification de tes données puis écriture) pour que l'on puisse te proposer des approches plus "carrées" (et qui serviraient à tout le monde : l'explication que tu fournis est trop vague). C'est toi qui vois !

    Et sinon, passe en "résolu".
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Août 2014
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    Parfait ! J'vais mettre en forme au propre le code qui fonctionne chez moi et je reviens

    edit: Alors le code, sachant que je ne souhaite modifier que les colonnes 3 et 4 de mon fichier texte au dessus
    Sachant que replaceTag est une fonction à la con qui détecte une ligne dans un fichier avec tagName et remplace cette ligne par une nouvelle ligne.

    Et oui je sais c'est mal codé toussa toussa xD


    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    import os
     
    def I_Flow(path,NumNoeuds,  L1, L2):
        """
        @L1 : float
        @L2 :  float
        """
     
    # i : début lignes 500
        i=1
    # j : fin des lignes 500
        j=4
     
        k=0
        l=0
     
        ligne_texte=[]
     
        fread=open(path, 'r')
        lignes=fread.readlines()
     
    #        Initialisation des tableaux
        tab_500=[0]*(j-i)
        tab_num=[0]*(j-i)
        tab_reste=[0]*(j-i)
        tab_inter=[0]*(j-i)
     
    #        On parcourt les cartes 500 et on enregistre les informations colonnes par colonnes
        for ligne in lignes[i:j]:
            tab_500[k]=str(ligne[0:3])
            tab_num[k]=str(ligne[3:6])
            tab_inter[k]=str(ligne[6:9])
            tab_reste[k]=str(ligne[29:45])
            k+=1
     
    #        On recherche le noeud pour lequel on veut modifier les valeurs de L1 et L2     
        for l in range(0, k):
            if tab_num[l]==NumNoeuds:
                break
            l+=1
     
    #        
       L1=str(L1)
       L2bis=str(L2)
     
    #       On crée une nouvelle ligne "New_ligne" . On change ensuite la valeur de L1 et L2 puis on la remplace dans le fichier d'origine.
        New_ligne=ligne_texte
        New_ligne[0:3]=tab_500[l]
        New_ligne[3:6]=tab_num[l]
        New_ligne[6:9]=tab_inter[l]
        New_ligne[9:13]="   "
        New_ligne[13:19]=L1
        if (L2<10):
            New_ligne[19:25]="      "
            New_ligne[25:29]=L2bis
        elif (L2<100):
            New_ligne[19:24]="     "
            New_ligne[24:29]=L2bis
        elif (L2<1000):
            New_ligne[19:23]="    "
            New_ligne[23:29]=L2bis
     
        New_ligne[29:45]=tab_reste[l]
     
    #       On transforme la liste New_ligne en chaîne de caractère  
        New_ligne="".join(New_ligne)
        tagName="500"+NumNoeuds
        replaceTag(path, tagName, New_ligne+"\n")
     
        fread.close

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/09/2012, 21h53
  2. Lire et écrire un fichier texte
    Par anautilisateur dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 12/07/2011, 20h11
  3. Réponses: 5
    Dernier message: 21/02/2007, 16h12
  4. Lire des fichiers texte (des chaines de caracteres) ifstream
    Par jamesleouf dans le forum SL & STL
    Réponses: 1
    Dernier message: 22/03/2006, 23h58
  5. Réponses: 9
    Dernier message: 05/04/2005, 09h39

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