"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo puedo leer eficientemente un archivo grande en orden inverso usando Python?

¿Cómo puedo leer eficientemente un archivo grande en orden inverso usando Python?

Publicado el 2025-03-22
Navegar:935

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

leyendo un archivo en orden inverso en python

si está trabajando con un archivo grande y necesita leer su contenido desde la última línea hasta las primeras funciones integradas en Python puede no ser adecuada. Aquí hay una solución eficiente para abordar esta tarea:

reinséver al generador de lector

El siguiente código define una función de generador, reverse_readline, que produce las líneas de un archivo en orden inverso. Utiliza un enfoque basado en búfer para optimizar el rendimiento y manejar archivos grandes de manera efectiva:

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()

use:

para usar este generador, simplemente puede iterar sobre él en un bucle:

for line in reverse_readline('myfile.txt'):
    print(line)

Esto imprimirá las líneas del archivo en orden inverso.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3