python - hoverinfo - plotly layout
Python trunca las lĂneas a medida que se leen (7)
En primer lugar, llamar a la operación truncate
probablemente no sea la mejor elección. Si entiendo el problema correctamente, quiere borrar todo hasta la posición actual en el archivo. (Esperaría que truncate
cortara todo desde la posición actual hasta el final del archivo. Así es como funciona el método estándar de truncate
Python, al menos si busqué en Google correctamente).
En segundo lugar, no estoy seguro de que sea aconsejable modificar el archivo mientras se itera al usar el ciclo for
. ¿No sería mejor guardar el número de líneas procesadas y eliminarlas después de que el ciclo principal haya finalizado, excepción o no? El iterador de archivos admite el filtrado in situ , lo que significa que debería ser bastante simple dejar caer las líneas procesadas después.
PD. No conozco a Python, toma esto con un grano de sal.
Tengo una aplicación que lee líneas de un archivo y ejecuta su magia en cada línea a medida que se lee. Una vez que se lee la línea y se procesa correctamente, me gustaría eliminar la línea del archivo. Ya se está guardando una copia de seguridad de la línea eliminada. Me gustaría hacer algo como
file = open(''myfile.txt'', ''rw+'')
for line in file:
processLine(line)
file.truncate(line)
Esto parece ser un problema simple, pero me gustaría hacerlo bien en lugar de muchas llamadas complicadas de búsqueda () y de llamada ().
Quizás todo lo que realmente quiero hacer es eliminar una línea particular de un archivo.
Después de pasar mucho tiempo sobre este problema, decidí que probablemente todo el mundo tenía razón y que esta no era una buena forma de hacer las cosas. Simplemente parecía una solución tan elegante. Lo que estaba buscando era algo parecido a un FIFO que me permitía sacar líneas de un archivo.
Es mejor que guardes un índice en el archivo para que puedas comenzar desde el último lugar donde lo detuviste, sin destruir parte del archivo. Algo como esto funcionaría:
try :
for index, line in enumerate(file) :
processLine(line)
except :
# Failed, start from this line number next time.
print(index)
raise
Truncar el archivo mientras lo lees parece un poco extremo. ¿Qué pasa si su script tiene un error que no causa un error? En ese caso, querrá reiniciar al comienzo de su archivo.
¿Qué tal si su script imprime el número de línea en el que se rompe y lo hace tomar un número de línea como parámetro para que pueda decirle de qué línea comenzar el procesamiento?
No puedes . Simplemente no es posible con las implementaciones de archivos de texto reales en los sistemas de archivos actuales.
Los archivos de texto son secuenciales, porque las líneas en un archivo de texto pueden ser de cualquier longitud. Eliminar una línea en particular significaría volver a escribir todo el archivo a partir de ese momento.
Supongamos que tiene un archivo con las siguientes 3 líneas;
''line1/nline2reallybig/nline3/nlast line''
Para eliminar la segunda línea, debe mover las posiciones de las líneas tercera y cuarta en el disco. La única forma sería almacenar la tercera y cuarta líneas en algún lugar, truncar el archivo en la segunda línea y volver a escribir las líneas que faltan.
Si conoce el tamaño de cada línea en el archivo de texto, puede truncar el archivo en cualquier posición usando .truncate(line_size * line_number)
pero incluso entonces tendría que volver a escribir todo después de la línea.
Elimine todas las líneas después de que haya terminado con ellas:
with open(''myfile.txt'', ''rw+'') as file:
for line in file:
processLine(line)
file.truncate(0)
Eliminar cada línea de forma independiente:
lines = open(''myfile.txt'').readlines()
for i, line in enumerate(lines[:]):
processLine(line)
del lines[i]
open(''myfile.txt'', ''w'').writelines(lines)
Puede dejar solo aquellas líneas que causan excepciones:
import fileinput
for line in fileinput.input([''myfile.txt''], inplace=1):
try: processLine(line)
except:
sys.stdout.write(line) # it prints to ''myfile.txt''
En general, como ya dijeron otras personas, es una mala idea lo que intenta hacer.
Esto es lo que uso para las colas basadas en archivos. Devuelve la primera línea y reescribe el archivo con el resto. Cuando termina, devuelve None:
def pop_a_text_line(filename):
with open(filename,''r'') as f:
S = f.readlines()
if len(S) > 0:
pop = S[0]
with open(filename,''w'') as f:
f.writelines(S[1:])
else:
pop = None
return pop
Una publicación relacionada tiene lo que parece ser una buena estrategia para hacerlo, consulte ¿Cómo puedo ejecutar el primer proceso desde una lista de procesos almacenados en un archivo y eliminar inmediatamente la primera línea como si el archivo fuera una cola y llamé "pop"?
Lo he usado de la siguiente manera:
import os;
tasklist_file = open(tasklist_filename, ''rw'');
first_line = tasklist_file.readline();
temp = os.system("sed -i -e ''1d'' " + tasklist_filename); # remove first line from task file;
No estoy seguro de que funcione en Windows. Lo probé en un Mac y lo hizo el truco.