Of course! Let's break down everything you need to know about temporary file and directory names in Python using the tempfile module.
The core idea of the tempfile module is to create temporary files and directories in a secure and reliable way. It automatically handles finding the correct temporary directory (e.g., /tmp on Linux, C:\Users\YourUser\AppData\Local\Temp on Windows), generating unique names to avoid collisions, and, most importantly, cleaning up after themselves.
Here are the main functions and what their names look like.
NamedTemporaryFile(): The Most Common Way
This is the function you'll use most often. It creates a temporary file that has a visible name in the filesystem.
Key Feature: The file is automatically deleted as soon as it is closed. This is the default behavior and the safest way to ensure you don't leave files lying around.
Basic Usage and Name
import tempfile
import os
# The 'with' statement ensures the file is closed automatically
with tempfile.NamedTemporaryFile(mode='w+', delete=True) as tmp_file:
# --- Let's inspect the name ---
temp_name = tmp_file.name
print(f"Temporary file created at: {temp_name}")
# Check if the file exists (it should)
print(f"File exists? {os.path.exists(temp_name)}")
# --- Let's use the file ---
tmp_file.write("Hello, temporary world!")
tmp_file.seek(0) # Go back to the beginning of the file
content = tmp_file.read()
print(f"Content of the file: {content}")
# The 'with' block ends here, so the file is closed and deleted.
print("\n--- After the 'with' block ---")
print(f"File exists? {os.path.exists(temp_name)}") # Should be False
Example Output (will vary):
Temporary file created at: /tmp/tmpxyz123.txt
File exists? True
Content of the file: Hello, temporary world!
--- After the 'with' block ---
File exists? False
How is the Name Generated?
- Directory: It uses the system's default temporary directory (from
os.tempdir). - Prefix: You can control the start of the filename with the
prefixargument. This is great for identifying your temp files. - Suffix: You can control the end of the filename with the
suffixargument (e.g., to add a.txtextension). - Random Part: A long, random string is generated to ensure the name is unique.
- Pattern: The final name looks like:
<prefix><random_string><suffix>
Example with Prefix and Suffix
import tempfile
# Create a temp file with a custom prefix and suffix
with tempfile.NamedTemporaryFile(
prefix="my_app_data_",
suffix=".log",
mode='w+'
) as tmp_log:
print(f"Custom-named temp file: {tmp_log.name}")
tmp_log.write("This is a log entry.")
# File is automatically deleted when the 'with' block exits.
Example Output:

Custom-named temp file: /tmp/my_app_data_abcde12345.log
TemporaryDirectory(): For Temporary Folders
When you need a whole temporary directory instead of just a file.

Key Feature: The directory and all its contents are automatically deleted when the with block is exited.
import tempfile
import os
with tempfile.TemporaryDirectory() as tmp_dir:
print(f"Temporary directory created at: {tmp_dir}")
# Check if the directory exists
print(f"Directory exists? {os.path.exists(tmp_dir)}")
# You can create files and subdirectories inside it
file_path = os.path.join(tmp_dir, "my_temp_file.txt")
with open(file_path, 'w') as f:
f.write("This file is inside a temp directory.")
print(f"File created inside: {file_path}")
print(f"File exists? {os.path.exists(file_path)}")
# The 'with' block ends, the directory and its contents are gone.
print("\n--- After the 'with' block ---")
print(f"Directory exists? {os.path.exists(tmp_dir)}") # Should be False
print(f"File exists? {os.path.exists(file_path)}") # Should be False
mkstemp() and mkdtemp(): Manual Management
These functions give you more control but require you to clean up manually. They are less safe and generally not recommended unless you have a specific reason.
mkstemp(): Creates a Temporary File (Manual)
- Important: It returns a tuple:
(file_descriptor, file_name). - Crucially: It does not open the file for you. You get the file descriptor, which you must use with
os.fdopen()to get a file object. - Crucially: It does not delete the file when closed. You are responsible for deleting it with
os.remove().
import tempfile
import os
# Returns a file descriptor and the name
fd, path = tempfile.mkstemp(prefix="manual_", suffix=".txt")
print(f"File descriptor: {fd}")
print(f"File path: {path}")
# You must open the file descriptor to use it
with os.fdopen(fd, 'w') as f:
f.write("This file was created with mkstemp.")
print(f"File exists after writing? {os.path.exists(path)}")
# The 'with' block for fdopen is closed, but the FILE STILL EXISTS on disk.
print(f"File exists after fdopen closes? {os.path.exists(path)}")
# YOU MUST DELETE IT MANUALLY
os.remove(path)
print(f"File exists after manual removal? {os.path.exists(path)}")
mkdtemp(): Creates a Temporary Directory (Manual)
- Important: It only returns the path to the directory.
- Crucially: It does not delete the directory. You are responsible for deleting it and all its contents with
shutil.rmtree().
import tempfile
import os
import shutil
# Returns only the path to the directory
tmp_dir = tempfile.mkdtemp(prefix="manual_dir_")
print(f"Temporary directory created at: {tmp_dir}")
print(f"Directory exists? {os.path.exists(tmp_dir)}")
# Create a file inside
with open(os.path.join(tmp_dir, "test.txt"), 'w') as f:
f.write("test")
# YOU MUST DELETE IT MANUALLY
shutil.rmtree(tmp_dir)
print(f"Directory exists after manual removal? {os.path.exists(tmp_dir)}")
Summary Table
| Function | Name Generation | Auto-Cleanup? | Best For |
|---|---|---|---|
NamedTemporaryFile() |
Yes (unique, in system temp dir) | Yes (on close) | The standard, safest way to handle temporary files. |
TemporaryDirectory() |
Yes (unique, in system temp dir) | Yes (on exit) | The standard, safest way to handle temporary folders. |
mkstemp() |
Yes (unique, in system temp dir) | No (manual os.remove() needed) |
When you need low-level file descriptor control and will manage cleanup yourself. |
mkdtemp() |
Yes (unique, in system temp dir) | No (manual shutil.rmtree() needed) |
When you need a temporary directory and will manage cleanup yourself. |
Key Takeaway
For 99% of use cases, use NamedTemporaryFile or TemporaryDirectory inside a with statement. This is the Pythonic, safe, and reliable way to handle temporary resources. The module handles the messy details of naming and cleanup for you.

