tempfile namedtemporaryfile example create python temporary-files

namedtemporaryfile - ¿Cómo persisto en el disco de un archivo temporal usando Python?



tempfile ruby (4)

Estoy intentando usar el módulo ''tempfile'' para manipular y crear archivos de texto. Una vez que el archivo esté listo, quiero guardarlo en el disco. Pensé que sería tan simple como usar ''shutil.copy''. Sin embargo, recibo un IOError de ''permiso denegado'':

>>> import tempfile, shutil >>> f = tempfile.TemporaryFile(mode =''w+t'') >>> f.write(''foo'') >>> shutil.copy(f.name, ''bar.txt'') Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> shutil.copy(f.name, ''bar.txt'') File "C:/Python25/lib/shutil.py", line 80, in copy copyfile(src, dst) File "C:/Python25/lib/shutil.py", line 46, in copyfile fsrc = open(src, ''rb'') IOError: [Errno 13] Permission denied: ''c://docume~1//me//locals~1//temp//tmpvqq3go'' >>>

¿No es esto así cuando se usa la biblioteca ''tempfile''? ¿Hay una mejor manera de hacer esto? (Tal vez estoy pasando por alto algo muy trivial)


A partir de python 2.6 también puede usar NamedTemporaryFile con la opción delete= establecida en False. De esta forma, se podrá acceder al archivo temporal, incluso después de cerrarlo.

Tenga en cuenta que en Windows (NT y posterior) no puede acceder al archivo una segunda vez mientras está abierto. Tienes que cerrarlo antes de poder copiarlo. Esto no es así en los sistemas Unix.


hop es correcto y dF. es incorrecto sobre por qué ocurre el error.

Como aún no ha llamado a f.close() , el archivo no se elimina.

El documento para NamedTemporaryFile dice:

Si el nombre se puede utilizar para abrir el archivo una segunda vez, mientras que el archivo temporal nombrado sigue abierto, varía en todas las plataformas (se puede usar así en Unix, no puede en Windows NT o posterior).

Y para TemporaryFile :

En Unix, la entrada del directorio del archivo se elimina inmediatamente después de que se crea el archivo. Otras plataformas no son compatibles con esto; su código no debe depender de un archivo temporal creado utilizando esta función que tenga o no un nombre visible en el sistema de archivos.

Por lo tanto, para conservar un archivo temporal (en Windows), puede hacer lo siguiente:

>>> import tempfile, shutil >>> f = tempfile.NamedTemporaryFile(mode=''w+t'', delete=False) >>> f.write(''foo'') >>> file_name = f.name >>> f.close() >>> shutil.copy(file_name, ''bar.txt'')

La solución que Hans Sjunnesson proporcionó también está desactivada, porque copyfileobj solo copia de un objeto similar a un archivo a un objeto similar a un archivo, no a un nombre de archivo:

shutil.copyfileobj (fsrc, fdst [, longitud])

Copie el contenido del archivo fsrc de objeto similar al objeto fdst similar a un archivo. La longitud entera, si se da, es el tamaño del búfer. En particular, un valor de longitud negativo significa copiar los datos sin bucles sobre los datos fuente en fragmentos; de forma predeterminada, los datos se leen en fragmentos para evitar el consumo incontrolado de memoria. Tenga en cuenta que si la posición actual del archivo del objeto fsrc no es 0, solo se copiarán los contenidos de la posición actual del archivo hasta el final del archivo.


Siempre puedes usar shutil.copyfileobj , en tu ejemplo:

new_file = open(''bar.txt'', ''rw'') shutil.copyfileobj(f, new_file)


El archivo que crea con TemporaryFile o NamedTemporaryFile se elimina automáticamente cuando se cierra, por lo que se obtiene un error. Si no quiere esto, puede usar mkstemp en mkstemp lugar (vea los documentos para el archivo temporal ).

>>> import tempfile, shutil, os >>> fd, path = tempfile.mkstemp() >>> os.write(fd, ''foo'') >>> os.close(fd) >>> shutil.copy(path, ''bar.txt'') >>> os.remove(path)