usando Python para eliminar una línea específica en un archivo

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

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) 

Debe 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, la última line tampoco.

Solución a este problema con un solo abierto:

 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 función de búsqueda para restablecer el puntero f, luego se trunca para eliminar todo después de la última escritura.

En mi opinión, la opción mejor y más rápida, 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 input: with open("newfile.txt", "w") as output: for line in input: if line.strip("\n") != "nickname_to_delete": output.write(line) 

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

Esta es una “bifurcación” de la respuesta de @Lother (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 

Este tenedor 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 open , que descartan el uso de f.close()
  • más claro if/else para evaluar si la cadena no está presente en la línea actual

El problema con leer líneas en la primera pasada y hacer cambios (eliminar líneas específicas) en la segunda pasada es que si los tamaños de archivo son enormes, se quedará sin memoria RAM. En cambio, un enfoque mejor es leer las líneas, una por una, y escribirlas en un archivo separado, eliminando las que no necesita. He ejecutado este enfoque con archivos de hasta 12-50 GB, y el uso de RAM permanece casi constante. Sólo los ciclos de la CPU muestran el procesamiento en curso.

Si usa Linux, puede probar el siguiente enfoque.
Supongamos que tiene un archivo de texto llamado animal.txt :

 $ cat animal.txt dog pig cat monkey elephant 

Eliminar la primera línea:

 >>> import subprocess >>> subprocess.call(['sed','-i','/.*dog.*/d','animal.txt']) 

entonces

 $ cat animal.txt pig cat monkey elephant 

Creo que si lees el archivo en una lista, entonces puedes iterar sobre la lista para buscar el apodo del que deseas deshacerte. Puede hacerlo de manera muy eficiente sin crear archivos adicionales, pero tendrá que escribir el resultado de nuevo en el archivo de origen.

Aquí es cómo podría hacer esto:

 import, os, csv # and other imports you need nicknames_to_delete = ['Nick', 'Stephen', 'Mark'] 

Supongo que nicknames.csv contiene datos como:

 Nick Maria James Chris Mario Stephen Isabella Ahmed Julia Mark ... 

A continuación, cargue el archivo en la lista:

  nicknames = None with open("nicknames.csv") as sourceFile: nicknames = sourceFile.read().splitlines() 

A continuación, realice una iteración sobre la lista para que coincida con sus entradas para eliminar:

 for nick in nicknames_to_delete: try: if nick in nicknames: nicknames.pop(nicknames.index(nick)) else: print(nick + " is not found in the file") except ValueError: pass 

Por último, escriba el resultado de nuevo en el archivo:

 with open("nicknames.csv", "a") as nicknamesFile: nicknamesFile.seek(0) nicknamesFile.truncate() nicknamesWriter = csv.writer(nicknamesFile) for name in nicknames: nicknamesWriter.writeRow([str(name)]) nicknamesFile.close() 

No es una buena solución si pones un archivo entero en la memoria, sé que hoy en día todos tienen toneladas de memoria, pero considera si el archivo es de varios GB de registros o algo así.

Mejor manera de copiarlo línea por línea a un nuevo archivo, que eliminar el primero o algo así

En general, no puedes; debe escribir todo el archivo nuevamente (al menos desde el punto de cambio hasta el final).

En algunos casos específicos puedes hacerlo mejor que esto:

Si todos los elementos de sus datos tienen la misma longitud y no tienen un orden específico, y conoce el desplazamiento del que desea eliminar, puede copiar el último elemento sobre el que desea eliminar y truncar el archivo antes del último. ;

o simplemente puede sobrescribir el fragmento de datos con un valor ‘esto es información incorrecta, omitirlo’ o mantener un indicador de ‘este elemento ha sido eliminado’ en sus elementos de datos guardados, de manera que pueda marcarlo como eliminado sin modificar el archivo.

Probablemente esto sea una exageración para documentos cortos (¿algo de menos de 100 KB?).

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

Por ejemplo, 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 longitud 1

Probablemente, ya tienes una respuesta correcta, pero aquí está la mía. En lugar de usar una lista para recostackr datos sin filtrar (lo que hace el método readlines() ), uso dos archivos. Una es para mantener un dato principal y la segunda para filtrar los datos cuando se 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! 🙂

Guarde las líneas de archivo en una lista, luego elimine de la lista la línea que desea eliminar y escriba las líneas restantes en un archivo nuevo

 with open("file_name.txt", "r") as f: lines = f.readlines() lines.remove("Line you want to delete\n") with open("new_file.txt", "w") as new_f: for line in lines: new_f.write(line) 

Aquí hay otro método para eliminar una / algunas líneas de un archivo:

 src_file = zzzz.txt f = open(src_file, "r") contents = f.readlines() f.close() contents.pop(idx) # remove the line item from list, by line number, starts from 0 f = open(src_file, "w") contents = "".join(contents) f.write(contents) f.close() 

Tome el contenido del archivo, divídalo por nueva línea en una tupla. Luego, acceda al número de línea de su tupla, únase a su tupla de resultados y sobrescriba el archivo.