¿Cómo borrar el contenido del archivo de texto en Python?

140

Tengo un archivo de texto que quiero borrar en Python. ¿Cómo puedo hacer eso?

Paleto
fuente
las personas que han dado las respuestas han dicho que no es posible ... entonces ¿quieres decirme cómo hacerlo fácilmente en python?
Hick

Respuestas:

279

En python:

open('file.txt', 'w').close()

O, alternativamente, si ya tiene un archivo abierto:

f = open('file.txt', 'r+')
f.truncate(0) # need '0' when using r+

En C ++, podría usar algo similar.

ondra
fuente
#include<fstream>y luego std::ofstream("file.txt");tan corto como en Python. :)
wilhelmtell
8
La razón por la que esto funciona (tanto en C ++ como en Python) es porque, de forma predeterminada, cuando abre un archivo para escribir, trunca los contenidos existentes. Entonces, realmente es un efecto secundario y, por lo tanto, preferiría la llamada explícita a truncate () por razones de claridad, aunque sea innecesario.
rmeador
77
si ha abierto el archivo usando "r +", use truncar (0) si ha analizado el archivo, lo que probablemente tiene. ¡Agregue esto a la respuesta anterior para completarlo!
Johan Engblom
3
use f.seek (0) para mover el puntero al comienzo del archivo
Johan Engblom
Estaba leyendo y escribiendo en el archivo. La respuesta trunca perfectamente el archivo, pero tenga cuidado si desea volver a escribirle algo, no olvide agregar f.seek(0)después f.truncate(0), de lo contrario tendrá \ x00 extraños al principio del archivo.
Krishna Chaitanya
29

No es una respuesta completa, sino una extensión de la respuesta de Ondra

Cuando use truncate()(mi método preferido) asegúrese de que su cursor esté en la posición requerida. Cuando se abre un nuevo archivo para leer, open('FILE_NAME','r')su cursor está en 0 de forma predeterminada. Pero si ha analizado el archivo dentro de su código, asegúrese de apuntar al principio del archivo nuevamente, es decir, truncate(0) por defecto truncate()trunca el contenido de un archivo comenzando desde la posición actual del cusror.

Un simple ejemplo

Snigdha Batra
fuente
21

Al abrir un archivo en modo "escritura", se borra, no tiene que escribir específicamente en él:

open("filename", "w").close()

(debe cerrarlo ya que el momento en que el archivo se cierra automáticamente puede ser específico de la implementación)

Douglas Leeder
fuente
10

Del usuario @jamylak, una forma alternativa de open("filename","w").close()es

with open('filename.txt','w'): pass
CasualCoder3
fuente
8

Cuando lo uso with open("myfile.txt", "r+") as my_file:, obtengo ceros extraños myfile.txt, especialmente porque estoy leyendo el archivo primero. Para que funcione, primero tuve que cambiar el puntero de my_fileal comienzo del archivo con my_file.seek(0). Entonces podría hacer my_file.truncate()para borrar el archivo.

wcyn
fuente
1
Esto no debería sorprendernos, se mencionó en esta respuesta 3 años antes.
AMC
6

Tienes que sobrescribir el archivo. En C ++:

#include <fstream>

std::ofstream("test.txt", std::ios::out).close();
Alex Korban
fuente
1
No hay necesidad de la close()llamada. El destructor cerrará el archivo. Así que solo necesita crear un temporal:ofstream("test.txt");
wilhelmtell
Esta pregunta ha cambiado desde esta respuesta. ¿Quizás eliminar la pregunta dada la nueva dirección de la pregunta?
Seanny123
1

Asignar el puntero de archivo a nulo dentro de su programa simplemente eliminará esa referencia al archivo. El archivo sigue ahí. Creo que la remove()función en la c stdio.hes lo que estás buscando allí. No estoy seguro acerca de Python.

bsberry
fuente
2
Por cierto, tanto remove () como unlink () disminuirán el recuento de referencias en un archivo normal, en realidad no lo borrarán. El archivo se borrará una vez que el recuento de referencias baje a cero. Por ejemplo, si su proceso tiene el archivo abierto y llama a unlink () o remove () en él, no se eliminará hasta que el archivo esté cerrado () d (es decir, el recuento de referencias cae a cero; tampoco se supone que haya otros procesos tener el archivo abierto). Este comportamiento es útil, por ejemplo, para garantizar que no se dejen archivos temporales después de la finalización anormal del proceso (por ejemplo, abrir (), desvincular (), ejecutar archivo IO, CRASH , cerrar () NO llamado).
Nulo
1

Si la seguridad es importante para usted, entonces abrir el archivo para escribirlo y cerrarlo nuevamente no será suficiente. Al menos parte de la información seguirá estando en el dispositivo de almacenamiento y podría encontrarse, por ejemplo, utilizando una utilidad de recuperación de disco.

Supongamos, por ejemplo, que el archivo que está borrando contiene contraseñas de producción y debe eliminarse inmediatamente después de que se complete la operación actual.

Rellenar con cero el archivo una vez que haya terminado de usarlo ayuda a garantizar que se destruya la información confidencial.

En un proyecto reciente utilizamos el siguiente código, que funciona bien para archivos de texto pequeños. Sobrescribe los contenidos existentes con líneas de ceros.

import os

def destroy_password_file(password_filename):
    with open(password_filename) as password_file:
        text = password_file.read()
    lentext = len(text)
    zero_fill_line_length = 40
    zero_fill = ['0' * zero_fill_line_length
                      for _
                      in range(lentext // zero_fill_line_length + 1)]
    zero_fill = os.linesep.join(zero_fill)
    with open(password_filename, 'w') as password_file:
        password_file.write(zero_fill)

Tenga en cuenta que el relleno cero no garantizará su seguridad. Si realmente le preocupa, sería mejor rellenar con ceros y utilizar una utilidad especializada como File Shredder o CCleaner para limpiar el espacio 'vacío' en su unidad.

Mella
fuente
0

No puede "borrar" de un archivo en el lugar a menos que necesite borrar el final. Puede contentarse con sobrescribir un valor "vacío" o leer las partes del archivo que le interesan y escribirlo en otro archivo.

Ignacio Vazquez-Abrams
fuente
ok, ¿cómo sobrescribirlo sin dar valor de basura? Quiero decir, supongamos que hay una longitud de cadena de 9 y la sobrescribo con una longitud de cadena de 6. eso significaría 3 valores de basura rt?
Hick
Correcto. Además, tendría que tener alguna forma de identificar a cualquier lector el hecho de que esos 3 caracteres son basura.
Ignacio Vazquez-Abrams
El hecho es que mi código se extiende entre Python y C ++. así que si la lectura de un archivo se realiza en C ++ y la escritura del archivo en Python ... tanto el tiempo que el archivo tiene que ser borrado ...
Hick
0

Como los archivos de texto son secuenciales, no puede borrar directamente los datos en ellos. Sus opciones son:

  • La forma más común es crear un nuevo archivo. Lea el archivo original y escriba todo en el nuevo archivo, excepto la parte que desea borrar. Cuando se haya escrito todo el archivo, elimine el archivo antiguo y cambie el nombre del nuevo archivo para que tenga el nombre original.
  • También puede truncar y reescribir todo el archivo desde el punto que desea cambiar en adelante. Busque el punto que desea cambiar y lea el resto del archivo en la memoria. Vuelva al mismo punto, trunque el archivo y vuelva a escribir el contenido sin la parte que desea borrar.
  • Otra opción simple es sobrescribir los datos con otros datos de la misma longitud. Para eso, busque la posición exacta y escriba los nuevos datos. La limitación es que debe tener exactamente la misma longitud.

Mire el método seek/ truncatefunction / para implementar cualquiera de las ideas anteriores. Tanto Python como C tienen esas funciones.

nosklo
fuente
solo quiero borrar todo el archivo desde el principio
Hick
2
Luego simplemente elimine el archivo. Use os.removeo os.unlinken python, o unlinken C. Otra opción es simplemente volver a abrir el archivo para escribirlo o usarlo truncate.
nosklo
0

Escribir y leer contenido de archivos

def writeTempFile(text = ''):
    filePath = "/temp/file1.txt"
    if not text:                      # If blank return file content
        f = open(filePath, "r")
        slug = f.read()
        return slug
    else:
        f = open(filePath, "a") # Create a blank file
        f.seek(0)  # sets  point at the beginning of the file
        f.truncate()  # Clear previous content
        f.write(text) # Write file
        f.close() # Close file
        return text

Funciono para mi

Mohd Tauovir Khan
fuente
0

También puede usar esto (basado en algunas de las respuestas anteriores):

file = open('filename.txt', 'w')
file.write('')
file.close

Por supuesto, esta es una forma realmente mala de borrar un archivo porque requiere muchas líneas de código, pero acabo de escribir esto para mostrarle que también se puede hacer en este método.

feliz codificación!

sujay simha
fuente