2008-11-29 8 views
3

Imaginez que j'ai un fichier avecLire le dernier lineof le fichier

XPTO, 50,30,60 XPTO, a, v, c XPTO, 1,9,0 XPTO, 30,30,60

que le fichier txt peut être ajouté plusieurs fois et quand j'ouvre le fichier je veux seulement obtenir les valeurs de la dernière ligne du fichier txt ... Comment puis-je faire cela sur python? lire la dernière ligne?

Merci

+1

en double de http://stackoverflow.com/questions/260273/most-efficient-way-to-search-the-last-x-lines-of-a-file-in-python –

+0

Voir la répondez à cette question: http://stackoverflow.com/questions/260273/most-efficient-way-to-search-the-last-x-lines-of-a-file-in-python. –

Répondre

-1

ne suis pas sûr une implémentation spécifique de python, mais d'une manière agnostique plus la langue, ce que vous voulez faire est de sauter (chercher) à la fin du fichier, puis lire chaque caractère en arrière Commandez jusqu'à ce que vous atteigniez le caractère de saut de ligne que votre fichier utilise, généralement un caractère de valeur 13. Il suffit de lire à partir de ce point jusqu'à la fin du fichier, et vous aurez la dernière ligne dans le fichier.

+0

La lecture d'un caractère à la fois en arrière de la fin du fichier est * vraiment * coûteuse.Considérez ce que vous auriez à faire pour y arriver. – Dustin

+0

Je ne sais pas à quel point ce serait lent dans la vraie vie. Le système d'exploitation l'optimise probablement de toute façon, quand vous récupérez un seul octet, il échange probablement tout un secteur du disque dur en mémoire. Peut-il même lire moins qu'un secteur? À moins que votre dernière ligne ne soit longue, vous ne remarquerez probablement pas de ralentissement. – Kibbee

10

Je pense que ma réponse du last time this came up a été malheureusement négligée. :-)

Si vous êtes sur une boîte unix, os.popen("tail -10 " + filepath).readlines() sera probablement le moyen le plus rapide. Sinon, il dépend de la robustesse de . Les méthodes proposées jusqu'ici vont toutes tomber d'une manière ou d'une autre. Pour la robustesse et la vitesse dans le plus cas commun, vous voulez probablement quelque chose comme une recherche logarithmique: utilisation file.seek pour aller à la fin du fichier moins 1000 caractères, lu dans, vérifier le nombre de lignes qu'il contient, puis à EOF moins 3000 caractères, lu en 2000 caractères, compter les lignes, puis EOF moins 7000, lu en 4000 caractères, compter les lignes, etc. jusqu'à ce que vous avez autant de lignes que vous besoin. Mais si vous savez avec certitude que il va toujours être exécuté sur les fichiers avec des longueurs de ligne raisonnables, vous pouvez pas besoin de cela.

Vous trouverez peut-être aussi une source d'inspiration dans la source code pour la commande unix tail.

1

f.seek(pos ,2) cherche à 'pos' par rapport à la fin du fichier. essayez une valeur raisonnable pour pos puis readlines() et obtenez la dernière ligne.

Vous devez tenir compte du moment où 'pos' n'est pas une bonne supposition, c'est-à-dire supposons que vous choisissez 300, mais la dernière ligne est de 600 caractères! dans ce cas, essayez à nouveau avec une estimation raisonnable, jusqu'à ce que vous capturiez toute la ligne. (ce cas le plus défavorable devrait être très rare)

0

Um pourquoi ne pas simplement chercher à la fin du fichier et lire jusqu'à ce que vous frappiez un retour à la ligne?

i=0 
while(1): 
    f.seek(i, 2) 
    c = f.read(1) 
    if(c=='\n'): 
     break 
Questions connexes