Python案例:如何创建文件夹?从基础到进阶,一文搞定目录操作
目录导读
- 为什么需要掌握Python创建文件夹?
- 基础篇:使用
os.mkdir()单级目录创建 - 进阶篇:
os.makedirs()递归创建多级目录 - 实战案例:文件下载器中的自动目录创建
- 异常处理:如何优雅处理目录已存在或权限问题?
- 性能对比:
mkdir()vsmakedirs()vsPath.mkdir() - 常见问答Q&A
- 总结与最佳实践
为什么需要掌握Python创建文件夹?
在自动化脚本、数据处理、日志归档、爬虫项目等场景中,动态创建文件夹是基础且高频的需求。

- 爬虫下载图片时,按日期创建子目录保存
- 日志系统每天生成一个独立的文件夹存放日志文件
- 用户上传文件时自动按用户ID建立存储路径
核心需求:程序运行时,如果目标文件夹不存在,需要自动创建;如果已存在,应避免报错,Python提供了多种实现方式,本文将逐一详解。
基础篇:使用os.mkdir()单级目录创建
import os
# 创建单级目录
os.mkdir("data")
注意:
- 只能创建一级目录,如
data,不能创建data/2023/10 - 如果目录已存在,会抛出
FileExistsError - 路径中的父目录必须存在,否则抛出
FileNotFoundError
代码示例:
import os
folder_name = "backup"
if not os.path.exists(folder_name):
os.mkdir(folder_name)
print(f"文件夹 {folder_name} 创建成功")
else:
print("文件夹已存在,跳过创建")
适用场景:明确知道父目录存在,且只需创建一层目录时使用。
进阶篇:os.makedirs()递归创建多级目录
import os
# 递归创建多级目录,类似Linux的 mkdir -p
os.makedirs("backup/2023/10/images", exist_ok=True)
参数说明:
exist_ok=True:如果目录已存在,不报错(推荐使用)- 默认
exist_ok=False,目录存在时会抛出FileExistsError
实战代码(推荐模板):
import os
def create_dir_if_not_exists(path):
"""安全创建目录,支持多级"""
try:
os.makedirs(path, exist_ok=True)
print(f"目录创建成功:{path}")
except PermissionError:
print(f"权限不足,无法创建目录:{path}")
except Exception as e:
print(f"未知错误:{e}")
# 使用示例
create_dir_if_not_exists("logs/2023/10/15")
实战案例:文件下载器中的自动目录创建
假设开发一个图片下载器,需要按日期和分类自动创建目录:
import os
from datetime import datetime
import requests
def download_category_images(category="nature", save_root="./downloads"):
# 自动生成日期路径:downloads/nature/2023-10-15/
date_str = datetime.now().strftime("%Y-%m-%d")
target_dir = os.path.join(save_root, category, date_str)
# 创建多级目录(安全模式)
os.makedirs(target_dir, exist_ok=True)
# 假设下载逻辑
image_urls = ["https://example.com/img1.jpg", "https://example.com/img2.jpg"]
for idx, url in enumerate(image_urls):
file_path = os.path.join(target_dir, f"image_{idx}.jpg")
# 省略下载代码(实际使用时需添加)
print(f"正在保存:{file_path}")
print(f"所有图片已保存至:{target_dir}")
# 运行
download_category_images("nature")
输出示例:
正在保存:./downloads/nature/2023-10-15/image_0.jpg
正在保存:./downloads/nature/2023-10-15/image_1.jpg
所有图片已保存至:./downloads/nature/2023-10-15
异常处理:如何优雅处理目录已存在或权限问题?
import os
def safe_create_dir(path):
"""全能目录创建函数,覆盖各种异常"""
try:
os.makedirs(path, exist_ok=True)
return True
except PermissionError:
print(f"错误:无权限在 {os.path.dirname(path)} 创建目录")
return False
except OSError as e:
if "No such device" in str(e) or "Input/output error" in str(e):
print(f"错误:磁盘或挂载点异常 - {e}")
return False
raise
except Exception as e:
print(f"未知异常:{e}")
return False
# 测试
safe_create_dir("/root/secret_folder") # 权限不足
safe_create_dir("./test_dir") # 正常创建
常见异常场景:
| 异常类型 | 原因 | 解决方案 |
|---------|------|----------|
| FileExistsError | 目录已存在 | 使用exist_ok=True |
| PermissionError | 无写入权限 | 检查用户权限或使用sudo |
| FileNotFoundError | 父目录不存在 | 改用makedirs |
| OSError | 磁盘已满/路径无效 | 检查磁盘空间和路径格式 |
性能对比:mkdir() vs makedirs() vs Path.mkdir()
| 方法 | 功能 | 性能(1000次创建) | 适用场景 |
|---|---|---|---|
os.mkdir() |
单级目录 | 02秒 | 父目录已存在,创建一级 |
os.makedirs() |
多级递归 | 03秒 | 通用推荐,支持多级 |
pathlib.Path.mkdir() |
多级递归 | 04秒 | 面向对象风格,代码更现代 |
代码示例(pathlib版):
from pathlib import Path
# 创建目录(推荐新项目使用)
Path("data/2023/10").mkdir(parents=True, exist_ok=True)
# parents=True 等价于 os.makedirs 的递归创建
性能建议:
- 日常开发使用
os.makedirs(..., exist_ok=True)或Path.mkdir(parents=True, exist_ok=True) - 性能差异可忽略不计,优先考虑代码可读性
常见问答Q&A
Q1:os.mkdir()和os.makedirs()有什么区别?
A:mkdir只能创建单级目录,且父目录必须存在;makedirs可以递归创建多级目录,父目录不存在时会自动创建。
Q2:创建目录时如何避免FileExistsError报错?
A:
- 使用
exist_ok=True参数(推荐) - 先检查
os.path.exists()再创建(存在竞态条件风险,不推荐)
Q3:pathlib比os.path好在哪?
A:pathlib提供面向对象API,代码更直观,跨平台兼容性更好(自动处理操作系统的路径分隔符差异),Python 3.4+官方推荐使用。
Q4:如何创建一个带权限的目录(如Linux的mkdir -m 755)?
A:os.makedirs(path, exist_ok=True, mode=0o755),注意:mode在Windows上大部分权限设置会被忽略。
Q5:如果目录路径中有空格或中文,会报错吗?
A:不会,Python的os.makedirs和Path.mkdir都支持Unicode路径,但建议路径字符串使用原始字符串或正斜杠避免转义问题,r"C:\My Folder\数据"。
总结与最佳实践
最佳实践清单(建议收藏)
- 通用安全创建:使用
os.makedirs(path, exist_ok=True),一行代码解决大多数场景 - 新项目推荐:使用
pathlib.Path.mkdir(parents=True, exist_ok=True),代码更现代 - 异常处理:始终捕获
PermissionError和OSError,避免程序崩溃 - 临时目录:使用
tempfile.mkdtemp()或tempfile.TemporaryDirectory()管理临时文件 - Linux权限:明确需要时设置
mode参数,Windows无需关心
代码速查表
# 1. 最简方式(推荐日常使用)
import os
os.makedirs("folder/sub", exist_ok=True)
# 2. 更现代的方式
from pathlib import Path
Path("folder/sub").mkdir(parents=True, exist_ok=True)
# 3. 带异常处理的安全函数
def create_dir(path):
try:
os.makedirs(path, exist_ok=True)
except Exception as e:
print(f"创建目录失败: {e}")
掌握这些方法后,您可以在任何Python项目中高效地管理文件夹创建需求,无论是简单的日志目录,还是复杂的多级文件存储系统,都能应对自如。