So erstellen Sie ein temporäres Verzeichnis und erhalten den Pfad / Dateinamen in Python

Antworten:

209

Verwenden Sie die mkdtemp()Funktion aus dem tempfileModul:

import tempfile
import shutil

dirpath = tempfile.mkdtemp()
# ... do stuff with dirpath
shutil.rmtree(dirpath)
Philipp
quelle
7
Wenn Sie dies in einem Test verwenden, müssen Sie das Verzeichnis unbedingt entfernen (shutil.rmtree), da es nach der Verwendung nicht automatisch gelöscht wird. "Der Benutzer von mkdtemp () ist dafür verantwortlich, das temporäre Verzeichnis und seinen Inhalt zu löschen, wenn er damit fertig ist." Siehe: docs.python.org/2/library/tempfile.html#tempfile.mkdtemp
Niels Bom
97
In Python3 können Sie dies tun with tempfile.TemporaryDirectory() as dirpath:, und das temporäre Verzeichnis wird beim Beenden des Kontextmanagers automatisch bereinigt. docs.python.org/3.4/library/…
Symmetric
41

In Python 3 kann TemporaryDirectory im tempfile- Modul verwendet werden.

Dies geht direkt aus den Beispielen hervor :

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

Wenn Sie das Verzeichnis etwas länger behalten möchten, können Sie Folgendes tun (nicht aus dem Beispiel):

import tempfile
import shutil

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

Wie @MatthiasRoelandts hervorhob, heißt es in der Dokumentation auch, dass "das Verzeichnis durch Aufrufen der cleanup()Methode explizit bereinigt werden kann".

Nagev
quelle
2
shutil.rmtree (temp_dir.name) ist nicht erforderlich.
Sidcha
37

Um eine andere Antwort zu erweitern, hier ein ziemlich vollständiges Beispiel, das das tmpdir auch in Ausnahmen bereinigen kann:

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
quelle
3

Wenn ich Ihre Frage richtig verstehe, möchten Sie auch die Namen der Dateien kennen, die im temporären Verzeichnis generiert wurden? Wenn ja, versuchen Sie Folgendes:

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
quelle