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 de texte - amélioration du code


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2017
    Messages : 2
    Points : 2
    Points
    2
    Par défaut parser de texte - amélioration du code
    Bonjour

    Je viens de finir un de mes premiers code python en POO et je viens écrire sur ce forum afin de poster mon code et avoir un retour de votre part concernant des éventuelles améliorations du code.
    Il se trouve que le code fonctionne correctement mais je pense qu'il y a beaucoup d'aspects de python que je ne maîtrise pas et je souhaite avoir l'avis de gens plus expérimentés pour m'apporter des solutions plus élégantes.

    Je cherche à inclure une ID devant un blocs de titres organisés en hiérarchie par tabulation.
    WBS of the Project
    \t Design
    \t\t Preliminary Design Review
    \t\t\t Documentation milestone 1
    \t\t\t\t Documentation package drafting
    \t\t\t PDR Meeting
    \t\t\t\t PDR Report
    \t\t Critical Design Review
    \t\t\t Documentation milestone 2
    \t\t\t\t Documentation package drafting
    \t\t\t Final CDR Meeting
    \t\t\t\t Final CDR Report
    \t\t\t Documentation milestone 3
    \t\t\t\t Documentation package drafting
    \t HW & SW Development
    \t\t Software
    \t\t\t Software Specification
    \t\t\t\t Spec 1
    \t\t\t\t Spec 2
    \t\t\t\t Spec 3


    Je chercher à garder les tabulations de titre mais inclure un numéro devant chaque titre : 1.1 ou 1.1.2 etc


    1 WBS of the Project
    \t 1.1 Design
    \t\t 1.1.1 Preliminary Design Review
    \t\t\t 1.1.1.1 Documentation milestone 1
    \t\t\t\t 1.1.1.1.1 Documentation package drafting
    \t\t\t 1.1.1.2 PDR Meeting
    \t\t\t\t 1.1.1.2.1 PDR Report
    \t\t 1.1.2 Critical Design Review
    \t\t\t 1.1.2.1 Documentation milestone 2
    \t\t\t\t 1.1.2.1.1 Documentation package drafting
    \t\t\t 1.1.2.2 Final CDR Meeting
    \t\t\t\t 1.1.2.2.1 Final CDR Report
    \t\t\t 1.1.2.3 Documentation milestone 3
    \t\t\t\t 1.1.2.3.1 Documentation package drafting


    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    # -*-coding: utf8 -*
    #Python 3 only
     
    """
    ##################         Algorithm       #########################
    #      Original         |    Count   |    ID        |     len(ID)  #
    #Project                |    0       |     1        |       1      #
    #   HW                  |    1       |     1.1      |       3      #
    #       Specification   |    2       |     1.1.1    |       5      #
    #   SW                  |    1       |     1.2      |       3      #
    #       Specification   |    2       |     1.2.1    |       5      #
    #       Code            |    2       |     1.2.2    |       5      #
    #           Validation  |    3       |     1.2.2.1  |       7      #
    #   Qualification       |    1       |     1.3      |       3      #
    ####################################################################
     
    """
     
    import os
    import re
    import sys
     
    def tabCreator(nb_tab, sentence):
        """
        Function that returns a sentence with the number of tab on front
        """
        temp_sentence = sentence
        for tab in range(nb_tab):
            temp_sentence = "\t" + temp_sentence
        return temp_sentence
     
    def calculID(count_tab, ID):
        """
        Function that gives an ID to each title depending on its level of hierarchy
        """    
        #if the level hierarchy is inferior to the previous ID then add ".1"
        if 2*count_tab+1 > len(str(ID)):
            ID = ID + ".1"
     
        #otherwise if level hierarchy is equal to the previous ID then increase last numbe
        elif 2*count_tab +1 == len(str(ID)):
            ID = ID[:-1] + str(int(ID[-1])+1)
     
        #in other cases, increase the level ID 
        else:
            ID = ID[0:count_tab*2] + str(int(ID[count_tab*2])+1)
     
        return ID
     
    class WBS:
        """
        Class defining an object for manipulating a WBS document
        """
        def __init__(self, origin_file='WBS.txt'):
            self.original_content = open(origin_file,'r', encoding="utf8")
            self.final_file = open('GENERATED_WBS.txt','w', encoding="utf8")
            self.l_final = []
            self.count_tab = 0
            self.ID = "0"        
     
        def parseOrigin(self):
            """
            Function for parsing the original content
            remove \n character
            Allocate tab space to hierarchy number
            """
     
            for each_line in self.original_content:
     
                #counts how many tab are included in the sentence
                self.count_tab = each_line.count("\t")
     
                #calculate the level of hierarchy of the title
                self.ID = calculID(self.count_tab, self.ID)
     
                #removes the \n character from the line
                temp_buffer = each_line.replace('\n','')   
     
                #split each line from original list into two different lists
                temp_buffer = re.compile("\t+").split(temp_buffer)
     
                #then concatenate ID and the content of the line
                temp_buffer[-1] = self.ID + " " + temp_buffer[-1]
     
                #creates a tabulation before ID
                final_sentence = tabCreator(self.count_tab, temp_buffer[-1])
     
                #include it into final list
                self.l_final.append(final_sentence)
     
        def writeFinalFile(self):
            """
            Function to write l_final into final file
            """
            for each_line in self.l_final:
                print(each_line,file=self.final_file)
     
        def closeFiles(self):
            """
            Function to close all files
            """
            self.original_content.close()
            self.final_file.close()
     
    if __name__ == '__main__':
        """Main function to call python patch_anki.py"""
        os.chdir('.')
        try:
            #sys.argv[1] allows to inclue a file as argument
            wbs = WBS(sys.argv[1])
        except IndexError :
            wbs = WBS()
        except FileNotFoundError:
            print("file not found")
            sys.exit(1)
     
        wbs.parseOrigin()
        wbs.writeFinalFile()
        wbs.closeFiles()
    En vous remerciant par avance
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    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 : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    Bonsoir,

    Peu de temps, mais pour la 1ère fonction, tabCreator, on peut simplement faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def tabCreator(nb_tab, sentence):
        return "\t" * nb_tab + sentence
    P.S, tu y gagneras à placer dans les balises code ton code partagé dans un fichier, plus de membres participeront !
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Dans parseOrigin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #temp_buffer = each_line.replace('\n','')
    temp_buffer = each_line.rstrip()
    Aussi, placer un re.compile dans une boucle (voire dans une méthode) n'est pas la meilleure idée qui soit, car dans ce cas la compilation d'une même pattern est effectuée à chaque passage alors qu'une fois suffit. Autant utiliser une constante de classe:
    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
    class WBS:
        """
        Class defining an object for manipulating a WBS document
        """
     
        TABS_PATTERN = re.compile(r'\t+')
     
        # ...
     
        def parseOrigin(self):
            """
            Function for parsing the original content
            remove \n character
            Allocate tab space to hierarchy number
            """
     
            for each_line in self.original_content:
     
                # ...
     
                temp_buffer = self.TABS_PATTERN.split(temp_buffer)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par yapasmieux Voir le message
    Je chercher à garder les tabulations de titre mais inclure un numéro devant chaque titre : 1.1 ou 1.1.2 etc
    1.1, 1.1.2,... sous forme de liste c'est [1, 1], [1, 1, 2].
    Appelez çà numero.

    Lorsqu'on passe d'une ligne à l'autre le nombre de tabulations augmente de 1 et on ajoute un 1 à la fin de numero.
    S'il diminue, on réduit la taille de numero au nombre de tabulations (+1) et on incrémente le dernier élément.

    note: le (+1) sort de la première ligne qui a un numéro sans tabulation.

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

  5. #5
    Candidat au Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2017
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut
    Ah oui effectivement très malin et plus élégant
    Je vais transformer le code pour inclure cette solution

    Citation Envoyé par fred1599 Voir le message
    Oui effectivement c'est vraiment plus simple.
    Quid des fonctions lambda?

    Je me pose également une autre question. Est-ce que la POO était souhaitée dans mon cas d'emploi. J'ai l'impression d'utiliser un camion pour transporterune banane.

    Citation Envoyé par CosmoKnacki Voir le message
    Ah oui c'est pas mal cette idée façon C d'utiliser une constante

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    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 : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    Citation Envoyé par yapasmieux Voir le message
    Quid des fonctions lambda?
    Les fonctions lambda ? Je ne vois pas le rapport avec ma réponse précédente... mais je ne conseille pas, comme la PEP8 les fonctions lambda, sauf si c'est une manière courte et explicite de l'utiliser.

    Citation Envoyé par PEP8
    Always use a def statement instead of an assignment statement that binds a lambda expression directly to an identifier
    Citation Envoyé par yapasmieux
    Est-ce que la POO était souhaitée dans mon cas d'emploi.
    La POO n'est jamais obligatoire, des langages comme le C par exemple n'utilise pas la POO, et font le café tout aussi bien avec leur lot de difficultés selon les problématiques.
    Croire qu'utiliser une classe c'est faire de la POO, c'est une erreur. La classe est une syntaxe, la POO est un paradigme, si vous souhaitez apprendre la POO, vous pouvez tout aussi bien mettre de côté Python et vous comprendrez que la POO c'est tout autre chose qu'une simple classe.

    Si je devais répondre à cette question pour la même problématique, je répondrai que non, en ce qui me concerne.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par yapasmieux Voir le message
    Je me pose également une autre question. Est-ce que la POO était souhaitée dans mon cas d'emploi. J'ai l'impression d'utiliser un camion pour transporterune banane.
    La POO est d'abord une façon d'organiser votre code.

    Après pensez POO, c'est penser objets et états.

    Les objets sont le fichier d'entrée, le fichier de sortie, et une itération sur chaque ligne pour la transformer en fonction d'une information (nombre de tabulations) de la ligne précédente (si on va sur numero).

    C'est déjà pas facile à découper en plusieurs fonctions sauf à isoler des détails compliqués (lesquels) qu'on aurait envie de tester indépendamment.

    Donc oui la POO ne s'impose pas et çà peut paraître lourd à mettre en œuvre ici.

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

Discussions similaires

  1. java parser du text
    Par snetechen dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 21/05/2007, 13h52
  2. [XSLT] parser du texte dans un noeud
    Par Raumfahrerralf dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 16/03/2007, 13h00
  3. [Tableaux] Amélioration de code (if)
    Par Sir Tengu dans le forum Langage
    Réponses: 3
    Dernier message: 24/12/2006, 00h26
  4. parser fichier texte pour avoir un doc html !!
    Par avogadro dans le forum Débuter
    Réponses: 4
    Dernier message: 30/03/2006, 16h12
  5. [Sécurité] Comment amélioré mon code ?
    Par Nadd dans le forum Langage
    Réponses: 14
    Dernier message: 03/03/2006, 20h13

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