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 :

Rechercher une chaine 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 Rechercher une chaine dans un fichier
    Bonjour,

    J'ai écrit un petit programme qui me permet de parser un fichier et de récupéré une chaine de caractère dans le fichier. Mais seulement voila je sais pas quel condition rajouté au cas ou elle n'apparaitrai pas dans le fichier, serait il possible d'avoir un exemple de cas comme celui-ci?

  2. #2
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Question trop vague, cela dépend de comment tu parses ton texte (regex*? find()*?)…

    Donne ton code

  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
    voici le contenue de mon fichier:

    VERSION 3.1
    NAMECASE ON

    MACRO VBA_SENS_1V0
    CLASSNAME PID
    SIZE (40.0,90.8)
    END VB0_SENS

    MACRO VBB_SENS_1V2
    CLASSNAME PID
    SIZE (45.0,184.6)
    END VB1_SENS

    MACRO VBB_SENS_1V0
    CLASSNAME PID
    SIZE (10.0,106.3)
    END VB2_SENS

    END OPTIONS


    et j'ai à ma disposition une liste a = ("VBA_SENS_1V0","VBB_SENS_1V2","VBB_SENS_1V0","VBC_SENS") qui va me servir de base de référence pour chercher mes chaines.

    mon code pour récupérer la ligne correspondant au SIZE de chaque cellule:

    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
    import re
    def cellule(fichier,cell): #cell correspond a chaque element de la liste a
    	 #------------Regular Expressions------------#
    	RegBegin = re.compile('MACRO\s([A-Z_1-9]+)')
    	RegEnd = re.compile('END\s([A-Z_1-9]+)')
    	Regex = 'MACRO'
       #-------------------------------------------#
    	with open(fichier, mode = "r") as fileToAnalyse:
    		oneLine = fileToAnalyse.readline()
    		while oneLine!="END OPTIONS":
    			oneLine = fileToAnalyse.readline()
    			if RegBegin.match(oneLine) is not None:
    				id = oneLine\
    						.replace(Regex, '')\
    						.replace(' ', '')\
     
    				id = id.strip()
    				if id == cell:
    					oneLine = fileToAnalyse.readline()
    					while(RegEnd.match(oneLine)is None):
    						oneLine = fileToAnalyse.readline()
    						if "SIZE" in oneLine:
    							oneLine = oneLine.strip()
    							return oneLine
    ce programme fonctionne bien et me renvoie bien la ligne souhaitée mais va bloquer pour la dernière cellule qu'il doit sans doute chercher indéfiniment....Qu'en pensez vous?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    salut,

    peut être en remplaçant juste le test suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while oneLine!="END OPTIONS"
    par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while not oneLine.startswith("END OPTIONS")

  5. #5
    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
    ça ne fonctionne pas non plus, je sais pas comment lui faire dire au programme que si on est en fin de fichier et que la cellule recherché n'est pas présente passer à la recherche de la cellule suivante.

  6. #6
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Une fois un fichier ouvert, on peut appeler sa méthode next() qui nous renvoi à chaque appel une ligne, et lorsqu'il n'y a plus rien à lire, cad lorsqu’on a atteint la fin du fichier, l'exception StopIteration est levée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def end(filePath):
        f=open(filePath)
        last=''
        while 1:
            try:
                last=f.next()
            except StopIteration:
                print 'Fin du fichier !'
                print 'dernière ligne :\n%s'%last
                break

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    Bonjour,

    sinon je peux te proposer ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import re
    pattern = re.compile(r'^MACRO\s+(.*)\nCLASSNAME\s+PID\nSIZE\s+(.*)\nEND\s+(.*)\n', re.MULTILINE)
    results = pattern.findall(open(fichier, 'r').read())
    avec results qui sera:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [('VBA_SENS_1V0', '(40.0,90.8)', 'VB0_SENS'), ('VBB_SENS_1V2', '(45.0,184.6)', 'VB1_SENS'), ('VBB_SENS_1V0', '(10.0,106.3)', 'VB2_SENS')]

  8. #8
    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
    Oui merci N.Tox j'ai utilisé le next() et sa fonctionne très bien merci En effet quand la cellule n'est pas présente dans le texte et que le parseur rrive en fin de fichier , il retourne None pour la cellule absente....

  9. #9
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Content que cela ai pu t'aider, toutefois je suis carrément couillon sur ce coup : on a pas forcément besoin d'une structure try except, on peut tout simplement iterer sur le fichier depuis une boucle for. Une fois la boucle for finie, c'est qu'on est arrivé au bout du fichier. Plus rapide à écrire, plus clair, plus élégant...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def end(filePath):
        last=''
        for line in open(filePath):
            last = line
        print 'Fin du fichier !\nderniere ligne :\n%s'%last
    Mais sinon, j'aime bien la solution des regexs proposée par Kango, efficace en un minimum d'écriture. Je n'apporterais qu'une toute petite modficiation à la regex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import re
    pattern = re.compile(r'^MACRO\s+(.*?)[\r\n]+CLASSNAME\s+PID[\r\n]+SIZE\s+(.*?)[\r\n]+END\s+(.*?)[\r\n]+', re.MULTILINE)
    results = pattern.findall(open(fichier, 'r').read())

Discussions similaires

  1. Recherche d'une chaine dans un fichier distant
    Par nitramm dans le forum ASP
    Réponses: 3
    Dernier message: 20/08/2008, 16h49
  2. Rechercher une chaine dans un fichier
    Par bigey3 dans le forum Langage
    Réponses: 12
    Dernier message: 30/05/2008, 16h35
  3. Rechercher une chaine dans un fichier Excel
    Par matcram dans le forum ASP
    Réponses: 1
    Dernier message: 03/10/2007, 21h59
  4. [code]Recherche d'une chaine dans des fichiers
    Par guillaume_pays_ceven dans le forum Contribuez
    Réponses: 5
    Dernier message: 21/06/2007, 14h32

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