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 :

Parcourir les lignes d'un fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    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
    Par défaut Parcourir les lignes d'un fichier
    Bonjour,
    le code suivant permet de parcourir les lignes "texte" d'un fichier en affichant que celles qui ne sont pas vides :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/env python
    #coding=utf-8
    def minimalContentOfFileLineByLine(pathOfTheFile):
        with open(pathOfTheFile, 'r') as fileToAnalyse:
            for oneLine in fileToAnalyse:
                if oneLine.strip():
                    yield oneLine.strip()
     
    for oneLine in minimalContentOfFileLineByLine('test/xxx.txt'):
        print oneLine
    Je voudrais transformer minimalContentOfFileLineByLine afin d'avoir un comportement similaire au code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/env python
    #coding=utf-8
    i = 1
     
    while i <= 10:
        print i
        i += 1
        if i == 3:
            i += 3
    Ceci permet d'avoir la main à un moment pour obtenir :
    En résumé, je souhaiterais obtenir quelque chose ayant le comportement suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for oneLine in minimalContentOfFileLineByLine('test/xxx.txt'):
        print oneLine
    # Si une certaine condition est vérifiée alors ici
    # je prends la main pour parcourir certaines lignes.
     
    # Si une autre condition est vérifiée, c'est la boucle
    # qui reprend la main.
    Toute info. est la bienvenue.

    PS : s'il faut que je précise mon propos, je le ferais.

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je te suggère une classe itérable. Avec celle-ci, tu peux prévoir de renvoyer ce que tu veux comme valeur suivante.

    Rendre une classe itérable est assez simple à faire. Tu peux t'inspirer de mon tuto ici:

    http://python.jpvweb.com/mesrecettes...lasse_iterable.

    Tyrtamos

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Suite de mon message précédent.

    Voilà ce qu'une telle classe itérable peut être:

    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
    class fichier(object):
     
        def __init__(self, nf):
            self.f = open(nf, 'r')
     
        def __iter__(self):
            return self
     
        def next(self):
            while True:
                ligne = self.f.readline()
                if len(ligne)==0:
                    self.f.close()
                    raise StopIteration
                ligne = ligne.rstrip('\r\n')
                if ligne.strip()!="":
                    break
            return ligne
    Utilisation: le code suivant n'affiche que les lignes non vides:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nf = r"C:\Chemin\test.txt"
     
    for ligne in fichier(nf):
        print ligne
    Tyrtamos

  4. #4
    Membre éprouvé

    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
    Par défaut
    Oups je crois que je me suis mal fait comprendre. En fait, je voudrais prendre la main dans ma boucle de parcours du fichier à un moment donné pour parcourir certaines lignes et ensuite redonner la main à la main à la boucle comme dans l'exemple avec le while.

    Suis-je clair ? J'en suis pas sûr moi même...

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par rambc Voir le message
    Suis-je clair ?
    Pas encore assez pour moi...

    Cependant, tout en restant dans le principe de la classe itérable, tu peux ajouter un attribut modifiable de l'extérieur et testé dans la boucle de lecture, qui provoque un effet sur la valeur renvoyée (pour renvoyer une ligne sur 3, ou passer 5 lignes en fonction de la dernière ligne lue, etc...).

    Je ne peux pas aller + loin si je ne comprends pas mieux: donne au moins un exemple type pseudo-code.

    Tyrtamos

  6. #6
    Membre éprouvé

    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
    Par défaut
    Ta dernière réponse me va. J'ai donc été assez clair... Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lire les lignes d'un fichier avec csh
    Par nicolas581 dans le forum Linux
    Réponses: 4
    Dernier message: 24/03/2010, 16h38
  2. [VBA-E] Parcourir les lignes filtrées après un filtre auto
    Par leptitdave dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/10/2005, 13h14
  3. [VB.NET] [DataGrid] Parcourir les lignes d'un DataGrid
    Par graphicsxp dans le forum Windows Forms
    Réponses: 7
    Dernier message: 06/04/2005, 11h55
  4. Afficher les lignes d'un fichier
    Par pepere73 dans le forum C++
    Réponses: 16
    Dernier message: 21/02/2005, 22h25
  5. Réponses: 3
    Dernier message: 26/04/2004, 12h51

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