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 une partie d'une ligne txt


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 29
    Par défaut récupérer une partie d'une ligne txt
    Bonjour,
    Mon problème est le suivant, j'ai un fichier cfg de ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NOM_TEST=TEST CALIBRATION
    DEB_CONFIG
    DUT_MOD_IP=172.16.1.190
    DUT_DEMOD_IP=172.16.1.191
    #AWG_IP=172.16.1.190
    END_CONFIG
    Je parviens a lire l'ensemble du fichier mais je souhaiterais récupérer certaines données seulement. Je souhaiterais donc lire uniquement des valeurs précises en indiquant ou je veux commencer a lire.

    En francais ca donnerait

    str1 = ce qui se trouve après 'NOM_TEST=' jusqu'a la fin de la ligne
    str2 = ce qui se trouve après 'DUT_MOD_IP=' jusqu'a la fin de la ligne
    str3 = ce qui se trouve après 'DUT_DEMOD_IP=' jusque a la fin de la ligne

    Avec la fonction readline j'arrive a faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str1='NOM_TEST=TEST CALIBRATION'
    Et je voudrais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str1='TEST CALIBRATION'
    Existe-t-il donc une fonction permettant de lire seulement une partie de la ligne après une chaine précise ? Et si oui laquelle ?
    Je précise que je suis débutant sous python et que j'utilise python 2.7
    Merci d'avance

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,
    Si vous en restez a des chaînes de caractères, la ligne lue "NOM_TEST=TEST CALIBRATION" dans str1 peut être découpée en ['NOM_TEST', 'TEST CALIBRATION'] via un simple .split('=').
    La valeur recherche s'obtient alors en récupérant [1]:
    >>> str1 = "NOM_TEST=TEST CALIBRATION"
    >>> str1.split('=')
    ['NOM_TEST', 'TEST CALIBRATION']
    >>> str1.split('=')[1]
    'TEST CALIBRATION'
    >>>
    Mais cela fait les suppositions cote "fichier bien construit" devront être testées par votre code.

    Une autre option est d'utiliser le module ConfigParser. Mais il suppose que votre fichier de .cfg soit construit un peu differement.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data=u'''
    [TEST]
    NOM=TEST CALIBRATION
    [CONFIG]
    DUT_MOD_IP=172.16.1.190
    DUT_DEMOD_IP=172.16.1.191
    #AWG_IP=172.16.1.190
    '''
    Dans ce cas pour recuperer la valeur d'une option dans une section X, il suffit de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import io
    from ConfigParser import ConfigParser
     
    file = io.StringIO(data)
    parser = ConfigParser()
    parser.readfp(file)
     
    nom_test = parser.get('TEST', 'NOM')
    print nom_test
    dut_mod_ip = parser.get('CONFIG', 'DUT_MOD_IP')
    print dut_mod_ip
    Si vous voulez garder le fichier CFG dans le format actuel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NOM_TEST=TEST CALIBRATION
    DEB_CONFIG
    DUT_MOD_IP=172.16.1.190
    DUT_DEMOD_IP=172.16.1.191
    #AWG_IP=172.16.1.190
    END_CONFIG
    et pouvoir le lire en vous assurant qu'il est bien forme et en réalisant une interface semblable, il va falloir apprendre a utiliser les expressions régulières (module re).

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

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 : 4 062
    Par défaut
    Un fichier de configuration doit être un minimum organisé, vous pourriez par exemple utiliser le module configparser qui imposera ce minimum.

    Bonne continuation...

    Edit : Grilled

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tu peux "splitter" la chaîne de texte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    >>> txt = """NOM_TEST=TEST CALIBRATION
    ... DEB_CONFIG
    ... DUT_MOD_IP=172.16.1.190
    ... DUT_DEMOD_IP=172.16.1.191"""
    >>> lines = txt.split()
    >>> for i in lines:
    ...     if '=' in i:
    ...             k, v = i.split('=')
    ...             print('Key: %s, value: %s' % (k, v))
    ... 
    Key: NOM_TEST, value: TEST
    Key: DUT_MOD_IP, value: 172.16.1.190
    Key: DUT_DEMOD_IP, value: 172.16.1.191

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 29
    Par défaut
    Merci pour vos réponses rapides
    Concernant la méthode de split je la connaissais mais je préférais l'éviter car ce ne sera pas toujours très pratique.

    Par contre je ne connaissais pas configparser je vais me renseigner de ce côté là. Le fichier cfg va surement être revu
    En utilisant la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import io
    from ConfigParser import ConfigParser
     
    file = io.StringIO(data)
    parser = ConfigParser()
    parser.readfp(file)
     
    nom_test = parser.get('TEST', 'NOM')
    print nom_test
    dut_mod_ip = parser.get('CONFIG', 'DUT_MOD_IP')
    print dut_mod_ip
    Je n'ai plus besoin d'utiliser open puis close a la fin de mon fichier ?

    Mais est-il possible de dire que l'on souhaite lire a partir de 'NOM_TEST= ' car sur MATLAB je sais que c'est faisable (avec sscanf) mais en python je ne trouve pas d'équivalent.

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 : 4 062
    Par défaut
    StringIO crée un objet python fichier, si tu n'utilises pas StringIO avec des données brutes, tu dois utiliser open et close pour créer cet objet fichier.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par nikaulas Voir le message
    Je n'ai plus besoin d'utiliser open puis close a la fin de mon fichier ?
    C'est un exemple écrit juste pour "illustrer" les possibilités du module et vous inciter a lire sa documentation.

    Mais est-il possible de dire que l'on souhaite lire a partir de 'NOM_TEST= ' car sur MATLAB je sais que c'est faisable (avec sscanf) mais en python je ne trouve pas d'équivalent.
    "lire a partir de" laisse penser que le fichier lu n'est pas celui que vous avez montre et qu'il faut peut etre faire autre chose.
    A part ca, en programmation beaucoup de choses sont possibles pourvu qu'on sache ce qu'on veut.

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

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 29
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    "lire a partir de" laisse penser que le fichier lu n'est pas celui que vous avez montre et qu'il faut peut etre faire autre chose.
    A part ca, en programmation beaucoup de choses sont possibles pourvu qu'on sache ce qu'on veut.

    - W
    Effectivement je me suis mal exprimé, dans les fait je lis tous le contenu du txt, j'utilise le code suivant pour lire le fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contenu = open("E:\USERS\Nicolas_B\listeTests.cfg", 'r').readlines()
    Ensuite si je print mon contenu j'obtiens tous le texte mais ce que je souhaiterais c'est dire que ma variable est égale au contenu de la chaine de caractère compris entre 'NOM_TEST=' et le '\n' qui suit. Ici le = est un cas particulier c'est pour cela que je veux éviter d'utiliser split.

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Certes.
    Mais a priori, on vous a déjà donne les réponses: .split, ConfigParser, module re
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 29
    Par défaut
    D'accord mais j'aurais quelques questions concernant le ConfigParser, j'ai re écrit mon fichier cfg mais je n'arrive pas à charger mon fichier cfg
    Mon fichier cfg ressemble a ca :
    [DATE]
    DATE=08/04/2013
    [CONFIG]
    DUT_MOD_IP=172.16.1.190
    [TEST]
    NOM_TEST=QUALIF_001--BPSK-PRBS15-a
    NO_TEST= 1
    VERIF_MATLAB=analyse.m
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file = io.StringIO("F:\TEST\Tests.cfg")
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file = io.StringIO('Tests.cfg')
    Traceback (most recent call last):
    File "<pyshell#101>", line 1, in <module>
    file = io.StringIO('Tests.cfg')
    TypeError: initial_value must be unicode or None, not str
    En tout cas un grand merci pour vos conseil et votre reactivité

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Utiliser des modules ou des fonctions demande d'aller lire et comprendre la documentation qui s'y rapporte. Parfois c'est fastidieux et il est sera plus rapide de coder un truc vite fait que de se divertir a apprendre.

    Comme vous débutez "coder un truc vite fait" n'est pas une option.

    Vous avez donc le choix:
    • mieux utiliser les méthodes des "strings" Python (.split) & Co.
    • apprendre a voyager dans les bibliothèques standards pour apprendre a utiliser les modules ConfigParser, re,...


    Pour répondre a vos questions:
    • StringIO est un module qui permet de transformer une chaîne de caractère en un "file". C'est pratique pour tester un truc suppose lire un fichier: vous pouvez inclure texte et code dans le script et vois ce que ça donne.
      Par contre io est un module 2.7 qui permet de voler en 3.x StringIO attend des "str" i.e. des littéraux préfixes par "u". Sinon c'est des Bytes et vous devriez avoir le BytesIO qui va bien.
    • Pour dire a ConfigParser de lire un fichier en lui donnant son nom plutôt qu'un file (déjà ouvert), il faut utiliser .read_file et pas .readfp.
      Pas besoin du StringIO.


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

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 29
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Utiliser des modules ou des fonctions demande d'aller lire et comprendre la documentation qui s'y rapporte. Parfois c'est fastidieux et il est sera plus rapide de coder un truc vite fait que de se divertir a apprendre.

    Comme vous débutez "coder un truc vite fait" n'est pas une option.

    Vous avez donc le choix:
    • mieux utiliser les méthodes des "strings" Python (.split) & Co.
    • apprendre a voyager dans les bibliothèques standards pour apprendre a utiliser les modules ConfigParser, re,...


    Pour répondre a vos questions:
    • StringIO est un module qui permet de transformer une chaîne de caractère en un "file". C'est pratique pour tester un truc suppose lire un fichier: vous pouvez inclure texte et code dans le script et vois ce que ça donne.
      Par contre io est un module 2.7 qui permet de voler en 3.x StringIO attend des "str" i.e. des littéraux préfixes par "u". Sinon c'est des Bytes et vous devriez avoir le BytesIO qui va bien.
    • Pour dire a ConfigParser de lire un fichier en lui donnant son nom plutôt qu'un file (déjà ouvert), il faut utiliser .read_file et pas .readfp.
      Pas besoin du StringIO.


    - W
    Merci beaucoup wiztricks pour tes conseils. Après avoir buché la doc du module configparser j'arrive a m'en servir correctement et c'est plus intéressant pour moi pour récupérer mes variables

    Edit : J'aurais juste encore une question
    Quelle est la difference entre ces deux lignes :

    ConfigParser.ConfigParser()
    ConfigParser.RawConfigParser()

    Les deux me créent un objet config permettant de lire mon fichier si j'ai bien compris mais dans quel cas utilise-t-on rawconfigparser

  13. #13
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut
    La différence se limite a ce qui est documente: les paramètres optionnels des 2 méthodes mentionnes.
    Comme en 3.x RawConfigParser n'existe que pour la compatibilite 2.x, autant l'ignorer et utiliser ConfigParser.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. [Débutant] Récupérer les coordonnées d'une partie d'une figure
    Par LeTube dans le forum MATLAB
    Réponses: 0
    Dernier message: 04/06/2014, 13h41
  2. [WD16] Récupérer la valeur d'une colonne d'une table d'une ligne précise
    Par elghers_hocine dans le forum WinDev
    Réponses: 16
    Dernier message: 06/05/2011, 18h11
  3. Sélectionner seulement une partie d'une valeur d'une cellule
    Par ArthurO0O dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/08/2007, 11h05
  4. masquer une partie d'une vidéo par une banniere
    Par lezabour dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 16/10/2006, 16h47
  5. copier une partie d'une image vers une autre
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 13h39

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