Of course! Let's dive deep into os.makedirs. This is a fundamental function in Python for working with the file system.

What is os.makedirs?
os.makedirs() is a function from Python's built-in os module. Its primary purpose is to create a directory, and if necessary, all parent directories leading up to it, in a single operation.
Think of it like this: if you want to create a file at /home/user/documents/projects/report.txt, but the projects directory doesn't exist, os.makedirs() can create the projects directory for you automatically.
Basic Syntax
import os os.makedirs(name, mode=0o777, exist_ok=False)
Let's break down the parameters:
-
name(required): The path to the directory you want to create. This can be a string representing either:
(图片来源网络,侵删)- An absolute path (e.g.,
/home/user/new_dir). - A relative path (e.g.,
./new_dirordata/images).
- An absolute path (e.g.,
-
mode(optional): The permissions for the newly created directory. It's specified as an octal number (e.g.,0o755).- Important Note: On Windows, the
modeargument is largely ignored. The permissions are set based on the current process'sumaskand the permissions of the parent directory. On Unix-like systems (Linux, macOS), it's more influential. - The default is
0o777, which is very permissive (read, write, execute for owner, group, and others). In practice, the final permissions aremode & ~umask.
- Important Note: On Windows, the
-
exist_ok(optional): This is a boolean with a default value ofFalse.- If
False(the default), the function will raise aFileExistsErrorif the directory (or a file with the same name) already exists. - If
True, the function will do nothing if the directory already exist. This is the most common way to use it to prevent errors.
- If
Simple Examples
Example 1: Creating a Single Directory
This is the most basic use case. It's similar to os.mkdir() but with the benefit of exist_ok.
import os
# Define the directory path
new_dir = 'my_new_folder'
try:
# Create the directory
os.makedirs(new_dir)
print(f"Directory '{new_dir}' created successfully.")
except FileExistsError:
print(f"Directory '{new_dir}' already exists.")
except OSError as e:
print(f"Error creating directory: {e}")
# Check if it exists
print(f"Does '{new_dir}' exist? {os.path.exists(new_dir)}")
Example 2: Creating a Nested Directory (The Main Use Case)
This is where os.makedirs truly shines. Let's create a whole directory structure.

import os
# Define a nested path
nested_path = 'data/2025/reports'
try:
# makedirs will create 'data', then 'data/2025', then 'data/2025/reports'
os.makedirs(nested_path)
print(f"Nested directory '{nested_path}' created successfully.")
except FileExistsError:
print(f"Directory '{nested_path}' already exists.")
except OSError as e:
print(f"Error creating directory: {e}")
# Let's check the structure
print("\nCurrent directory contents:")
for root, dirs, files in os.walk('.'):
level = root.replace('.', '').count(os.sep)
indent = ' ' * 2 * level
print(f"{indent}{os.path.basename(root)}/")
subindent = ' ' * 2 * (level + 1)
for file in files:
print(f"{subindent}{file}")
Example 3: Using exist_ok=True (Best Practice)
In most real-world scenarios, you don't want your script to crash if the directory already exists. Using exist_ok=True is the cleanest way to handle this.
import os
# This path might already exist from the previous example
path_to_create = 'data/2025/reports'
print(f"Attempting to create '{path_to_create}'...")
os.makedirs(path_to_create, exist_ok=True)
# If the directory already exists, this line will be printed instead of an error.
# If it didn't exist, it will be created.
print(f"Directory '{path_to_create}' is ready.")
os.makedirs vs. os.mkdir
This is a very common point of confusion. Here’s a simple comparison:
| Feature | os.mkdir() |
os.makedirs() |
|---|---|---|
| Purpose | Create a single directory. | Create a directory and all parent directories if they don't exist. |
| Parent Handling | Fails with FileNotFoundError if the parent directory does not exist. |
Automatically creates parent directories as needed. |
| Analogy | mkdir my_dir |
mkdir -p my/nested/dir (the -p flag is the key) |
| Use Case | When you are certain the parent directory already exists. | When you need to create a potentially deep directory structure. |
Code Comparison
import os
# --- os.mkdir() ---
try:
# This will FAIL if 'data' does not exist
os.mkdir('data/2025/reports')
except FileNotFoundError:
print("os.mkdir() failed because the parent directory 'data' does not exist.")
# --- os.makedirs() ---
try:
# This will SUCCEED, creating 'data', 'data/2025', and 'data/2025/reports'
os.makedirs('data/2025/reports', exist_ok=True)
print("os.makedirs() succeeded in creating the full path.")
except OSError as e:
print(f"An error occurred: {e}")
Common Pitfalls and Best Practices
-
Race Conditions: The
exist_ok=Trueparameter helps, but a race condition is still possible. Imagine two processes trying to create the same directory at the exact same millisecond. TheFileExistsErrorwas designed to prevent this, but it's a subtle point. For most applications,exist_ok=Trueis perfectly safe and sufficient. -
Path Separators ( vs
\): A major advantage ofosandpathlibis that they handle path separators for you. You can use forward slashes () even on Windows, and Python will convert them correctly. This makes your code more portable. -
The Modern Alternative:
pathlibFor modern Python (3.4+), thepathlibmodule is often recommended as it provides an object-oriented approach to filesystem paths.pathlibequivalent ofos.makedirs:from pathlib import Path # Create a Path object path = Path('data/2025/reports') # Use the .mkdir() method with parents=True and exist_ok=True path.mkdir(parents=True, exist_ok=True) print(f"Directory '{path}' created using pathlib.")As you can see,
pathlib's syntax is very expressive and often considered more readable. The parametersparents=Trueandexist_ok=Truedirectly map to the functionality ofos.makedirs.
Summary
| Function | When to Use It |
|---|---|
os.makedirs() |
The classic, standard library way to create one or more directories in a path. It's robust, built-in, and perfectly fine for any Python script. |
pathlib.Path.mkdir() |
The more modern, object-oriented approach. It's generally preferred for new code as it's often more readable and integrates well with other path manipulations. |
For most purposes, you can't go wrong with either, but understanding both is key to being a proficient Python programmer. os.makedirs remains a core and essential function.
