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 :

Extraire des données dans un fichier


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut Extraire des données dans un fichier
    Bonjour,

    Voila je doit réaliser un parser qui me permet de récupérer des données dans le fichier suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    pin : "streck"
     dst : "smatch
     macro(AMD) {
      pin_ehq :"top";
      pin_ert :"ray";
      pin_tfg :"vft";
     macro(AGT) {
      pin_ehq :"top";
      pin_ert :"ray_ht";
      pin_tfg :"vft";
     macro(BGD) {
      pin_ehq :"top";
      pin_ert :"ray_li";
      pin_tfg :"vft";
    Je cherche à extraire la chaine de caractere "pin_ert" qui correspond à chaque "macro". Par exemple pour la macro "macro(AMD)" correspond la pin_ert "ray". Ensuite pouvoir concaténer "AMD_ray".

    J'ai fait un bout de programme mais sa ne marche pas:

    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
    def toto():
     
           Liste = ('AMD','AGT','BGD')
           ch = "pin_ert"   
           fs = open('fichier1', 'r')
           fd = open('fichier2','w')
           while 1:
            txt = fs.readline()
            if txt =='':
                break
            if ch in txt:
                fd.write(txt)
        fs.close()
        fd.close()
        returnsource.close()
    Je suis débutant sur python et j'aimerais obtenir de l'aide svp...

  2. #2
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Bonsoir,
    peux-tu utiliser la balise code dans ton message ?

    Sinon, pour ton problème, étant donné que tu dis être débutant, et que tu ne parles pas de regex, je te propose la méthode suivante :
    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
     
    #! /usr/bin/env python
    #coding=utf-8
     
    pathOfTheFile = "fichierEntree.txt"
    infosFound = []
     
    with open(pathOfTheFile, mode = 'r') as fileToAnalyse:
        for oneLine in fileToAnalyse:
            oneLine = oneLine.strip()
     
            if oneLine.startswith('macro'):
                id = oneLine\
                        .replace('macro', '')\
                        .replace('(', '')\
                        .replace(')', '')\
                        .replace('{', '')
     
                id = id.strip()
     
            elif oneLine.startswith('pin_ert'):
                val = oneLine\
                        .replace('pin_ert', '')\
                        .replace(':', '')\
                        .replace('"', '')\
                        .replace(';', '')
     
                val = val.strip()
     
                infosFound.append(id + '_' + val)
     
    with open('sortie.txt', mode = 'w') as answer:
        answer.write('\n'.join(infosFound))
    Bien entendu, on peut faire mieux.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    Ben en fait la balise code c'est pour des fichier HTML jcrois nn.....moi je cherche à parser un fichier texte.....

    par contre si j'avais dans mon fichier un truc du genre:

    macro AMD
    param1
    param2
    end macro AMD

    macro BGD
    param1
    param2
    end macro BGT
    ...........
    ............

    pour recueillir le param2 je n'ai pas besoin de prendre en compte "end macro...." puisque "macro" me suffit pour me déplacer de macro en macro et de surcroit sur le param2 correspondant à la bonne macro nn??

  4. #4
    Membre averti Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Points : 390
    Points
    390
    Par défaut
    Comme très souvent pour ce genre de question, le cahier des charges est flou. Et même parfois la personne qui pose la question ajoute des contraintes au fur et à mesure que des réponses sont proposées. Remarquez, à chaque fois que j'ai mis sur papier les données d'un problème de ce type en vue de poster, le problème s'en est trouvé résolu avant de poster.
    On est tenté de proposer une réponse gag, genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def resoudProbleme():
        return """AMD_ray
    AGT_ray_ht
    BGD_ray_li"""
     
    print resoudProbleme()
    Plus sérieusement le code suivant peut fonctionner dans certains cas:
    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
    #lines = open('fichier', 'r').readlines()
    lines = """pin : "streck"
     dst : "smatch
     macro(AMD) {
      pin_ehq :"top";
      pin_ert :"ray";
      pin_tfg :"vft";
     macro(AGT) {
      pin_ehq :"top";
      pin_ert :"ray_ht";
      pin_tfg :"vft";
     macro(BGD) {
      pin_ehq :"top";
      pin_ert :"ray_li";
      pin_tfg :"vft";""".splitlines()
     
    #élimination des lignes vides, facultatif
    lines = [L for L in lines if len(L.strip()) != 0]
     
    for keyline, valueline  in [(lines[i], lines[i+2]) for i in range(2, len(lines), 4)]:
        print keyline.split('(')[1].split(')')[0] + '_' + valueline.split('"')[1]

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 184
    Points
    184
    Par défaut
    Salut,

    si tu es responsable de l'écriture du fichier, moyennant quelques modifications, tu dois pouvoir utiliser un parser existant.

    Exemple avec PyYAML :

    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
     
    #data.yaml
    pin: streck
    dst: smatch
    macros:
        AMD:
            pin_ehq: top
            pin_ert: ray
            pin_tfg: vft
        AGT:
            pin_ehq: top
            pin_ert: ray_ht
            pin_tfg: vft
        BGD:
            pin_ehq: top
            pin_ert: ray_li
            pin_tfg: vft
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #get_macros.py
    from yaml import load
     
    with open('data.yaml') as f:
        data = load(f.read())
     
    macros = data['macros']
     
    print macros
    Regarde ce que donne la sortie de get_macros.py.

    A adapter en fonction de :
    1. ce que tu veux;
    2. ce que tu peux modifier dans le fichier d'input.

    Bien sûr, si tu ne peux pas modifier le fichier d'input, mon idée va être beaucoup moins intéressante (en même temps, une syntaxe où il y a des accolades ouvrantes sans accolades fermantes correspondantes, ça me parait louche).

Discussions similaires

  1. [MySQL] Comment extraire des données dans un fichier .svc depuis une page web
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/12/2013, 12h02
  2. Réponses: 1
    Dernier message: 15/12/2008, 19h50
  3. Réponses: 5
    Dernier message: 05/12/2008, 15h23
  4. Réponses: 2
    Dernier message: 22/06/2008, 15h41
  5. Extraire des données dans un fichier .csv
    Par orj30754 dans le forum C
    Réponses: 7
    Dernier message: 03/11/2006, 14h48

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