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 :

Parser un fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut Parser un fichier
    Bonjour,

    J'ai le fichier suivant:

    cellule (toto 1) {
    ligne 1
    ligne 2
    ........
    ........
    ligne n
    carré (a) {
    ligne 1
    ligne 2
    ........
    ligne n
    }
    carré (b) {
    ligne 1
    ligne 2
    ........
    ligne n
    # ainsi de suite
    }
    cellule (toto 2) {
    ......ainsi de suite
    j'aimerai arriver à récupérer les carré a b ainsi que les lignes qui correspondent....g'ai du mal a y arriver merci

  2. #2
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Les fonctions de bases des fichiers fonctionnent en lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    a=file('mon_fichier', 'rb')
    a.read() #retourne tous le fichier dans un string
    a.readlines() #retourne toutes les lignes du fichier dans un tableau 
    a.readline() #retourne la prochaine ligne
    # etc...
    J'ai déja fait un topo sur les fonctions de bases des fichiers: http://www.developpez.net/forums/d10...ertion-courbe/

    Le tous agrémenter de quelques boucles tu devrai boucler la récup de carré assez vite.
    Bonne chance.

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur R&D en apprentissage statistique
    Inscrit en
    Juin 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur R&D en apprentissage statistique

    Informations forums :
    Inscription : Juin 2009
    Messages : 447
    Par défaut
    Dans ton cas tu dois pouvoir utiliser des expressions rationnelles pour capturer les elements 'cellule' ou 'carre' du fichier et ensuite traiter séparément le contenu :

    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
    import re
     
    ELEMENT_REG = re.compile(r'(?P<element_type>[^\s]+?) \((?P<element_name>.+?)\) \{(?P<content>.*?)\}',re.MULTILINE|re.DOTALL)
     
    class Element(object) :
        def __init__(self,name,content):
            self.name = name
            self.content = content
     
        def __str__(self):
            return "< %s(name = '%s') >"%(self.__class__.__name__,self.name)
     
        def __repr__(self): return str(self)
     
    class Cellule(Element) :
        def __init__(self,*args,**kwargs):
            Element.__init__(self,*args,**kwargs)
     
    class Carre(Element) :
        def __init__(self,*args,**kwargs):
            Element.__init__(self,*args,**kwargs)
     
    def cellule_content_parse(content_text):
        # do something with the string representing the content of the element
        return content_text
     
    def carre_content_parse(content_text):
        # do something with the string representing the content of the element
        return content_text
     
    OBJECTS = { 
        'cellule' : (Cellule ,cellule_content_parse),
        'carre' : (Carre, carre_content_parse)
    }
     
    def parse(text):
        matches = ELEMENT_REG.findall(text)
        elements = []
        for etype,name,content in matches :
            cl,content_parse = OBJECTS[etype]
            elements.append(cl(name,content_parse(content)))
        return elements
     
    if __name__ == '__main__' :
        import sys
     
        filename = sys.argv[1]
     
        for e in parse(open(filename).read()) :
            print e
    Tu peux aussi faire un "parser" qui lit le fichier ligne à ligne est modifie son état interne suivant le contenu de chaque ligne ici, ça ne devrait pas être trop compliqué mais ça peut devenir fastidieux si le format de fichier est un peu compliqué.

    Sinon si c'est possible tu as aussi la solution consistant à utiliser un format standard comme JSON, pour lequel il existe des module dans bibliothèque standard de python.

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Le format du fichier est fixe ? Soit quelque chose comme :

    fichier.txt
    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
    cellule (toto 1) [
    ligne a
    ligne b
    ligne c
    ligne d
    ligne e
    ]
    carré ( a ) {
    ligne 1
    ligne 2
    line a
    ligne 3
    ligne 4
    }
    123456
    carré (b) {
    ligne 5
    ligne 6
    ligne 7
    ligne 8
    }
    other
    cellule(toto 2 ) {
    ligne f
    ligne i
    ligne j
    ligne k
    ligne l
    }
    Dans ce cas un basique
    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
    #! /usr/bin/env/ python
    # -*- coding: utf-8 -*-
    # 
    #
    def getlines(fichier, form, endmark='}', reqstr=None):
    #def getlines(fichier, form, endmark='}'):
        lgn = []
        fm = None
        r = []
        with open(fichier, 'r') as f:
            for l in f:
                if endmark in l and fm:
                    r.append((fm.strip(), lgn))
                    fm = None
                    lgn = []
                if fm:
                    if reqstr:
                        if reqstr in l:
                            lgn.append(l.rstrip()) #.split()[1]
                    else:
                        lgn.append(l.rstrip())
                    #lgn.append(l.rstrip())
                if l.startswith(form):
                    fm = l.split('(')[1].split(')')[0]
        return r
     
    f = 'fichier.txt'
     
    r = 'carré'
    result = getlines(f, r, reqstr='ligne')
    #result = getlines(f, r)
    print('Recherche de %s dans %s'% (r, f))
    for elems in result:
        print('{0} {1} = {2}'.format(r, elems[0], elems[1]))
     
    result = getlines(f, 'cellule', endmark=']')
    print('Recherche de %(marecherche)s dans %(monfichier)s'% {"marecherche": 'cellule',
        "monfichier": f})
    for elems in result:
        print('%s %s = %s'% ('cellule', elems[0], elems[1]))
    suffit non ?

    @+

Discussions similaires

  1. [SAX] parser un fichier xml en Java
    Par royou dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/02/2005, 17h12
  2. parser un fichier .dtd
    Par bgranou dans le forum Valider
    Réponses: 2
    Dernier message: 04/06/2004, 19h53
  3. parser des fichier .xml en perl
    Par djibril dans le forum Modules
    Réponses: 13
    Dernier message: 18/05/2004, 17h08
  4. parser un fichier avec xerces
    Par traiangueul dans le forum XML/XSL et SOAP
    Réponses: 9
    Dernier message: 02/02/2004, 18h14
  5. parser un fichier html
    Par noarno dans le forum ASP
    Réponses: 2
    Dernier message: 10/12/2003, 17h53

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