Cómo eliminar solo el contenido del archivo en python


Tengo un archivo temporal con algo de contenido y un script python que genera alguna salida a este archivo. Quiero que esto se repita N veces, así que necesito reutilizar ese archivo (en realidad matriz de archivos). Estoy borrando todo el contenido, por lo que el archivo temporal estará vacío en el próximo ciclo. Para borrar contenido utilizo este código:

def deleteContent(pfile):

    pfile.seek(0)
    pfile.truncate()
    pfile.seek(0) # I believe this seek is redundant

    return pfile

tempFile=deleteContent(tempFile)

Mi pregunta es: ¿Hay alguna otra forma (mejor, más corta o más segura) de eliminar todo el contenido sin eliminar realmente el archivo temporal del disco?

Algo como tempFile.truncateAll()?

Author: bartimar, 2013-06-15

4 answers

Cómo eliminar solo el contenido del archivo en python

Hay varias formas de establecer el tamaño lógico de un archivo en 0, dependiendo de cómo acceda a ese archivo:

Para vaciar un archivo abierto:

def deleteContent(pfile):
    pfile.seek(0)
    pfile.truncate()

Para vaciar un archivo abierto cuyo descriptor de archivo es conocido:

def deleteContent(fd):
    os.ftruncate(fd, 0)
    os.lseek(fd, 0, os.SEEK_SET)

Para vaciar un archivo cerrado (cuyo nombre es conocido)

def deleteContent(fName):
    with open(fName, "w"):
        pass



Tengo un archivo temporal con algún contenido [...] Necesito reutiliza ese archivo

Dicho esto, en el caso general probablemente no sea eficiente ni deseable reutilizar un archivo temporal. A menos que tenga necesidades muy específicas, debe pensar en usar tempfile.TemporaryFile y un gestor de contexto para crear/usar/eliminar tus archivos temporales de forma casi transparente:

import tempfile

with tempfile.TemporaryFile() as temp:
     # do whatever you want with `temp`

# <- `tempfile` guarantees the file being both closed *and* deleted
#     on exit of the context manager
 61
Author: Sylvain Leroux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-17 11:33:54

Creo que lo más fácil es simplemente abrir el archivo en modo de escritura y luego cerrarlo. Por ejemplo, si su archivo myfile.dat contiene:

"This is the original content"

Entonces puedes simplemente escribir:

f = open('myfile.dat', 'w')
f.close()

Esto borraría todo el contenido. Luego puede escribir el nuevo contenido en el archivo:

f = open('myfile.dat', 'w')
f.write('This is the new content!')
f.close()
 3
Author: Peaceful,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-07 11:53:57

Lo que podría ser más fácil que algo como esto:

import tempfile

for i in range(400):
    with tempfile.TemporaryFile() as tf:
        for j in range(1000):
            tf.write('Line {} of file {}'.format(j,i))

Que crea 400 archivos temporales y escribe 1000 líneas en cada archivo temporal. Se ejecuta en menos de 1/2 segundo en mi máquina normal. Cada archivo temporal del total se crea y elimina a medida que el administrador de contexto se abre y cierra en este caso. Es rápido, seguro y multiplataforma.

Usar tempfile es mucho mejor que intentar reinventarlo.

 2
Author: dawg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-15 18:25:05

Puedes hacer esto:

def deleteContent(pfile):
    fn=pfile.name 
    pfile.close()
    return open(fn,'w')
 2
Author: the wolf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-17 22:25:30