Of course! In Python, the "config dir" refers to a standard, user-specific directory where applications should store their configuration files. This is different from storing files in the same directory as your script, which is bad practice.

The key to finding this directory is the pathlib module, specifically the Path.home() method combined with platform-specific conventions.
The Short and Modern Answer (Python 3.5+)
The best and most modern way is to use the pathlib module. It's cross-platform, readable, and object-oriented.
from pathlib import Path
# Get the user's home directory (~)
home_dir = Path.home()
# Define the config directory for your app
# The standard is to use a hidden folder (starting with a dot) named after your app.
config_dir = home_dir / ".my_app_name"
print(f"Configuration directory: {config_dir}")
# It's good practice to ensure the directory exists
# This will create the directory if it doesn't, and do nothing if it does.
config_dir.mkdir(exist_ok=True, parents=True)
# Now you can use it to store a config file
config_file = config_dir / "settings.ini"
# Example of writing to the config file
with open(config_file, "w") as f:
f.write("[settings]\n")
f.write("theme = dark\n")
f.write("api_key = 12345\n")
print(f"Config file created at: {config_file}")
Breakdown of the pathlib Solution
from pathlib import Path: Imports thePathclass, which is the modern way to handle filesystem paths.Path.home(): This is the most important part. It automatically returns the correct home directory path for the current user, regardless of the operating system.- On Linux/macOS:
/home/usernameor/Users/username - On Windows:
C:\Users\username
- On Linux/macOS:
home_dir / ".my_app_name": The operator is overloaded forPathobjects. It's a clean way to join path components. It creates a new path object for the.my_app_namedirectory inside the user's home directory.config_dir.mkdir(exist_ok=True, parents=True): This is a robust way to create the directory.mkdir(): Creates the directory.exist_ok=True: Prevents an error if the directory already exists.parents=True: If your config path has subdirectories (e.g.,~/.config/my_app/), this will create all necessary parent directories.
Platform-Specific Paths
While ~/.my_app_name is common and simple, some platforms have more specific conventions. Here's how to implement them.
Linux & macOS: $XDG_CONFIG_HOME
The XDG Base Directory Specification is the standard on Linux. It suggests using the $XDG_CONFIG_HOME environment variable, defaulting to ~/.config.

import os
from pathlib import Path
# Get the XDG_CONFIG_HOME environment variable, or default to ~/.config
xdg_config_home = os.environ.get("XDG_CONFIG_HOME", "~/.config")
config_dir = Path(xdg_config_home).expanduser() / "my_app_name"
print(f"XDG-style config directory: {config_dir}")
# Create the directory if it doesn't exist
config_dir.mkdir(exist_ok=True, parents=True)
Windows: %APPDATA%
On Windows, the standard is to use the APPDATA environment variable, which typically points to C:\Users\<username>\AppData\Roaming.
import os
from pathlib import Path
# Get the APPDATA environment variable
appdata_dir = os.environ.get("APPDATA")
if appdata_dir:
config_dir = Path(appdata_dir) / "MyCompanyName" / "MyAppName"
else:
# Fallback to home directory if APPDATA is not set
config_dir = Path.home() / "AppData" / "Roaming" / "MyAppName"
print(f"Windows-style config directory: {config_dir}")
# Create the directory if it doesn't exist
config_dir.mkdir(exist_ok=True, parents=True)
The Easiest and Most Robust Solution: platformdirs
Manually handling all these platform differences is tedious and error-prone. The recommended approach is to use the third-party library platformdirs. It's the de-facto standard for this task and is used by major projects like Poetry, Pydantic, and Black.
Step 1: Install the library
pip install platformdirs
Step 2: Use it in your code
platformdirs provides a clean, unified API for all common directories.
from platformdirs import user_config_dir, user_data_dir, user_cache_dir, user_log_dir
# --- Configuration Directory ---
# This is the best place for settings files, configs, etc.
config_dir = user_config_dir("my_app_name", appauthor="MyCompanyName", ensure_exists=True)
print(f"Config Dir: {config_dir}")
# --- Data Directory ---
# For user-specific data files, like saved games, databases, etc.
data_dir = user_data_dir("my_app_name", appauthor="MyCompanyName", ensure_exists=True)
print(f"Data Dir: {data_dir}")
# --- Cache Directory ---
# For temporary files that can be deleted without issues.
cache_dir = user_cache_dir("my_app_name", appauthor="MyCompanyName", ensure_exists=True)
print(f"Cache Dir: {cache_dir}")
# --- Log Directory ---
# For log files.
log_dir = user_log_dir("my_app_name", appauthor="MyCompanyName", ensure_exists=True)
print(f"Log Dir: {log_dir}")
Why platformdirs is the best choice:

- Cross-Platform: It automatically chooses the correct path for Linux, macOS, and Windows.
- Standard-Compliant: It follows XDG on Linux and Microsoft guidelines on Windows.
- Handles
appauthor: On Windows, it correctly separates per-user and per-machine apps using theappauthorparameter. ensure_exists=True: A convenient flag to create the directory for you.- Separation of Concerns: It gives you separate, standard locations for configs, data, cache, and logs, which is a best practice.
Summary: Which One Should You Use?
| Method | When to Use | Pros | Cons |
|---|---|---|---|
pathlib (Simple) |
For small scripts, personal projects, or when you don't care about strict platform standards. | Built-in, simple, readable. | Not fully compliant with platform standards (e.g., doesn't use XDG_CONFIG_HOME or %APPDATA%). |
platformdirs |
Recommended for almost all applications. Especially for libraries, tools, and applications you intend to share. | The gold standard. Cross-platform, standard-compliant, robust, and handles edge cases. | Requires installing an external dependency (pip install platformdirs). |
