duhhunjonn
duhhunjonn

Reputation: 45555

How do I create a temporary directory in Python?

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

Upvotes: 352

Views: 342441

Answers (7)

jm-nab
jm-nab

Reputation: 94

Here's a version which generates a tmp dir, and atexit runs cleanup

import atexit
import tempfile

temp_dir = tempfile.TemporaryDirectory()
os.environ["PROMETHEUS_MULTIPROC_DIR"] = temp_dir.name
atexit.register(temp_dir.cleanup)

Upvotes: 0

Paul Rougieux
Paul Rougieux

Reputation: 11429

The docs suggest using the TemporaryDirectory context manager, which creates a temporary directory, and automatically removes it when exiting the context manager. Using pathlib's slash operator / to manipulate paths, we can create a temporary file inside a temporary directory, then write and read data from the temporary file as follows:

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, the temporary file and the temporary directory have been destroyed

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

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

Upvotes: 24

Nagev
Nagev

Reputation: 13295

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.

Upvotes: 374

Shoval Sadde
Shoval Sadde

Reputation: 1202

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)

Upvotes: 6

Andr&#233; Keller
Andr&#233; Keller

Reputation: 3199

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

Upvotes: 13

cdunn2001
cdunn2001

Reputation: 18307

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

Upvotes: 46

Philipp
Philipp

Reputation: 49850

Use the mkdtemp() function from the tempfile module:

import tempfile
import shutil

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

Upvotes: 287

Related Questions