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 :

Utilisation du module RE


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 53
    Points
    53
    Par défaut Utilisation du module RE
    Bonjour,

    Je voudrais lire un fichier format TECPLOT en utilisant le module RE sur Pyhton.

    Mon fichier ressemble à ceci :

    TITLE = "Champ"
    VARIABLES = "X1" "X2" "X3" "Fn"
    ZONE T="Patch_02"
    I= 28 J= 48 K= 1 F=POINT
    mon programme qui doit lire l'entete est comme ceci :

    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
    def loadHeaderFmt( fich ) :
        titlePat= R.compile('TITLE *= *".*"')          # Recherche d'un titre pour le fichier tecplot
        varPat  = R.compile('VARIABLES *=( *".*")*')   # Search defined variables
        zonePat = R.compile('ZONE')                    # Search Zone beginning
        #strPat  = R.compile('"[^"]*"')                 # Recherche d'une chaine de caractere entre double quotes 
        # ******************************************************************************************************
        IPat = R.compile("[^a-z^A-Z]I *= *[0-9]*")    # Pour rechercher le nombre de noeuds en I
        JPat = R.compile("[^a-z^A-Z]J *= *[0-9]*")    # Pour rechercher le nombre de noeuds en J
        KPat = R.compile("[^a-z^A-Z]K *= *[0-9]*")    # Pour rechercher le nombre de noeuds en K
        strPat  = R.compile('"[^"]*"')                # Recherche d'une chaine de caractere entre double quotes
        numPat  = R.compile(" *[0-9][0-9]*")          # Pour entier un nombre d'une chaine de caractere mixte
     
        # ******************************************************************************************************
        zoneStr = None
        title = ""
        variables = None
        line = None
        dim = []
        while zoneStr == None :
            line = fich.readline()
            titleStr = titlePat.search(line)
            varStr   =   varPat.search(line)
            zoneStr  =  zonePat.search(line)
            ImStr = IPat.search(line)
            JmStr = JPat.search(line)
            KmStr = KPat.search(line)
            if titleStr != None :
                title = eval(strPat.search(titleStr.group(0)).group(0))
            if varStr != None :
                variablesStr = strPat.findall(line)
                variables = []
                for s in variablesStr:
                    variables.append(eval(s))
            if zoneStr != None :
     
               if ImStr != None :
                  dim[2] = eval(numPat.search(ImStr.group(0)).group(0))
               if JmStr != None :
                  dim[1] = eval(numPat.search(JmStr.group(0)).group(0))
               if KmStr != None :
                  dim[0] = eval(numPat.search(KmStr.group(0)).group(0))
        return (title,variables, line,dim)
    Mon code me retourne bien le titre, les variables et le nom de la zone, par contre en ce qui concerne les dimensions, il me retourne toujours le dim = []

    Est ce que vous auriez une idée d'ou ça cloche dans mon code??

    M.

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Bonjour ,


    Tu te lances dans les expressions régulières. Très bien !
    Au début, ça paraît inextricable comme une moto démontée. Mais une fois tout en place et réglages faits, ça roule avec bonheur.

    Bon, pour l’instant , on n’en est pas aux réglages....
    Pour m’éviter de réécrire des choses que j’ai déjà écrite, je te renvoie sur ce post:
    http://www.developpez.net/forums/d86...o/#post4943788



    1) Car il t’a encore échappé pour le moment qu’en écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    titleStr = titlePat.search(line)
    varStr = varPat.search(line)
    zoneStr = zonePat.search(line)
    ImStr = IPat.search(line)
    JmStr = JPat.search(line)
    KmStr = KPat.search(line)
    tu obtiens des MatchObjects:
    titleStr, varStr, zoneStr, ImStr, JmStr, KmStr
    que tu peux directment interroger, quand ils ne sont pas None, pour en tirer toutes sortes de renseignements sur la chaîne matchante,
    SI tu as défini des groupes au moyen de parenthèses dans la RE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    titlePat= re.compile('TITLE *= *"([^"])"')
    titleStr = titlePat.search(line)
    if titleStr: # si tilteStr est None, ce test donnera False
    title = titleStr.group(1)
    Ce n’est ainsi pas la peine de passer par eval()





    2) La seconde chose à bien noter, c’est que l’utilisation des regex permet de rechercher directement dans la chaîne qui constitue le fichier: ce n’est pas la peine de passer les lignes en revue.

    Qu’est ce que j’entends par chaîne qui constitue le fichier ?

    Plaons dans un fichier ’fifi.txt’ ton texte:
    TITLE = "Champ"
    VARIABLES = "X1" "X2" "X3" "Fn"
    ZONE T="Patch_02"
    I= 28 J= 48 K= 1 F=POINT
    Lisons le par le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    f = open(’fifi.txt’)
    ch = f.read()
    f.close()
    print ch
    on obtient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TITLE = "Champ"
    VARIABLES = "X1" "X2" "X3" "Fn"
    ZONE T="Patch_02"
    I= 28 J= 48 K= 1 F=POINT
    Non !!? Sans blague ??! What else ?

    Mais ce qu’on obtient est l’affichage de la chaîne ch, pas sa valeur.
    Par affichage, j’entends que les caractères de fin de ligne ’\n’ sont interprétés par le moteur de rendu (je crois que c’est ainsi que ça s’appelle) pour produire des retours à la ligne. Ce qu’on voit à l’écran , ce sont donc des lignes.
    Mais dans le fichier, il n’y a pas de lignes, il n’y a que des caractères ’\n’ épars.

    La chaîne qui constitue le fichier est donc tous les caractères affichés par print + les fins de lignes ’\n’ qu’on ne voit pas à l’affichage.
    Un fichier sur un disque dur n’est rien d’autre que la suite continue des caractères d’une chaîne.



    Comment faire pour visualiser les ’\n’ présents dans un fichier ?
    Grâce à la fonction repr() , qui affiche une chaîne représentant ce qui devrait être écrit pour obtenir un objet égal à l’argument de repr() .

    Par exemple si li est une liste et que repr(li) est
    [34, 23, 89, 120]
    cela veut dire que pour définir li par une instruction d’affectation, il faudrait écrire li = [34, 23, 89, 120]

    Pour une chaîne chex dont l’affichage donnerait
    un beau soleil
    repr(chex) sera ’un beau soleil’ car, si la valeur de chex est un beau soleil , la manière de la définir serait par contre chex = ’un beau soleil’.
    Ce que je veux dire c’est que les deux apostrophes au début et à la fin font partie de la représentation fournie par repr() , pas de la valeur de chex.


    Pour en revenir au fichier, le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    f = open('fifi.txt')
    ch = f.read()
    f.close()
    print repr(ch)
    donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'TITLE = "Champ"\nVARIABLES = "X1" "X2" "X3" "Fn"\nZONE T="Patch_02"\nI= 28 J= 48 K= 1 F=POINT '
    ce qui veut dire que le contenu du fichier = la chaîne qui constitue le fichier est
    TITLE = "Champ"\nVARIABLES = "X1" "X2" "X3" "Fn"\nZONE T="Patch_02"\nI= 28 J= 48 K= 1 F=POINT



    Ceci étant précisé, je reviens au début: on peut lancer la recherche titlePat.search() non pas sur chaque ligne, mais sur la chaîne qui constitue le fichier d’un seul bloc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    f = open('fifi.txt')
    ch = f.read()
    f.close()
    titleStr = titlePat.search(ch)




    3) Troisième chose:
    on peut définir plusieurs groupes dans une même RE, et donc ne recourir qu’à une seule regex pour trouver en une seule fois toutes les informations.
    Je reviendrai sur le sujet





    Voyons si tout ceci te permet d’avancer et améliorer ton code.

Discussions similaires

  1. Decompression d'un fichier sans utiliser les modules du CPAN
    Par choubiroute dans le forum Modules
    Réponses: 6
    Dernier message: 10/03/2006, 14h20
  2. [VB]utilisation des modules en vb
    Par zidenne dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 24/01/2006, 11h19
  3. erreur lorsque j'utilise le module session
    Par vbcasimir dans le forum Modules
    Réponses: 13
    Dernier message: 14/10/2005, 13h41
  4. utilisation du module WWW::Hotmail
    Par mouette_fstt dans le forum Modules
    Réponses: 2
    Dernier message: 22/07/2005, 16h58
  5. [web] Probleme de passe de variable qd j utilise un module TK
    Par Slippers dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 19/04/2005, 17h48

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