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 :

Lire que les dernières ligne d'un fichier


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 88
    Par défaut Lire que les dernières ligne d'un fichier
    Bonjour

    je souhaite lire que les dernières ligne d'un fichier
    pouvez-vous me dire si cela est possible
    le code me lit tout le fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    with open("/var/log/apache2/other_vhosts_access.log", "r") as f:
                            for ligne in f.readlines():
    Merci d'avance de votre aide

    Cordialement

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 670
    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 670
    Par défaut
    Salut,

    Citation Envoyé par www.rubis Voir le message
    pouvez-vous me dire si cela est possible
    Oui c'est possible et il y a plein de façon de le faire.
    La plus logique (mais pas forcément la plus simples) est de lire les derniers blocks du fichier en nombre suffisant pour qu'il contienne la dernière ou les N dernière lignes en utilisant .seek.
    Vous avez un bon chapitre la dessus dans le Python tutorial.

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

  3. #3
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par www.rubis Voir le message
    le code me lit tout le fichier
    c'est un problème ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open("/var/log/apache2/other_vhosts_access.log", "r") as f:
       for ligne in f.readlines()[-5:]:  # juste les 5 dernières lignes, mais Python a en effet lu tout le fichier

  4. #4
    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,

    Juste une idée de solution.

    J'avais déjà fait un petit code pour compter le nombre de lignes d'un fichier texte sans lire les lignes: il suffit de lire par bloc binaire et de compter les fins de ligne '\n'.

    J'avais fait des tests sur des fichiers d'environ 1 million de lignes, et ça donnait un temps 10 fois plus court que de lire les lignes.

    Voilà ce que ça donne en Python 3:

    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
    def nblignes(nf, fdl=b'\n', tbuf=16384):
        """Compte le nombre de lignes du fichier texte nf
        """
        c = 0
        with open(nf, 'rb') as f:
            while True:
                buf = f.read(tbuf)
                if len(buf)==0:
                    break # lecture terminée
                c += buf.count(fdl)
            f.seek(-1, 2)
            car = f.read(1)
            if car != fdl:
                c += 1 # au cas où la dernière ligne ne se termine pas par un fdl
        return c
    Pour ne lire que, par exemple, les n dernières lignes, il faudrait modifier ce code pour qu'il conserve les emplacements des fins de lignes et pas seulement leur nombre. Il suffira ensuite d'accéder directement aux lignes souhaitées avec un f.seek. Il faudra, bien sûr, tenir compte de l'encodage des "str" puisque la lecture binaire renvoie des "bytes".

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 794
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 794
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Concernant la condition d'arrêt, est-il "mieux" de tester len(buf)==0 ? Parce que moi, généralement, je teste buf==""... ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 670
    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 670
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Concernant la condition d'arrêt, est-il "mieux" de tester len(buf)==0 ? Parce que moi, généralement, je teste buf==""... ???
    Il suffit de tester "buf" puisqu'un objet de longueur nulle est évalué à False. Ce qui évite de se prendre les pieds dans le tapis entre buf == "" et buf == b"".
    Voir Truth value testing.

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

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 88
    Par défaut
    Bonjour a tous

    merci beaucoup pour vos réponse

    je vais finalement prendre cette solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    with open("/var/log/apache2/other_vhosts_access.log", "r") as f:
       for ligne in f.readlines()[-5:]:  # juste les 5 dernières lignes, mais Python a en effet lu tout le fichier
    Cordialement

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

Discussions similaires

  1. Supprimer les dernières lignes d'un fichier
    Par eleana dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 03/11/2017, 10h55
  2. Lire une les 3 dernières ligne d'1 fichier texte
    Par BECHE dans le forum Langage
    Réponses: 2
    Dernier message: 08/02/2009, 14h38
  3. lire les X dernières lignes d'un fichier.
    Par Empty_body dans le forum Langage
    Réponses: 6
    Dernier message: 13/06/2007, 11h58
  4. Réponses: 5
    Dernier message: 19/01/2007, 22h53
  5. [CSV] Ne lire que la premiere ligne d'un fichier CSV
    Par passie dans le forum Langage
    Réponses: 7
    Dernier message: 05/07/2006, 12h02

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