"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment puis-je lire efficacement un grand fichier dans l'ordre inverse à l'aide de Python?

Comment puis-je lire efficacement un grand fichier dans l'ordre inverse à l'aide de Python?

Publié le 2025-03-22
Parcourir:182

How Can I Efficiently Read a Large File in Reverse Order Using Python?

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.

Dernier tutoriel Plus>

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