Cómo crear un directorio temporal y obtener la ruta / nombre de archivo en Python

Respuestas:

210

Use la mkdtemp()función del tempfilemódulo:

import tempfile
import shutil

dirpath = tempfile.mkdtemp()
# ... do stuff with dirpath
shutil.rmtree(dirpath)
Philipp
fuente
77
Si usa esto en una prueba, asegúrese de eliminar (shutil.rmtree) el directorio porque no se elimina automáticamente después de su uso. "El usuario de mkdtemp () es responsable de eliminar el directorio temporal y su contenido cuando haya terminado con él". Ver: docs.python.org/2/library/tempfile.html#tempfile.mkdtemp
Niels Bom
97
En python3, puede hacerlo with tempfile.TemporaryDirectory() as dirpath:, y el directorio temporal se limpiará automáticamente al salir del administrador de contexto. docs.python.org/3.4/library/…
Simétrico
41

En Python 3, se puede utilizar TemporaryDirectory en el módulo tempfile .

Esto es directamente de los ejemplos :

import tempfile
with tempfile.TemporaryDirectory() as tmpdirname:
     print('created temporary directory', tmpdirname)
# directory and contents have been removed

Si desea mantener el directorio un poco más largo, entonces se podría hacer algo como esto (no del ejemplo):

import tempfile
import shutil

temp_dir = tempfile.TemporaryDirectory()
print(temp_dir.name)
# use temp_dir, and when done:
shutil.rmtree(temp_dir.name)

Como señaló @MatthiasRoelandts, la documentación también dice que "el directorio se puede limpiar explícitamente llamando al cleanup()método".

Nagev
fuente
2
shutil.rmtree (temp_dir.name) no es necesario.
sidcha
37

Para ampliar otra respuesta, aquí hay un ejemplo bastante completo que puede limpiar el tmpdir incluso con excepciones:

import contextlib
import os
import shutil
import tempfile

@contextlib.contextmanager
def cd(newdir, cleanup=lambda: True):
    prevdir = os.getcwd()
    os.chdir(os.path.expanduser(newdir))
    try:
        yield
    finally:
        os.chdir(prevdir)
        cleanup()

@contextlib.contextmanager
def tempdir():
    dirpath = tempfile.mkdtemp()
    def cleanup():
        shutil.rmtree(dirpath)
    with cd(dirpath, cleanup):
        yield dirpath

def main():
    with tempdir() as dirpath:
        pass # do something here
cdunn2001
fuente
3

Si recibo su pregunta correctamente, ¿también desea conocer los nombres de los archivos generados dentro del directorio temporal? Si es así, intente esto:

import os
import tempfile

with tempfile.TemporaryDirectory() as tmp_dir:
    # generate some random files in it
     files_in_dir = os.listdir(tmp_dir)
Shoval Sadde
fuente