312

How can I create a temporary directory and get its path in Python?

Mateen Ulhaq
  • 24,552
  • 19
  • 101
  • 135
duhhunjonn
  • 44,855
  • 11
  • 28
  • 15

6 Answers6

319

In Python 3, TemporaryDirectory from the tempfile module can be used.

From the examples:

import tempfile

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

# directory and contents have been removed

To manually control when the directory is removed, don't use a context manager, as in the following example:

import tempfile

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

The documentation also says:

On completion of the context or destruction of the temporary directory object the newly created temporary directory and all its contents are removed from the filesystem.

At the end of the program, for example, Python will clean up the directory if it wasn't removed, e.g. by the context manager or the cleanup() method. Python's unittest may complain of ResourceWarning: Implicitly cleaning up <TemporaryDirectory... if you rely on this, though.

Nagev
  • 10,835
  • 4
  • 58
  • 69
  • 2
    shutil.rmtree(temp_dir.name) is not necessary. – sidcha Nov 14 '19 at 07:14
  • "Python will clean up the directory if it wasn't explicitly removed" -- I think this only applies if the context manager style (`with ...`) is used. – Mateen Ulhaq Dec 04 '21 at 05:43
  • If I run the second example (no context manager) with `sleep(5)` instead of `temp_dir.cleanup()` I can `ls` the temporary directory before the program is done and after it's finished the same directory is gone. It's probably best to use a context manager or the `cleanup()` method, however. – Nagev Dec 04 '21 at 16:26
  • 1
    this is the greatest solution; no dangerous shutil.rmtree required – Matt Nov 14 '22 at 00:17
281

Use the mkdtemp() function from the tempfile module:

import tempfile
import shutil

dirpath = tempfile.mkdtemp()
# ... do stuff with dirpath
shutil.rmtree(dirpath)
Samuel Rossille
  • 18,940
  • 18
  • 62
  • 90
Philipp
  • 48,066
  • 12
  • 84
  • 109
  • 17
    If you use this in a test be sure to remove (shutil.rmtree) the directory because it's not automatically deleted after use. "The user of mkdtemp() is responsible for deleting the temporary directory and its contents when done with it." See: http://docs.python.org/2/library/tempfile.html#tempfile.mkdtemp – Niels Bom Nov 12 '13 at 11:42
  • 171
    In python3, you can do `with tempfile.TemporaryDirectory() as dirpath:`, and the temporary directory will automatically cleaned up upon exiting the context manager. https://docs.python.org/3.4/library/tempfile.html#tempfile.TemporaryDirectory – Symmetric Feb 04 '16 at 23:11
44

To expand on another answer, here is a fairly complete example which can cleanup the tmpdir even on 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
  • 17,657
  • 8
  • 55
  • 45
  • 2
    good alternative to `with tempfile.TemporaryDirectory() as tmpdir:` on windows since there is [this annoying bug](https://bugs.python.org/issue35144) that does not let me go into the temporary directory – Rui Rodrigues Jan 26 '21 at 13:48
13

In python 3.2 and later, there is a useful contextmanager for this in the stdlib https://docs.python.org/3/library/tempfile.html#tempfile.TemporaryDirectory

André Keller
  • 3,179
  • 3
  • 15
  • 23
13

The docs suggest using the TemporaryDirectory context manager, which creates a temporary directory, and automatically removes it when exiting the context manager:

import tempfile

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

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

Using pathlib to facilitate path manipulation on top of tempfile makes it possible to create new paths with the / path operator of 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

Outside the context manager, files have been destroyed

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

print(file_name, file_name.exists())
# /tmp/tmp81iox6s2/test.txt False
Mateen Ulhaq
  • 24,552
  • 19
  • 101
  • 135
Paul Rougieux
  • 10,289
  • 4
  • 68
  • 110
6

If I get your question correctly, you want to also know the names of the files generated inside the temporary directory? If so, try this:

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
  • 1,152
  • 1
  • 11
  • 11