¿Cómo eliminar una línea específica en un archivo?

7 minutos de lectura

¿Como eliminar una linea especifica en un archivo
amargo

Digamos que tengo un archivo de texto lleno de apodos. ¿Cómo puedo eliminar un apodo específico de este archivo usando Python?

  • Tratar fileinput como lo describe @jf-sebastian aquí. Parece permitirle trabajar línea por línea, a través de un archivo temporal, todo con un simple for sintaxis.

    –Kevin

    21 de abril de 2016 a las 18:38

1646975528 839 ¿Como eliminar una linea especifica en un archivo
houbysoft

Primero, abra el archivo y obtenga todas sus líneas del archivo. Luego vuelva a abrir el archivo en modo de escritura y vuelva a escribir sus líneas, excepto la línea que desea eliminar:

with open("yourfile.txt", "r") as f:
    lines = f.readlines()
with open("yourfile.txt", "w") as f:
    for line in lines:
        if line.strip("\n") != "nickname_to_delete":
            f.write(line)

Necesitas strip("\n") el carácter de nueva línea en la comparación porque si su archivo no termina con un carácter de nueva línea, el último line tampoco.

  • ¿Por qué tenemos que abrirlo y cerrarlo dos veces?

    – Oker

    25 de junio de 2014 a las 13:48

  • @Ooker: debe abrir el archivo dos veces (y cerrarlo en el medio) porque en el primer modo es “solo lectura” porque solo está leyendo las líneas actuales en el archivo. Luego lo cierra y lo vuelve a abrir en “modo de escritura”, donde se puede escribir en el archivo y reemplaza el contenido del archivo sin la línea que desea eliminar.

    – Devin

    1 de julio de 2014 a las 16:19

  • ¿Por qué Python no nos permite hacer esto en una sola línea?

    – Oker

    1 de julio de 2014 a las 16:37

  • @Ooker, cuando lea una línea, intente imaginar un cursor moviéndose a lo largo de la línea mientras se lee. Una vez que se ha leído esa línea, el cursor ya la ha pasado. Cuando intenta escribir en el archivo, escribe donde se encuentra actualmente el cursor. Al volver a abrir el archivo, reinicia el cursor.

    – Waddas

    06/08/2014 a las 20:48

  • Esta tarea se puede realizar abriendo el archivo solo una vez… pero debe abrirse ‘r+’, Y, debe llamar a flie.seek(0) (para mover el cursor al principio) y file.truncate () (para invalidar los contenidos existentes), antes de proceder a reescribirlo.

    – Josué Clayton

    25 de enero de 2019 a las 23:10

1646975529 825 ¿Como eliminar una linea especifica en un archivo
Lother

Solución a este problema con una sola apertura:

with open("target.txt", "r+") as f:
    d = f.readlines()
    f.seek(0)
    for i in d:
        if i != "line you want to remove...":
            f.write(i)
    f.truncate()

Esta solución abre el archivo en modo r/w (“r+”) y utiliza la búsqueda para restablecer el puntero f y luego truncar para eliminar todo después de la última escritura.

  • Esto funcionó muy bien para mí, ya que también tuve que usar lockfile (fcntl). No pude encontrar ninguna forma de usar fileinput junto con fcntl.

    – Jinete facil

    27 de enero de 2015 a las 14:07

  • Sería bueno ver algunos efectos secundarios de esta solución.

    – usuario1767754

    23 de noviembre de 2017 a las 8:43

  • Yo no haría esto. Si obtiene un error en el for bucle, terminará con un archivo parcialmente sobrescrito, con líneas duplicadas o una línea medio cortada. Tu podrías querer f.truncate() justo después de f.seek(0) en lugar de. De esa manera, si obtiene un error, terminará con un archivo incompleto. Pero la solución real (si tiene espacio en disco) es generar un archivo temporal y luego usar os.replace() o pathlib.Path(temp_filename).replace(original_filename) para intercambiarlo con el original después de que todo haya tenido éxito.

    – Borís

    22 de marzo de 2019 a las 13:48


  • podrías agregar i.strip('\n') != "line you want to remove..." como se menciona en la respuesta aceptada, eso resolvería perfectamente mi problema. porque solo i no hizo nada por mi

    – Mangohero1

    6 de abril de 2020 a las 2:47

¿Como eliminar una linea especifica en un archivo
Bernabé

En mi opinión, la mejor y más rápida opción, en lugar de almacenar todo en una lista y volver a abrir el archivo para escribirlo, es volver a escribir el archivo en otro lugar.

with open("yourfile.txt", "r") as file_input:
    with open("newfile.txt", "w") as output: 
        for line in file_input:
            if line.strip("\n") != "nickname_to_delete":
                output.write(line)

¡Eso es todo! En un bucle y solo uno puedes hacer lo mismo. Será mucho más rápido.

  • En lugar de usar el bucle for normal, podemos hacer uso de Expresión del generador De esta forma, el programa no cargará todas las líneas del archivo a la memoria, lo que no es una buena idea en el caso de archivos grandes. Solo tendrá una sola línea en la memoria a la vez. Con la expresión del generador, el bucle se verá así, (output.write(line) for line in input if line!="nickname_to_delete"+"\n")

    – Shrishinde

    25 de febrero de 2016 a las 7:41

  • @ShriShinde Tampoco está leyendo el archivo en la memoria cuando recorre el objeto del archivo, por lo que esta solución funciona de manera idéntica a su sugerencia.

    – Steinar Lima

    27 de febrero de 2016 a las 7:18

  • Es posible que desee eliminar el archivo original y cambiar el nombre del segundo archivo al nombre del archivo original, que con Python en un sistema operativo Linux se vería así: subprocess.call(['mv', 'newfile.txt', 'yourfile.txt'])

    – Máx.

    28 de noviembre de 2016 a las 0:15


  • os.replace (nuevo en python v 3.3) es más multiplataforma que una llamada al sistema para mv.

    – 7yl4r

    15/11/2017 a las 15:30


¿Como eliminar una linea especifica en un archivo
ivanleoncz

Este es un “tenedor” de @LotherLa respuesta de (que creo que debería considerarse la respuesta correcta).

Para un archivo como este:

$ cat file.txt 
1: october rust
2: november rain
3: december snow

Esta bifurcación de la solución de Lother funciona bien:

#!/usr/bin/python3.4

with open("file.txt","r+") as f:
    new_f = f.readlines()
    f.seek(0)
    for line in new_f:
        if "snow" not in line:
            f.write(line)
    f.truncate()

Mejoras:

  • with openque descartan el uso de f.close()
  • mas claro if/else para evaluar si la cadena no está presente en la línea actual

El problema con la lectura de líneas en la primera pasada y la realización de cambios (eliminación de líneas específicas) en la segunda pasada es que si el tamaño de los archivos es enorme, se quedará sin RAM. En cambio, un mejor enfoque es leer líneas, una por una, y escribirlas en un archivo separado, eliminando las que no necesita. Ejecuté este enfoque con archivos tan grandes como 12-50 GB, y el uso de RAM permanece casi constante. Solo los ciclos de CPU muestran el procesamiento en curso.

1646975530 745 ¿Como eliminar una linea especifica en un archivo
Profundo

Me gustó el enfoque de entrada de archivos como se explica en esta respuesta: Eliminar una línea de un archivo de texto (python)

Digamos, por ejemplo, que tengo un archivo que tiene líneas vacías y quiero eliminar las líneas vacías, así es como lo resolví:

import fileinput
import sys
for line_number, line in enumerate(fileinput.input('file1.txt', inplace=1)):
    if len(line) > 1:
            sys.stdout.write(line)

Nota: Las líneas vacías en mi caso tenían una longitud de 1

1646975530 808 ¿Como eliminar una linea especifica en un archivo
Panico kernel

Probablemente, ya obtuviste una respuesta correcta, pero aquí está la mía. En lugar de utilizar una lista para recopilar datos sin filtrar (qué readlines() método lo hace), utilizo dos archivos. Uno es para retener datos principales y el segundo es para filtrar los datos cuando elimina una cadena específica. Aquí hay un código:

main_file = open('data_base.txt').read()    # your main dataBase file
filter_file = open('filter_base.txt', 'w')
filter_file.write(main_file)
filter_file.close()
main_file = open('data_base.txt', 'w')
for line in open('filter_base'):
    if 'your data to delete' not in line:    # remove a specific string
        main_file.write(line)                # put all strings back to your db except deleted
    else: pass
main_file.close()

¡Espero que encuentres esto útil! 🙂

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad