¿Copiar las últimas tres líneas de un archivo de texto en python?

Soy nuevo en Python y la forma en que maneja las variables y las matrices de variables en las listas es bastante ajena para mí. Normalmente leería un archivo de texto en un vector y luego copiaría los últimos tres en una nueva matriz / vector determinando el tamaño del vector y luego formando un bucle for con una función de copia para el último tamaño tres en una nueva matriz.

No entiendo cómo funcionan los bucles en Python, así que no puedo hacer eso.

hasta ahora tengo:

#read text file into line list numberOfLinesInChat = 3 text_file = open("Output.txt", "r") lines = text_file.readlines() text_file.close() writeLines = [] if len(lines) > numberOfLinesInChat: i = 0 while ((numberOfLinesInChat-i) >= 0): writeLine[i] = lines[(len(lines)-(numberOfLinesInChat-i))] i+= 1 #write what people say to text file text_file = open("Output.txt", "w") text_file.write(writeLines) text_file.close() 

Para obtener las últimas tres líneas de un archivo de manera eficiente, use deque :

 from collections import deque with open('somefile') as fin: last3 = deque(fin, 3) 

Esto guarda la lectura de todo el archivo en la memoria para cortar lo que realmente no quería.

Para reflejar su comentario, su código completo sería:

 from collections import deque with open('somefile') as fin, open('outputfile', 'w') as fout: fout.writelines(deque(fin, 3)) 

Mientras esté bien para mantener todas las líneas de archivo en la memoria, puede dividir la lista de líneas para obtener los últimos x elementos. Consulte http://docs.python.org/2/tutorial/introduction.html y busque ‘notación de segmento’.

 def get_chat_lines(file_path, num_chat_lines): with open(file_path) as src: lines = src.readlines() return lines[-num_chat_lines:] >>> lines = get_chat_lines('Output.txt', 3) >>> print(lines) ... ['line n-3\n', 'line n-2\n', 'line n-1'] 

Primero para responder a su pregunta, mi duda es que tuvo un error de índice, debe reemplazar la línea writeLine [i] con writeLine.append (). Después de eso, también debes hacer un bucle para escribir la salida:

 text_file = open("Output.txt", "w") for row in writeLine : text_file.write(row) text_file.close() 

¿Puedo sugerir una forma más pythonica de escribir esto? Sería como sigue:

 with open("Input.txt") as f_in, open("Output.txt", "w") as f_out : for row in f_in.readlines()[-3:] : f_out.write(row) 

Una posible solución:

 lines = [ l for l in open("Output.txt")] file = open('Output.txt', 'w') file.write(lines[-3:0]) file.close() 

Esto podría ser un poco más claro si no conoce la syntax de Python.

lst_lines = lines.split ()

Esto creará una lista que contiene todas las líneas en el archivo de texto.

Entonces para la última línea puedes hacer:

last = lst_lines [-1] secondLAst = lst_lines [-2] etc … se puede acceder a la lista y los índices de cadena desde el final con ‘-‘.

o puede recorrerlos e imprimirlos específicos usando:

start = start line, stop = where to end, step = what to increment by.

para i en el rango (inicio, stop-1, paso): string = lst_lines [i]

entonces simplemente escríbelos en un archivo.