Respuestas:
Primero, abra el archivo y obtenga todas sus líneas del archivo. Luego, vuelva a abrir el archivo en modo de escritura y escriba 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)
Necesita 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 linetampoco.
Solución a este problema con solo una 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 hace uso de buscar para restablecer el puntero f y luego truncar para eliminar todo después de la última escritura.
forbucle, terminará con un archivo parcialmente sobrescrito, con líneas duplicadas o una mitad cortada. Es posible que desee f.truncate()justo después f.seek(0)en su lugar. De esa forma, si obtiene un error, terminará con un archivo incompleto. Pero la solución real (si tiene espacio en el disco) es generar un archivo temporal y luego usarlo os.replace()o pathlib.Path(temp_filename).replace(original_filename)intercambiarlo con el original después de que todo haya tenido éxito.
i.strip('\n') != "line you want to remove..."como se menciona en la respuesta aceptada, eso resolvería perfectamente mi problema. Porque simplemente ino hizo nada por mí
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 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 puede hacer lo mismo. Será mucho más rápido
(output.write(line) for line in input if line!="nickname_to_delete"+"\n")
subprocess.call(['mv', 'newfile.txt', 'yourfile.txt'])
os.replace(nuevo en python v 3.3) es más multiplataforma que una llamada al sistema mv.
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()if/elsepara evaluar si la cadena no está presente en la línea actualEl problema con la lectura de líneas en el primer paso y la realización de cambios (eliminación de líneas específicas) en el segundo paso 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. He ejecutado este enfoque con archivos tan grandes como 12-50 GB, y el uso de RAM se mantiene casi constante. Solo los ciclos de CPU muestran el procesamiento en progreso.
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 longitud 1
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'])
luego
$ 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 volver a escribir el resultado en el archivo fuente.
Así es como podría hacer esto:
import, os, csv # and other imports you need
nicknames_to_delete = ['Nick', 'Stephen', 'Mark']
Supongo que nicknames.csvcontiene datos como:
Nick
Maria
James
Chris
Mario
Stephen
Isabella
Ahmed
Julia
Mark
...
Luego cargue el archivo en la lista:
nicknames = None
with open("nicknames.csv") as sourceFile:
nicknames = sourceFile.read().splitlines()
A continuación, repita la lista para que coincida con las entradas que desea 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 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()
En general, no puedes; tienes que volver a escribir todo el archivo (al menos desde el punto de cambio hasta el final).
En algunos casos específicos, puede hacerlo mejor que esto:
si todos sus elementos de datos tienen la misma longitud y no están en un orden específico, y conoce el desplazamiento del que desea eliminar, puede copiar el último elemento sobre el que se va a eliminar y truncar el archivo antes del último elemento ;
o simplemente podría sobrescribir el fragmento de datos con un valor de "estos son datos incorrectos, omitirlo" o mantener una marca de "este elemento ha sido eliminado" en los elementos de datos guardados de modo que pueda marcarlo como eliminado sin modificar el archivo.
Probablemente esto sea excesivo para documentos cortos (¿algo menor a 100 KB?).
Probablemente, ya obtuviste una respuesta correcta, pero aquí está la mía. En lugar de usar una lista para recopilar datos sin filtrar (qué readlines()método hace), utilizo dos archivos. Uno es para mantener los 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! :)
Guarde las líneas del archivo en una lista, luego elimine de la lista la línea que desea eliminar y escriba las líneas restantes en un nuevo archivo
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 / alguna línea (s) 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()
Puedes usar la
rebiblioteca
Suponiendo que pueda cargar su archivo txt completo. Luego define una lista de apodos no deseados y luego los sustituye con una cadena vacía "".
# Delete unwanted characters
import re
# Read, then decode for py2 compat.
path_to_file = 'data/nicknames.txt'
text = open(path_to_file, 'rb').read().decode(encoding='utf-8')
# Define unwanted nicknames and substitute them
unwanted_nickname_list = ['SourDough']
text = re.sub("|".join(unwanted_nickname_list), "", text)
Para eliminar una línea específica de un archivo por su número de línea :
Reemplace las variables filename y line_to_delete con el nombre de su archivo y el número de línea que desea eliminar.
filename = 'foo.txt'
line_to_delete = 3
initial_line = 1
file_lines = {}
with open(filename) as f:
content = f.readlines()
for line in content:
file_lines[initial_line] = line.strip()
initial_line += 1
f = open(filename, "w")
for line_number, line_content in file_lines.items():
if line_number != line_to_delete:
f.write('{}\n'.format(line_content))
f.close()
print('Deleted line: {}'.format(line_to_delete))
Salida de ejemplo :
Deleted line: 3
for nb, line in enumerate(f.readlines())
Tome el contenido del archivo, divídalo por una nueva línea en una tupla. Luego, acceda al número de línea de su tupla, únase a su tupla de resultado y sobrescriba el archivo.
tuple(f.read().split('\n'))? (2) "acceder al número de línea de su tupla" y "unirse a su tupla resultante" suena bastante misterioso; El código real de Python podría ser más comprensible.
fileinputcomo lo describe @ jf-sebastian aquí . Parece que le permite trabajar línea por línea, a través de un archivo temporal, todo con unaforsintaxis simple .