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 :

Repérer la dernière ligne d'un fichier


Sujet :

Python

  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 Repérer la dernière ligne d'un fichier
    Bonjour,
    je dois parcourir un fichier ligne par ligne. J'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for oneLine in fileToAnalyse:
        ...
    Je voudrais savoir si oneLine est la dernière ligne ou non du fichier. Est-ce possible ? Par contre, je ne cherche pas à enregistrer la toute dernière ligne.

    Toute réponse est la bienvenue.

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    en sortant de ta boucle, oneLine sera la dernière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for oneline in fileToAnalyse:
        doSomething(oneline)
    if oneline:
        doSomethingWithEndLine(oneline)

  3. #3
    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
    Citation Envoyé par rambc Voir le message
    Par contre, je ne cherche pas à enregistrer la toute dernière ligne.
    Je vais modifier ma question.

    Comment retirer les lignes vides à la toute fin d'un fichier ?

  4. #4
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Pour savoir si l'on est sur la dernière ligne, personnellement je te proposerais cette solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    f = open(r'e:\temp1\test1.py')
     
    oldl = ""
    for l in f:
        if oldl:
            print "pas derniere -> " + oldl[:-1]
        oldl = l
     
    if oldl:
        print "    derniere -> " + oldl
     
    f.close()
    Ce qui permets par exemple d'avoir un traitement différent si l'on est ou pas sur la dernière ligne, ce que ne permets pas, d'après moi, la solution de pacificator.

    [Edit]Ajout d'informations par rambc entre temps, du coup ça répond pas vraiment à la question !!

  5. #5
    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
    Pas mal cette méthode mais il est vrai que j'ai changé de problème entre temps. Désolé. I beg your pardon...

  6. #6
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Pour répondre à la deuxième question, c'est en gros la première réponse un peu modifié.

    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
    def lis_fichier(filename):
        f = open(filename)
     
        buffer = []
     
        for l in f:
            buffer.append(l)
            if l.strip():
                for l in buffer:
                    yield yield l.rstrip('\r\n')
                buffer = []
     
        f.close()
     
    for l in lis_fichier(r'e:\temp1\test1.py'):
        print "* " + l
    P.S. : J'ai encore une petite erreur, mais suis en train de regarder !!
    P.S.2: Voilà corrigé.

  7. #7
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Parcourir tout le fichier peut vite devenir long.
    Pourquoi ne pas plutôt aller à la fin, puis revenir petit à petit en arrière pour trouver la première ligne non vide. Quand on connait sa position, on peut alors tronquer le fichier à la bonne dimension.

  8. #8
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Il n'a jamais dis qu'il ne voulais que la dernière ligne non vide, mais qu'il voulais supprimer du fichier les dernières lignes non vide.

  9. #9
    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
    Il me semble que vous vous soyez mal compris.

    Antoine_935, peux-tu donner un petit exemple ?

  10. #10
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Effectivement je n'ai pas du être assez clair.
    Prenons un exemple de fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Une ligne
    Deuxième ligne
    Troisième ligne
    Notez bien les lignes vides à la fin.

    Le principe serait d'ouvrir le fichier, et d'aller directement à la fin.
    Ensuite, en rebroussant petit à petit chemin:
    - oh, une ligne vide
    - ah, une autre
    - ah, jusqu'ici c'est encore vide
    - oh ? ok, le dernier caractère est à la position 235
    Voilà, coupons le fichier après le 235ième caractère.

    Evidemment rien n'oblige à lire caractère par caractère, ce serait même plus lent.
    Le mieux est de lire, disons, les 512 derniers caractères, et trouver dedans où se trouve la dernière ligne. Si elle n'est pas dedans (ce serait étonnant), remonter un peu plus loin, etc.

  11. #11
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Et le début du fichier tu le lis quand ? après avoir la trouvé la dernière ligne non vide ? Si oui ca reviens au même !!

    Il n'a jamais dis qu'il ne voulais pas lire le début, enfin je ne crois pas :p

  12. #12
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Je le cite:
    Comment retirer les lignes vides à la toute fin d'un fichier ?

  13. #13
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Citation Envoyé par rambc Voir le message
    Bonjour,
    je dois parcourir un fichier ligne par ligne. J'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for oneLine in fileToAnalyse:
        ...
    Je voudrais savoir si oneLine est la dernière ligne ou non du fichier. Est-ce possible ? Par contre, je ne cherche pas à enregistrer la toute dernière ligne.

    Toute réponse est la bienvenue.
    1er message

  14. #14
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Oui, et troisième message:
    Je vais modifier ma question.

    Comment retirer les lignes vides à la toute fin d'un fichier ?
    Bref... j'ai pas l'intention de batailler sur des choses aussi stupides.
    J'ai passé une solution à la question qu'il pose. Soit j'ai bon, soit pas.
    Dans ce dernier cas, soit je comprends quedal à ce que les gens disent, soit il ferait sérieusement mieux d'apprendre à formuler ses question.
    Au vu du faut que je parle français couramment et que je n'ai aucun souci pour comprendre la plupart des gens, je pencherais pour la deuxième option.

  15. #15
    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
    Je dois parcourir ligne par ligne mon fichier texte pour l'analyser. Je veux le nettoyer en ne gardant pas les lignes vides au début et celles tout à la fin, et ce sont ces dernières qui posent problème.

    Malheureusement, aller voir les lignes à partir de la fin ne semble pas faisable sans traiter le fichier en un seul bloc. Ce traitement en un seul bloc ne serait pas cohérent avec celui ligne par ligne, lequel est fait pour minimiser les coûts "mémoire".

    Est-ce plus clair ?

    Une méthode serait (mais je ne demande à personne de taper le code) de stocker les lignes vides dans une chaîne et dès qu'une ligne non vide est repérée on ajouterait la chaîne stockant les précédentes lignes vides juste avant celle non vide qui vient d'être repérée. Du coup les dernières lignes non vides ne seront jamais ajoutées.
    Ce fonctionnement sous entend que les lignes non vides à la suite ne seront pas trop nombreuses. Comme mon fichier sera le contenu d'un livre, cette situation n'apparaîtra pas en pratique.

    Qu'en pensez-vous ?

  16. #16
    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
    Citation Envoyé par DelphiManiac Voir le message
    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
    def lis_fichier(filename):
        f = open(filename)
     
        buffer = []
     
        for l in f:
            buffer.append(l)
            if l.strip():
                for l in buffer:
                    yield l.rstrip('\r\n')
                buffer = []
     
        f.close()
     
    for l in lis_fichier(r'e:\temp1\test1.py'):
        print "* " + l
    P.S.2: Voilà corrigé.
    J'étais passé à côté de cette correction qui marche. Cela semble être l'implémentation de l'idée que je proposais en toute honnêteté juste avant.

    Merci pour ce code !

    J'ai une dernière question. Quel est le rôle du yield ? Je suis un peu fâché avec ces petites bêtes.

  17. #17
    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
    Pas la peine, je viens de piger, c'est pour renvoyer les différentes valeurs, chose qui ne serait pas possible avec un return.

  18. #18
    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
    Pour clore ce post (enfin je l'espère), voici une toute petite amélioration du code ci-dessus qui ignore les lignes vides au tout début :
    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
    #!/usr/bin/env python
    #coding=utf-8
     
    # Source : http://www.developpez.net/forums/d821212-2/autres-langages/python-zope/general-python/reperer-derniere-ligne-fichier/#post4710983
     
    def readContent(filePath):
        """
        This iterator allows to read a text file line by line without keeping
        the first empy lines, and the last ones.
        """
        with open(filePath, 'r') as fileToAnalyse:
            numberOfEmptyLinesBefore = 0
            contentFound = False
     
            for oneLine in fileToAnalyse:
                if oneLine.strip():
                    if contentFound:
                        for i in range(numberOfEmptyLinesBefore):
                            yield ''
                        yield oneLine.rstrip('\r\n')
                    else:
                        contentFound = True
                        yield oneLine.rstrip('\r\n')
                    numberOfEmptyLinesBefore = 0
                else:
                    numberOfEmptyLinesBefore += 1
     
    for l in readContent(r'test/TestNo1.txt'):
        print "* " + l

  19. #19
    Membre Expert
    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
    Par défaut
    Eh non, ce n’est pas clos.....
    J’ai moi aussi cogité sur "le" fluctuant sujet en étant moi aussi gêné par l’imprécision de l’objectif, sa variabilité, ce que signifie "dernière ligne" ou d’autres notions, etc.
    La question posée était initialement «comment connaître, ou repérer, la dernière ligne ? ».
    Repérer, qu'est à dire exactement ? J’ai malgré cette imprécision pensé à plusieurs solutions



    L’une est celle de Pacificator évidemment: après une itération for ln in f: , la valeur de la dernière ligne persiste dans ln, mais c’est après parcours du fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    f = open('fichier.txt')
    for ln in f:
    x = ln[0:8]
    f.close()
    print 'ln :',repr(ln)



    Pour examiner la dernière ligne sans avoir à parcourir le fichier préalablement:
    - pour obtenir la dernière ligne avec son éventuel séparateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    f = open('fichier.txt')
    fh = f.readlines()
    f.close()
    print 'repr(fh[-1]) :',repr(fh[-1])
    - pour obtenir la dernière ligne sans son éventuel séparateur
    (splitlines() sans argument enlève les newlines)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    f = open('NEWS.txt')
    fh = f.read().splitlines()
    f.close()
    print 'repr(fh[-1]) :',repr(fh[-1])




    Mais dans ces deux méthodes, même si le fichier n’est pas parcouru, la totalité du fichier est chargée en mémoire avant son traitement.
    Ces deux méthodes sont lourdingues si le fichier est volumineux.
    On peut alors faire un peu de gymnastique sur indices pour ne pas solliciter la mémoire vive:

    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
    from os.path import getsize
     
    fich = raw_input('Entrer le nom du fichier :')
    nob = getsize(fich) # nob = number of bytes
    f = open(fich,'rb')
    x = -1
    recul = 1
    while x==-1 and nob-recul:
        recul += min(100,nob-recul)
        f.seek(-recul,2)
        ch = f.read()
        chcut = ch.rstrip('\n\r')
        x = max(chcut.rfind('\n'),chcut.rfind('\r'))
    f.close()
     
    if not chcut:
        print '\nLe fichier ne contient que des caracteres \\n et \\r'
    else:
        dernonvide = chcut[x+1:]
        finfich = '\n'
        if ch[len(chcut):].startswith('\n'):
            dernonvide += '\n'
        elif ch[len(chcut):].startswith('\r\n'):
            dernonvide += '\r\n'
        elif ch[len(chcut):].startswith('\r'):
            dernonvide += '\r'
        if ch[x+1+len(dernonvide):]:
            finfich += repr(ch[x+1+len(dernonvide):]) + '\n'
        print '\nDerniere ligne non vide du fichier, sous forme repr() :\n\n'+repr(dernonvide)\
              +'\n\nFin du fichier apres la derniere ligne non vide :\n'+ finfich\
              +'\n\nLe debut de la derniere ligne non vide '\
              +'dans le fichier ouvert en mode binaire\nest a la position : '+str(nob-recul+x+1)\
              +'\nLa taille de la derniere ligne non vide '\
              +'(sans separateur de fin de ligne) est : ' +str(len(chcut)-x-1)

  20. #20
    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
    Citation Envoyé par eyquem Voir le message
    Eh non, ce n’est pas clos...
    La question posée était initialement «comment connaître, ou repérer, la dernière ligne ? ».
    Pour mon appli. le sujet est bien clos car je dois au moins une fois parcourir ligne par ligne le fichier. Du coup, je n'ai pas à me soucier de faire autre chose.

    Merci quand même pour le dernier code.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. SPOOL : Effacer dernière ligne vide du fichier.
    Par Ujitsu dans le forum Sql*Plus
    Réponses: 6
    Dernier message: 30/07/2007, 19h15
  2. Effacer la dernière ligne d'un fichier texte
    Par marsupilami34 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/05/2007, 12h52
  3. Supprimer 1ère et dernière ligne d'un fichier
    Par yabbiyou dans le forum MATLAB
    Réponses: 3
    Dernier message: 02/03/2007, 10h05
  4. Comment lire la dernière ligne d'un fichier text.
    Par Ardely dans le forum Delphi
    Réponses: 29
    Dernier message: 21/01/2007, 00h29
  5. Réponses: 2
    Dernier message: 19/09/2006, 16h04

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