253 votes

Comment créer un répertoire temporaire en Python ?

Comment créer un répertoire temporaire et obtenir son chemin d'accès en Python ?

300voto

Nagev Points 658

Dans Python 3, TemporaryDirectory de la tempfile peut être utilisé.

A partir de la ejemplos :

import tempfile

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

# directory and contents have been removed

Pour contrôler manuellement le moment où le répertoire est supprimé, n'utilisez pas de gestionnaire de contexte, comme dans l'exemple suivant :

import tempfile

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

La documentation indique également :

À la fin du contexte ou de la destruction de l'objet répertoire temporaire, le répertoire temporaire nouvellement créé et tout son contenu sont supprimés du système de fichiers.

A la fin du programme, par exemple, Python nettoiera le répertoire s'il n'a pas été supprimé, par exemple par le gestionnaire de contexte ou la commande cleanup() méthode. La méthode unittest peut se plaindre ResourceWarning: Implicitly cleaning up <TemporaryDirectory... si vous comptez sur cela.

259voto

Philipp Points 21479

Utiliser le mkdtemp() de la fonction tempfile module :

import tempfile
import shutil

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

14 votes

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 lorsqu'il n'en a plus besoin." Voir : docs.python.org/2/library/tempfile.html#tempfile.mkdtemp

158 votes

En python3, vous pouvez 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/

41voto

cdunn2001 Points 3597

Pour développer une autre réponse, voici un exemple assez complet qui peut nettoyer le tmpdir même en cas d'exception :

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

1 votes

Bonne alternative à with tempfile.TemporaryDirectory() as tmpdir: sous Windows puisqu'il y a ce bug ennuyeux qui ne me permet pas d'aller dans le répertoire temporaire

12voto

rbtux Points 845

Dans Python 3.2 et les versions ultérieures, il existe un gestionnaire de contexte utile pour cela dans la stdlib https://docs.python.org/3/library/tempfile.html#tempfile.TemporaryDirectory

7voto

Paul4forest Points 75

La documentation suggère d'utiliser l'option TemporaryDirectory qui crée un répertoire temporaire et le supprime automatiquement lorsque l'on quitte le gestionnaire de contexte :

import tempfile

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

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

Utilisation pathlib pour faciliter la manipulation des chemins au-dessus de tempfile permet de créer de nouveaux chemins à l'aide de la fonction / opérateur de chemin 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

En dehors du gestionnaire de contexte, les fichiers ont été détruits

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X