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 :

Importer txt pour numpy


Sujet :

Calcul scientifique Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Importer txt pour numpy
    Bonjour, je souhaite importer un fichier txt qui a le format suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    18/03/2011 12:39:18	MA	20,0	50,0	19,7	53,1
    18/03/2011 12:39:19	MA	20,0	50,0	19,7	53,1
    18/03/2011 12:39:20	MA	20,0	50,0	19,7	53,3
    La commande data=csv.reader(open(file, 'rb'), delimiter=' ') ne renvoi pas d'erreur, mais je n'arrive pas à accéder au contenu. L'objectif étant de pouvoir tracer ces données avec matplotlib et faire des calculs avec numpy.

    Pouvez vous m'aider ?

    Merci

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si la ligne est aussi simple que ça, un simple .split devrait faire l'affaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    x = "18/03/2011 12:39:18 MA 20,0 50,0 19,7 53,1"
    print x.split(' ')
    ['18/03/2011', '12:39:18', 'MA', '20,0', '50,0', '19,7', '53,1']
    Bien entendu, tous les éléments sont des chaines de caractères. Pour accéder aux nombres flottants, il faudra d'abord remplacer la virgule par un point décimal.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Conversion string avec ',' en float
    Comment peux t-on convertir les dernières valeur en float une fois ce split exécuté ? (Je souhaite éviter les boucles car les fichiers sont très long, ce qui engendrerai de long temps de calcul).
    Merci.

  4. #4
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Par un simple cast

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    text = "123.456"
    value = float(text)
    print type(value), value

  5. #5
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Les valeurs en string sont de la forme '50,9' stockées dans un array (array(['50,9', '50,0', '49,9', ..., '91,9', '91,9', '91,9'],dtype='|S19'))...

  6. #6
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    data = ['18/03/2011', '12:39:18', 'MA', '20,0', '50,0', '19,7', '53,1']
    for word in data:
        try:
            value = float(word.replace(',', '.'))
        except:
            value = word
        print type(value), value

  7. #7
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Pour revenir à mon problème initial = lire un fichier txt (de plus de 16000 lignes) (cf. exemple réduit joint), je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data_env = list(csv.reader(open(ftp_env_file, 'rU'), delimiter='\t'));
    Si j'affiche les 2 premières lignes de cette liste, j'ai mes valeurs :
    >>data_env[0:2]

    [['22/04/2011 12:03:12', 'MA', '23,0', '50,0', '23,1', '50,9'], ['22/04/2011 12:03:33', 'MA', '23,0', '50,0', '22,9', '50,0']]

    Ce que je souhaite, c'est créer des vecteurs colonnes contenant les dates, info texte, chiffres en float (pour utiliser les outils numpy et matplotlib)...
    Fichiers attachés Fichiers attachés

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà ce que je peux proposer:

    A partie de la liste de chaine donnée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    L = ['22/04/2011', '12:03:12', 'MA', '23,0', '50,0', '23,1', '50,9']
     
    R = [' '.join(L[0:2])] + [L[2]] + [float(elem.replace(',','.')) for elem in L[3:]]
     
    print R
    ['22/04/2011 12:03:12', 'MA', 23.0, 50.0, 23.1, 50.9]
    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  9. #9
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Super... mon souci est presque résolu. J'ai essayer de boucler sur les lignes pour en extraire les colonnes, mais je n'arrive pas à les stocker...
    Je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data_env = list(csv.reader(open(ftp_env_file, 'rU'), delimiter='\t'));#Lecture du fichier d'environment
    for line in data_env:
        Env = [' '.join(line[0:1])] + [line[1]] + [float(elem.replace(',','.')) for elem in line[2:]]
    Mais je ne récupère qu'une seule ligne ...!

    Python est un super langage mais j'ai le sentiment qu'il faut avoir un besoin bien poussé pour dépasser les possibilités d'excel (où l'import de fichier texte est simplissime)...:-)

  10. #10
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Non, ça marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import csv
     
    ftp_env_file = "le_fichier.csv"
    data_env = list(csv.reader(open(ftp_env_file, 'rU'), delimiter='\t'));#Lecture du fichier d'environment
     
    R = []
    for line in data_env:
        Env = line[0:2] + [float(elem.replace(',','.')) for elem in line[2:]]
        R.append(Env)
     
    print R    
    [['22/04/2011 12:03:12', 'MA', 23.0, 50.0, 23.1, 50.9], ['22/04/2011 12:03:33', 'MA', 23.0, 50.0, 22.9, 50.0], ['22/04/2011 12:03:53', 'MA', 23.0, 50.0, 22.8, 49.9], ['22/04/2011 12:04:13', 'MA', 23.0, 50.0, 22.8, 50.1], ['22/04/2011 12:04:33', 'MA', 23.0, 50.0, 22.9, 50.4], ['22/04/2011 12:04:54', 'MA', 23.0, 50.0, 23.0, 51.4], ['22/04/2011 12:05:14', 'MA', 23.0, 50.0, 23.2, 51.9]]
    On obtient une liste de listes, chaque sous-liste représentant une ligne.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  11. #11
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Super. Donc je résumé pour indiquer ce post en résolu.

    Je souhaite importer un fichier texte nommé filetoimport au format suivant :
    29/04/2011 09:39:01 MA 23,0 40,0 21,8 100,0
    29/04/2011 09:39:02 MA 23,0 40,0 21,8 100,0
    29/04/2011 09:40:08 MA 23,0 40,0 21,7 100,0

    Je créé une liste contenant un liste de chaque ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    import csv
    data_env = list(csv.reader(open(filetoimport, 'rU'), delimiter='\t'));
    Puis je converti les valeurs numériques en float :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Env = []
    for line_env in data_env:
        R_env = line_env[0:2] + [float(elem.replace(',','.')) for elem in line_env[2:]]
        Env.append(R_env)
    Et enfin je converti cette liste en array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import numpy as np
    env=np.array(Env);
    Merci à tous de vos réponses.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/10/2009, 13h32
  2. [SQLS2K5]Pb Taille d'un .txt pour importation
    Par gusrom86 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/08/2008, 16h06
  3. Import XML pour mise à jour de données
    Par stylee307 dans le forum Access
    Réponses: 2
    Dernier message: 20/09/2006, 21h29
  4. [Importation] pbm pour importer un ".csv"
    Par javazer dans le forum Outils
    Réponses: 8
    Dernier message: 11/04/2006, 16h06

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