Comment créer un répertoire temporaire et obtenir le chemin / nom du fichier en Python

Réponses:

211

Utilisez la mkdtemp()fonction du tempfilemodule:

import tempfile
import shutil

dirpath = tempfile.mkdtemp()
# ... do stuff with dirpath
shutil.rmtree(dirpath)
Philipp
la source
7
Si vous l'utilisez dans un test, assurez-vous de supprimer (shutil.rmtree) le répertoire car il n'est pas automatiquement supprimé après utilisation. "L'utilisateur de mkdtemp () est responsable de la suppression du répertoire temporaire et de son contenu une fois terminé." Voir: docs.python.org/2/library/tempfile.html#tempfile.mkdtemp
Niels Bom
98
En python3, vous pouvez le faire with tempfile.TemporaryDirectory() as dirpath:, et le répertoire temporaire sera automatiquement nettoyé à la sortie du gestionnaire de contexte. docs.python.org/3.4/library/…
Symétrique
41

Dans Python 3, TemporaryDirectory dans le module tempfile peut être utilisé.

Ceci vient directement du exemples :

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

Si vous souhaitez conserver le répertoire un peu plus longtemps, alors quelque chose comme ceci pourrait être fait (pas à partir de l'exemple):

import tempfile
import shutil

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

Comme l'a souligné @MatthiasRoelandts, la documentation indique également que "le répertoire peut être explicitement nettoyé en appelant la cleanup()méthode".

Nagev
la source
2
shutil.rmtree (temp_dir.name) n'est pas nécessaire.
sidcha
37

Pour développer une autre réponse, voici un exemple assez complet qui peut nettoyer le tmpdir même sur des exceptions:

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
la source
3

Si je reçois correctement votre question, vous souhaitez également connaître les noms des fichiers générés dans le répertoire temporaire? Si oui, essayez ceci:

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
la source