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:
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