Ayuda python,eliminar lineas de un archivo una por una

Iniciado por Panic0, 7 Marzo 2021, 21:16 PM

0 Miembros y 2 Visitantes están viendo este tema.

Panic0

Hola a todos,estoy tratando de hacer que cuando se imprima la linea de un archivo después la borre es decir

linea 1
(se borra linea 1)
linea 2
(se borra linea 2)

Y así con todo el archivo

Tengo esto de momento

nom_archivo = "archivos_txt/testingfile.txt"
archivo = open(nom_archivo, "r")
lineas = archivo.readlines()

archivo.close()
for i in lineas:
   print(i)
   input()
   archivo = open(nom_archivo,"w")
   for linea in lineas:
       if linea != lastline:
           archivo.write(i)

Pero no funciona  :P ;-)
Los ataques de pánico suelen comenzar de forma súbita, sin advertencia.

Danielㅤ

Hola, pero eso que querés hacer es irrelevante!!! porque si vas imprimiendo por pantalla las líneas del archivo y después las borras, es decir imprimir una x línea y borrarla, para eso imprimis todas las líneas del archivo y después borras el archivo entero:

Código (Python) [Seleccionar]

archivo = open(nom_archivo, "w")
archivo.write("")
archivo.close()


# Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!

Panic0

Cita de: [D]aniel en  8 Marzo 2021, 00:26 AM
Hola, pero eso que querés hacer es irrelevante!!! porque si vas imprimiendo por pantalla las líneas del archivo y después las borras, es decir imprimir una x línea y borrarla, para eso imprimis todas las líneas del archivo y después borras el archivo entero:

Código (Python) [Seleccionar]

archivo = open(nom_archivo, "w")
archivo.write("")
archivo.close()


# Saludos


Hola,ni tan irrelevante ya que ayer le hice un par de cambios y bueno quedo pero no del todo.
Los ataques de pánico suelen comenzar de forma súbita, sin advertencia.

Danielㅤ

Estimado panico, según lo que entiendo de lo que querés hacer, es por ejemplo si un archivo contiene lo siguiente:

Lunes
Martes
Miércoles
Jueves
Viernes
Sábado
Domingo

Y vos querés imprimir el contenido y después de cada línea que imprimas la borras, entonces para eso mejor imprime todo el contenido y después borras el contenido del archivo entero, es lo más lógico, rápido y simple.


Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!

Serapis

Tienes que sopesar cual tiene menor coste, lo que depende de:
--- El tamaño del fichero.
--- En qué punto del mismo se localice dicha línea.
En resumen el tamaño del ficheor antes y después de dicha línea.
Además, si no es la única línea a borrar, conviene retrasar la operación, almacenar los datos referentes a su localización y tamaño en alguna estructura de datos y cuando se tenga la info de todas las que se deseen 'borrar' proceder co el borrado de todas en una misma y única operación... porque borrar una sola línea de cada vez tiene un elevado coste.

Hay dos formas de hacer lo que quieres:
1 - Si la línea ocupa pongamos 40 bytes, bajas todos los que estén por encima de la línea exactamente 40 bytes, para cubrir el hueco que ocupaba dicha línea... y sobrescribes los 40 bytes finales del fichero a 'cero' (por ejemplo). El tamaño del fichero sigue siendo el mismo, luego operaciones de tipo 'append' escribirían al final de dicho fichero, sin considerar ese espacio de 40 bytes del final...

2 - El otro modo soluciona el problema antedicho, pero el coste es algo mayor, tanto mayor cuanto más grande sea el fichero y más al final este dicha 'linea 'borrada'..
Creas un fichero nuevo, copias todo el contenido hasta el comienzo de la línea a borrar, y luego todo el contenido tras la linea a borrar, en resumen copias todo excluyendo dicha línea.
...luego al terminar cierras y borras el fichero que contiene la línea que querías borrar., y al nuevo lo renombras con  el nombre que tenía el ahora borrado.
Por supuesto si has leído un fichero enteramente en un array de líneas, la operatoria se puede simplificar, cerrando y eliminando el fichero actual y creando uno nuevo del mismo nombre que el eliminado, ahora escribe todo el contenido que mantienes  en tu array, omitiendo justamente las líneas que se quieran 'borrar'.

Los ficheros ocupan un espacio contínuo en el disco, luego el coste asociado con borrados en medio de un fichero tienen un elevado coste.
Si el fichero mantiene algún tipo de estructura, registros, lo que se suele hacer es simplemente marcar un registro como 'vacío', el contenido del mismo no precisa ser tocado, salvo que contenga algo que por seguridad no pueda dejarse así, en cuyo caso se sobrescribe con contenido aleatorio...

Cuando deba añadirse nuevos registro, siempre lo harán en registros borrados con preferencia a añadirlos al final del fichero.

Si se acumulan demasiados registros sin borrar (cuand esté muy fragmentado), según el diseño... puede interesar 'defragmentar', haciendo exactamente lo que se señala en el apartado '2', copiando el contenido total del fichero a otro, excluyendo los registros vacios...