en lisant un fichier dans l'ordre inverse dans python
Si vous travaillez avec un grand fichier et que vous devez lire son contenu de la dernière ligne à la première, les fonctions intégrées de Python peuvent ne pas être adaptées. Voici une solution efficace pour lutter contre cette tâche:
Générateur de lecture de ligne inversée
Le code suivant définit une fonction de générateur, reverse_readline, qui crée les lignes d'un fichier dans l'ordre inverse. Il utilise une approche basée sur le tampon pour optimiser les performances et gérer efficacement les fichiers gros:
import os def reverse_readline(filename, buf_size=8192): """A generator that returns the lines of a file in reverse order""" with open(filename, 'rb') as fh: segment = None offset = 0 fh.seek(0, os.SEEK_END) file_size = remaining_size = fh.tell() while remaining_size > 0: offset = min(file_size, offset buf_size) fh.seek(file_size - offset) buffer = fh.read(min(remaining_size, buf_size)) # remove file's last "\n" if it exists, only for the first buffer if remaining_size == file_size and buffer[-1] == ord('\n'): buffer = buffer[:-1] remaining_size -= buf_size lines = buffer.split('\n'.encode()) # append last chunk's segment to this chunk's last line if segment is not None: lines[-1] = segment segment = lines[0] lines = lines[1:] # yield lines in this chunk except the segment for line in reversed(lines): # only decode on a parsed line, to avoid utf-8 decode error yield line.decode() # Don't yield None if the file was empty if segment is not None: yield segment.decode()
usage:
Pour utiliser ce générateur, vous pouvez simplement itérer dessus dans un pour Loop:
for line in reverse_readline('myfile.txt'): print(line)
Cela imprimera les lignes du fichier dans l'ordre inverse.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3