Python – Lectura de las últimas N líneas de un archivo

Requisito previo: Leer un archivo línea por línea en Python
Dado un archivo de texto fname , un número N , la tarea es leer las últimas N líneas del archivo.
Como sabemos, Python proporciona múltiples funciones y módulos integrados para manejar archivos. Discutamos diferentes formas de leer las últimas N líneas de un archivo usando Python. 
Expediente: 
 

Image of content of a file

Método 1: enfoque ingenuo 
En este enfoque, la idea es utilizar un iterador negativo con la función readlines() para leer todas las líneas solicitadas por el usuario desde el final del archivo.
 

Python3

# Python implementation to
# read last N lines of a file
 
# Function to read
# last N lines of the file
def LastNlines(fname, N):
    # opening file using with() method
    # so that file get closed
    # after completing work
    with open(fname) as file:
         
        # loop to read iterate
        # last n lines and print it
        for line in (file.readlines() [-N:]):
            print(line, end ='')
 
 
# Driver Code:
if __name__ == '__main__':
    fname = 'File1.txt'
    N = 3
    try:
        LastNlines(fname, N)
    except:
        print('File not found'

Producción: 
 

Eighth line
Ninth line
Tenth line

 
Método 2: uso del módulo del sistema operativo y la política de almacenamiento en búfer 
En este enfoque, la idea es trabajar en la política de almacenamiento en búfer en Python. Un búfer almacena una parte de los datos recibidos de un flujo de archivos del sistema operativo durante un período de tiempo en que se usa y luego ingresan más datos. 
El tamaño del búfer determina el tamaño de los datos que se pueden almacenar en un momento hasta que se use . Tenemos la opción de pasar un número entero al almacenamiento en búfer para establecer la política de almacenamiento en búfer y, si no especificamos ninguna política, el tamaño del búfer depende del tamaño del bloque del dispositivo. Por lo general, el búfer tiene una longitud de 4096 u 8192 bytes. En este enfoque, el tamaño del búfer es de 8192 bytes.
Además, el atributo st_size de os.stat ()El método en el módulo OS se usa para representar el tamaño del archivo en bytes.
A continuación se muestra la implementación del enfoque anterior.
 

Python3

# Python implementation to
# read last N lines of a file
# Using OS module and buffering policy
         
# importing os module
import os
 
# Function to read
# last N lines of the file
def LastNlines(fname, N):
    # taking buffer size of 8192 bytes
    bufsize = 8192
     
    # calculating size of
    # file in bytes
    fsize = os.stat(fname).st_size
     
    iter = 0
     
    # opening file using with() method
    # so that file get closed
    # after completing work
    with open(fname) as f:
        if bufsize > fsize:
                 
            # adjusting buffer size
            # according to size
            # of file
            bufsize = fsize-1
             
            # list to store
            # last N lines
            fetched_lines = []
             
            # while loop to
            # fetch last N lines
            while True:
                iter += 1
                 
                # moving cursor to
                # the last Nth line
                # of file
                f.seek(fsize-bufsize * iter)
                 
                # storing each line
                # in list upto
                # end of file
                fetched_lines.extend(f.readlines())
                 
                # halting the program
                # when size of list
                # is equal or greater to
                # the number of lines requested or
                # when we reach end of file
                if len(fetched_lines) >= N or f.tell() == 0:
                        print(''.join(fetched_lines[-N:]))
                        break
                         
# Driver Code:
if __name__ == '__main__':
     
    fname = 'File1.txt'
    N = 3
     
    try:
        LastNlines(fname, N)
    except:
        print('File not found')

Producción: 
 

Eighth line
Ninth line
Tenth line

  
Método 3: A través de la búsqueda exponencial
En este método, la idea es utilizar el algoritmo de búsqueda exponencial que generalmente se usa para buscar listas ordenadas, ilimitadas o infinitas. Para obtener información sobre la búsqueda exponencial, haga clic aquí .
Este enfoque utiliza una declaración de afirmación que actúa como una herramienta de depuración para verificar una condición. El programa continuará ejecutándose si la declaración dada es verdadera; de lo contrario, genera una excepción AssertionError . Para obtener más detalles sobre las declaraciones de aserción, haga clic aquí .
Haga clic aquí para familiarizarse con los diferentes tipos de uso del método seek().
A continuación se muestra la implementación del enfoque anterior.
 

Python3

# Python implementation to
# read last N lines of a file
# through Exponential search
         
# Function to read
# last N lines of the file
def LastNlines(fname, N):
     
    # assert statement check
    # a condition
    assert N >= 0
     
    # declaring variable
    # to implement
    # exponential search
    pos = N + 1
     
    # list to store
    # last N lines
    lines = []
     
    # opening file using with() method
    # so that file get closed
    # after completing work
    with open(fname) as f:
         
        # loop which runs
        # until size of list
        # becomes equal to N
        while len(lines) <= N:
             
            # try block
            try:
                # moving cursor from
                # left side to
                # pos line from end
                f.seek(-pos, 2)
         
            # exception block
            # to handle any run
            # time error
            except IOError:
                f.seek(0)
                break
             
            # finally block
            # to add lines
            # to list after
            # each iteration
            finally:
                lines = list(f)
             
            # increasing value
            # of variable
            # exponentially
            pos *= 2
             
    # returning the
    # whole list
    # which stores last
    # N lines
    return lines[-N:]
 
# Driver Code:
if __name__ == '__main__':
    fname = 'File1.txt'
    N = 3
    try:
        lines = LastNlines(fname, N)
        for line in lines:
            print (line, end ='')
    except:
        print('File not found')

Producción: 
 

Eighth line
Ninth line
Tenth line

Publicación traducida automáticamente

Artículo escrito por RISHU_MISHRA y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *