Introduction
When working on file system operations, a common requirement is to create directories at specified paths. This includes not only creating the target directory but also ensuring that all necessary parent directories exist. While many scripting languages have built-in commands for this (like Bash’s mkdir -p
), Python provides several ways to achieve similar functionality across different versions of the language.
This tutorial covers how to recursively create directories and their parent paths in Python, focusing on methods suitable for various Python versions from 2.x up to the latest releases. We’ll explore using the built-in os
module as well as the modern pathlib
module introduced in Python 3.5.
Using os.makedirs()
The os.makedirs()
function is a powerful utility for creating directories recursively, making it possible to create parent directories along with the target directory. Here’s how you can use it:
Basic Usage
import os
path = "/my/directory"
os.makedirs(path)
This code will create /my
and then /my/directory
. If any of these directories already exist, an OSError
is raised.
Handling Existing Directories
To avoid exceptions when a directory already exists, use the exist_ok
parameter introduced in Python 3.2:
import os
path = "/my/existing/directory"
os.makedirs(path, exist_ok=True)
This method simplifies error handling by not raising an exception if the directory already exists.
Handling Race Conditions
For versions before Python 3.2 or when exist_ok
is not used, you can handle exceptions to avoid race conditions:
import os
import errno
def make_sure_path_exists(path):
try:
os.makedirs(path)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
This approach attempts to create the directory and only raises an error for issues other than EEXIST
, which indicates the directory already exists.
Using pathlib.Path.mkdir()
The pathlib
module, introduced in Python 3.5, offers an object-oriented approach to handling filesystem paths and includes a convenient method for creating directories:
Basic Usage
from pathlib import Path
directory = Path("/my/directory")
directory.mkdir(parents=True, exist_ok=True)
The parents
parameter ensures that all intermediate directories are created, while exist_ok
prevents exceptions if the directory already exists.
Backporting for Older Python Versions
If you need to use this approach in older versions of Python (before 3.5), consider using a backported version called pathlib2
, which is actively maintained:
from pathlib2 import Path
directory = Path("/my/directory")
directory.mkdir(parents=True, exist_ok=True)
Additional Considerations
Directory vs File Checking
When checking if a path exists before attempting to create it, prefer using os.path.isdir()
over os.path.exists()
. This ensures that you’re specifically dealing with directories rather than files:
import os
if not os.path.isdir(path):
os.makedirs(path)
Alternative Libraries
While the above methods are generally preferred for modern Python versions, you may encounter older scripts using deprecated libraries like distutils.dir_util.mkpath
. However, these should be avoided due to deprecation and limitations.
Best Practices
- Use
exist_ok=True
where possible to handle existing directories gracefully. - Check directory existence with
os.path.isdir()
to avoid confusion between files and directories. - Consider using
pathlib
for a more modern, object-oriented approach in Python 3.5+.
By following these guidelines and utilizing the methods described above, you can efficiently manage directory creation tasks within your Python applications across various versions of the language.