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 :

Problème récupération de données depuis un fichier .txt


Sujet :

Python

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2022
    Messages : 2
    Par défaut Problème récupération de données depuis un fichier .txt
    Bonjour tout le monde !

    Dans le cadre de mon stage, je dois piloter et récupérer les données d'un appareil de mesure (mesure de la conductivité électrique) via Python. J'arrive à communiquer et piloter l'appareil via Ethernet sans problème, néanmoins lors de la récupération des données j'obtiens une liste (que j'enregistre dans un fichier .txt) sous cette forme :
    Pièce jointe 620521

    Mon problème est le suivant : j'aimerais réaliser un tableau via pandas afin de le mettre dans un fichier excel. Afin de réaliser ce tableau, je dois extraire 2 listes (tension et intensité) du fichier .txt ci-dessus. Or je ne peux exploiter mes données tels quels puisque ma liste ne contient qu'une ligne. De plus dans cette liste, les données en position "impaire" correspondent à l'intensité et les données en position "paire" correspondent à la tensions :
    Nom : ListeBuffer.PNG
Affichages : 168
Taille : 4,0 Ko

    Je ne sais pas si il existe une fonction capable de récupérer les données d'une liste en fonction de la position des données (peut-être avec une boucle). Auriez_vous une idée ou une proposition pour régler mon problème ?

    AdriMine.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 714
    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 714
    Par défaut
    Citation Envoyé par AdriMine Voir le message
    Auriez_vous une idée ou une proposition pour régler mon problème ?
    Si vous voulez utilisez pandas, prenez le temps de comprendre comment ça fonctionne.

    Si c'est trop compliqué, lire un fichier texte, en extraire les données qu'on veut de chaque ligne pour en faire un tableau à 2 dimensions et en faire un fichier CSV ou Excel sera peut être plus facile.

    Mais au bout du bout, c'est vous qui programmez...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 423
    Par défaut
    D'accord avec wiztricks
    Panda, c'est super mais c'est de la grosse machinerie.
    le module csv fait déjà pas mal de trucs tout en restant trivial

    ici un lien qui montre des exemples avec les deux.
    https://pythonguides.com/python-write-a-list-to-csv/

  4. #4
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 423
    Par défaut
    Citation Envoyé par AdriMine Voir le message
    Bonjour tout le monde !

    Je ne sais pas si il existe une fonction capable de récupérer les données d'une liste en fonction de la position des données (peut-être avec une boucle). Auriez_vous une idée ou une proposition pour régler mon problème ?
    je ne comprends pas la question. C'est natif, avec les listes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    liste = [1,2,3,4]
    print(liste[2])
     
    liste = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
    print(liste[1][2])

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par AdriMine Voir le message
    Je ne sais pas si il existe une fonction capable de récupérer les données d'une liste en fonction de la position des données (peut-être avec une boucle).
    Ben oui. C'est quand-même un petit peu la base des listes que de pouvoir extraire telle donnée en fonction de sa position. C'est ce qu'on appelle "l'index".
    Si "L" est une liste, alors L[0] c'est le premier élément, L[1] c'est le second, L[2] le 3° et etc. C'est écrit dans tous les tutos Python pour débutant.

    Citation Envoyé par AdriMine Voir le message
    De plus dans cette liste, les données en position "impaire" correspondent à l'intensité et les données en position "paire" correspondent à la tensions
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    intensite=L[0::2]
    tension=L[1::2]
    Ca c'est le slicing (extraction d'une sous-liste là aussi par position sauf que les positions sont exprimées sous forme debut:fin:increment).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    intensite=L[0::2]
    tension=L[1::2]
    Ca c'est le slicing (extraction d'une sous-liste là aussi par position sauf que les positions sont exprimées sous forme debut:fin:increment).
    Ah yes, je n'y aurais pas pensé ! C'est sûrement la méthode la plus rapide !

    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
    >>> L = [random.random() for _ in range(100000000)]
     
    >>> def t1():
    	st = time.time()
    	t = L[0::2]
    	print(time.time()-st)
     
    >>> def t2():
    	st = time.time()
    	t = [l for i, l in enumerate(L) if i % 2 == 0]
    	print(time.time()-st)
     
    >>> t1()
    0.4607667922973633
     
    >>> t2()
    5.627790212631226

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> def t2():
    	st = time.time()
    	t = [l for i, l in enumerate(L) if i % 2 == 0]
    	print(time.time()-st)
    Sans déconner !!! Il doit y avoir au-moins un milliard de méthodes 10 fois plus rapide que celle-ci qui génère une énumération (une énumération c'est quand-même deux listes parallèles !!!) pour isoler les éléments pairs
    Ce n'est pas parce que tu essayes des trucs qu'il faut essayer le pire des trucs parce que un tel test n'a aucun sens (personne n'irai écrire ça). Tu aurais pu par exemple utiliser range(0, len(L), 2) qui est une possibilité plus crédible...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Tu aurais pu par exemple utiliser range(0, len(L), 2) qui est une possibilité plus crédible...
    Oh tu sais moi j'écris des trucs plus improbables que ça encore, je dirais même plus, dans ma tête ça paraît assez logique !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> def t4():
    	st = time.time()
    	t = [L[i] for i in range(0,len(L),2)]
    	print(time.time()-st)
     
     
    >>> t4()
    2.405531644821167
    2x plus rapide effectivement que l'énumération, sans surprise du coup ^^

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    je dirais même plus, dans ma tête ça paraît assez logique !
    Ah ton code était parfaitement logique, sur ça on ne peut rien dire. Mais pour une liste de 20 éléments tu en génères 40 et tu n'en gardes que 10
    Ce qu'il faut c'est à chaque fois que tu pars dans des trucs un poil complexes (exemple listes en intension en plus avec test) se dire "n'y a-t-il pas un truc plus efficace" ? Et si tu peux trouver une librairie qui fait le job (numpy, panda, sqlite) c'est encore mieux (les librairies sont écrites en C donc ultra rapides).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 321
    Par défaut
    bonjour
    Citation Envoyé par AdriMine Voir le message
    j'obtiens une liste (que j'enregistre dans un fichier .txt) sous cette forme :
    Au lieu de vouloir convertir le fichier texte (non exploitable ?), il serait plus judicieux de l'enregistrer directement en .csv ? je suppose que l'api à ton appareil de mesure ne renvoie pas directement un tableau ?

  11. #11
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2022
    Messages : 2
    Par défaut
    Bonjour à tous, et merci pour vos très nombreuses réponses et remarques.

    Pour info, j'ai réussi à m'en sortir avec cette histoire de liste avec les positions pairs et impaires grâce à une boucle while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    donnees_recus = self.K6221.query_ascii_values("TRAC:DATA?")     """Liste reçus par l'appareil"""
            x = []
            y = []
            z=0
            l= len(donnees_recus)
            while z < l:
                if z % 2==0:
                    x.append(donnees_recus[z])
                    z = z+1
                else:
                    y.append(donnees_recus[z])
                    z = z+1
    Cette boucle fonctionne et ça me convient parfaitement ! En fait ce que je cherchais (et ce que je voulais savoir ) si une bibliothèque (comme pandas ou autre) avait une fonction qui m'aurait permis de le faire de manière "automatique" si je puis dire. Et j'étais aussi au courant que les balises dans les listes renvoyées une donnée par rapport à la position de cette dernière dans la liste.

    Citation Envoyé par papajoker Voir le message
    Au lieu de vouloir convertir le fichier texte (non exploitable ?), il serait plus judicieux de l'enregistrer directement en .csv ? je suppose que l'api à ton appareil de mesure ne renvoie pas directement un tableau ?
    Sur cette partie là, j'ai fait différemment ! La liste que je recevais de l'appareil (K6621) n'avait pas besoin d'être enregistré dans un fichier temporaire en .txt pour après le réutiliser (dans le programme existant en Python 2, on devait rouvrir ce fichier avec Numpy pour le traiter par la suite). Ce que j'ai fait, j'ai tout simplement enregistré ma liste dans la variable donnees_recus afin de l'exploiter directement.

    Je dois avoué que je n'avais pas touché à Python depuis au moins 1 an et que j'ai un peu mal révisé certaines parties puisque je me suis redirigée dans l'automatisme industriel.

    En tout cas je vous remercie beaucoup pour vos nombreuses réponses !

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 714
    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 714
    Par défaut
    Citation Envoyé par AdriMine Voir le message
    La liste que je recevais de l'appareil (K6621) n'avait pas besoin d'être enregistré dans un fichier temporaire en .txt pour après le réutiliser
    Si votre fichier texte était sous la forme de lignes contenant une mesure (tension et intensité), vous pourriez plus facilement l'exploiter avec pandas (sans avoir à découper une liste).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par AdriMine Voir le message
    Cette boucle fonctionne et ça me convient parfaitement !
    Pas à moi. Quand je vois écrit...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if truc:
    	actionX
    	actionZ
    else:
    	actionY
    	actionZ
    .. .ça me hérisse littéralement. Comment peut-on dire "ça me convient" avec cette répétition absolument inutile d'instruction, franchement ???

    Citation Envoyé par AdriMine Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    x = []
    y = []
    z=0
    l= len(donnees_recus)
    while z < l:
    	if z % 2==0:
    		x.append(donnees_recus[z])
    		z = z+1
    	else:
    		y.append(donnees_recus[z])
    		z = z+1
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x=donnees_recus[0::2]
    y=donnees_recus[1::2]
    Et ça il me semblait l'avoir déjà écrit...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Invité
    Invité(e)
    Par défaut
    Étonnamment (pour moi) while z < l: n'est pas moins performant que while z != l:, de façon notable du moins.

    C'est pas trop mal sa proposition tout de même, 13x moins rapide que le slicing et 2.5x moins que la compréhesion de liste mais bon faut voir combien de données il y a à traiter.

Discussions similaires

  1. Récupération de données dans un fichier .txt
    Par Crackos dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/09/2010, 14h15
  2. Charger des donnés depuis un fichier .txt
    Par Rifano dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/07/2009, 11h59
  3. Réponses: 6
    Dernier message: 20/01/2008, 16h32
  4. Récupération des données d'un fichier .txt
    Par vincou dans le forum VB.NET
    Réponses: 3
    Dernier message: 24/07/2007, 10h55
  5. problème récupération de données dans des fichiers .DAT
    Par indymontpellier dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/04/2006, 07h54

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