¿Cómo crear un directorio temporal y obtener su ruta/nombre de archivo?

4 minutos de lectura

avatar de usuario
duhhunjonn

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

avatar de usuario
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

avatar de usuario
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 vez 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

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

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)

docs.python.org Ejemplo de directorio temporal usando un administrador de contexto

import tempfile
# create a temporary directory using the context manager
with tempfile.TemporaryDirectory() as tmpdirname:
    print('created temporary directory', tmpdirname)
# directory and contents have been removed

El uso de pathlib para facilitar la manipulación de rutas sobre tempfile hace posible crear nuevas rutas utilizando el operador /path de pathlib:

import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as tmpdirname:
    temp_dir = Path(tmpdirname)
    print(temp_dir, temp_dir.exists())
    file_name = temp_dir / "test.txt"
    file_name.write_text("bla bla bla")
    print(file_name, "contains", file_name.open().read())

# /tmp/tmp81iox6s2 True
# /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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad