¿Cómo creo un directorio temporal en Python?

4 minutos de lectura

avatar de usuario de duhhunjonn
duhhunjonn

¿Cómo puedo crear un directorio temporal y obtener su ruta en Python?

Avatar de usuario de Nagev
Nagev

En Python 3, TemporaryDirectory desde el tempfile Se puede utilizar el módulo.

Desde el ejemplos:

import tempfile

with tempfile.TemporaryDirectory() as tmpdirname:
     print('created temporary directory', tmpdirname)

# directory and contents have been removed

Para controlar manualmente cuándo se elimina el directorio, no utilice un administrador de contexto, como en el siguiente ejemplo:

import tempfile

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

La documentación también dice:

Al finalizar el contexto o la destrucción del objeto de directorio temporal, el directorio temporal recién creado y todo su contenido se eliminan del sistema de archivos.

Al final del programa, por ejemplo, Python limpiará el directorio si no fue eliminado, por ejemplo, por el administrador de contexto o el cleanup() método. de pitón unittest puede quejarse de ResourceWarning: Implicitly cleaning up <TemporaryDirectory... si confías en esto, sin embargo.

  • shutil.rmtree(temp_dir.name) no es necesario.

    – sidcha

    14 de noviembre de 2019 a las 7:14

  • “Python limpiará el directorio si no se eliminó explícitamente”. Creo que esto solo se aplica si el estilo del administrador de contexto (with ...) se utiliza.

    –Mateen Ulhaq

    4 de diciembre de 2021 a las 5:43

  • Si ejecuto el segundo ejemplo (sin administrador de contexto) con sleep(5) en lugar de temp_dir.cleanup() Puedo ls el directorio temporal antes de que finalice el programa y después de que finalice, el mismo directorio desaparecerá. Probablemente sea mejor usar un administrador de contexto o el cleanup() método, sin embargo.

    – Nagev

    4 de diciembre de 2021 a las 16:26

  • esta es la mayor solución; no se requiere shutil.rmtree peligroso

    – Mate

    14 de noviembre de 2022 a las 0:17

Avatar de usuario de Philipp
Felipe

Utilizar el mkdtemp() función de la tempfile módulo:

import tempfile
import shutil

dirpath = tempfile.mkdtemp()
# ... do stuff with dirpath
shutil.rmtree(dirpath)

  • 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 termine”. Ver: docs.python.org/2/library/tempfile.html#tempfile.mkdtemp

    – Niels Bom

    12 de noviembre de 2013 a las 11:42

  • En python3, puedes hacer 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

    4 de febrero de 2016 a las 23:11

Para ampliar otra respuesta, aquí hay un ejemplo bastante completo que puede limpiar el tmpdir incluso en 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

  • buena alternativa a with tempfile.TemporaryDirectory() as tmpdir: en las ventanas ya que hay este molesto error eso no me deja entrar al directorio temporal

    –Rui Rodrigues

    26 de enero de 2021 a las 13:48

En python 3.2 y versiones posteriores, hay un administrador de contexto útil para esto en stdlib https://docs.python.org/3/library/tempfile.html#tempfile.TemporaryDirectory

Avatar de usuario de Paul Rougieux
Pablo Rougieux

Los documentos sugieren usar el TemporaryDirectory administrador de contexto, que crea un directorio temporal y lo elimina automáticamente al salir del administrador de contexto:

import tempfile

with tempfile.TemporaryDirectory() as tmpdirname:
    print('created temporary directory', tmpdirname)

# Outside the context manager, directory and contents have been removed.

Usando pathlib para facilitar la manipulación de rutas además de tempfile permite crear nuevos caminos con la / operador de ruta de pathlib:

import tempfile
from pathlib import Path

with tempfile.TemporaryDirectory() as tmpdirname:
    temp_dir = Path(tmpdirname)
    file_name = temp_dir / "test.txt"
    file_name.write_text("bla bla bla")

    print(temp_dir, temp_dir.exists())
    # /tmp/tmp81iox6s2 True

    print(file_name, "contains", file_name.open().read())
    # /tmp/tmp81iox6s2/test.txt contains bla bla bla

Fuera del administrador de contexto, los archivos han sido destruidos

print(temp_dir, temp_dir.exists())
# /tmp/tmp81iox6s2 False

print(file_name, file_name.exists())
# /tmp/tmp81iox6s2/test.txt False

Avatar de usuario de Shoval Sadde
Sillín de pala

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

import os
import tempfile

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

¿Ha sido útil esta solución?