一文理解 Python 编程语言中的 os.makedirs() 方法

CSDN 叶庭云https://yetingyun.blog.csdn.net/


本博客将为您详细介绍 Python 中的 os.makedirs(folder_name, exist_ok=True) 方法的基本使用和进阶使用方式,力求解释得既详尽又易于理解。

一文理解 Python 编程语言中的 os.makedirs() 方法_第1张图片


一、os.makedirs() 方法概述

1. os 模块简介

在 Python 中,os 模块提供了一系列与操作系统交互的功能,例如文件和目录的操作。要使用这些功能,首先需要导入 os 模块:

import os

2. os.makedirs() 方法的作用

os.makedirs() 方法用于递归地创建目录,即能一次性创建多级目录,无需逐级创建。


二、基本使用方式

1. 语法

os.makedirs(name, mode=0o777, exist_ok=False)
  • name:必要参数,要创建的目标目录路径,字符串类型,可以是相对路径或绝对路径。
  • mode:可选参数,设置目录权限,默认是 0o777(八进制表示)。
  • exist_ok:可选参数,布尔值。若为 False,当目标目录已存在时会抛出异常;若为 True则不会抛出异常

注意:

  • 请注意,mkdir 命令只能创建一个目录,无法递归创建目录。例如,在尝试创建 ./two/three 目录时,必须确保 ./two 目录已存在,否则会出现错误。另外,如果目标目录已经存在,mkdir 命令也会创建失败。
  • makedirs 可以递归的创建目录,例如目录 ./two/three,即使没有 ./two 目录,也可以创建成功。如果希望目录存在的时候也不报错,设置参数 exist_ok=True

2. 示例

示例 1:创建单级目录
import os

os.makedirs('my_folder')

这将在当前工作目录下创建一个名为 my_folder 的文件夹。

示例 2:创建多级目录
import os

os.makedirs('parent_folder/child_folder/grandchild_folder')

这将递归地创建三个目录:parent_folderchild_folder 以及 grandchild_folder

示例 3:使用 exist_ok=True
import os

os.makedirs('my_folder', exist_ok=True)

如果 my_folder 已经存在,程序将会继续执行而不会抛出异常。然而,如果不设置 exist_ok=True,则会触发 FileExistsError 异常。


三、参数详解

1. exist_ok 参数

  • 默认值False
  • 作用:控制在目标目录已存在时的行为。
    • False:目录已存在时抛出 FileExistsError 异常。
    • True:目录已存在时不抛出异常,程序继续执行。
示例
import os

# 目录已存在,抛出异常。
os.makedirs('existing_folder')  # FileExistsError

# 目录已存在,不抛出异常。
os.makedirs('existing_folder', exist_ok=True)  # 正常执行

2. mode 参数

  • 默认值0o777
  • 作用:设置新创建目录的权限。
  • 注意:在某些操作系统(如 Windows)上,mode 参数可能会被忽略。

在 Linux 系统中,文件和目录的权限通过数字表示。这一数字系统基于三种基本权限:读(4)、写(2)和执行(1)。这些权限分配给三种用户类别:拥有者、群组和其他人。表示文件或目录权限时,我们使用三个数字,每个数字代表一种用户类别的权限。第一个数字代表拥有者的权限,第二个代表群组的权限,第三个代表其他人的权限。

每个数字通过将对应权限值相加得到。例如,若文件的拥有者可以读和写但不能执行,则权限数字为 4+2=6。若群组成员只能读,则权限数字为 4。若其他人无任何权限,则权限数字为 0。若文件权限设置为 “764”,意味着拥有者有读、写和执行权限(共 7),群组成员有读和写权限(共 6),其他人只有读权限(4)。默认情况下,新创建的文件或目录通常被赋予 “777” 权限,即所有人都可以读、写和执行。但出于安全考虑,通常会根据需要调整权限,限制对文件和目录的访问。

示例
import os

# 创建一个目录并将其权限设置为 764
os.makedirs('my_secure_folder', mode=0o764)

四、进阶使用方式

1. 创建目录前检查是否存在

虽然可以使用 exist_ok=True,但有时候,我们仍需要明确检查某个目录是否存在。

import os

if not os.path.exists('my_folder'):
    os.makedirs('my_folder')

2. 捕获异常处理错误

在创建目录的过程中,您可能会遇到诸如权限不足或指定路径错误等问题。建议使用 try...except 来捕获异常。

import os

try:
    os.makedirs('my_folder')
except FileExistsError:
    print('目录已存在')
except PermissionError:
    print('权限不足,无法创建目录')
except Exception as e:
    print(f'发生未知错误:{e}')

3. 与 os.path 配合使用

使用 os.path.join() 方法可以确保文件路径在不同的操作系统下都能正确解析,从而提高代码的可移植性和兼容性。

import os

folder_path = os.path.join('parent_folder', 'child_folder')
os.makedirs(folder_path, exist_ok=True)

4. 递归创建目录并设置不同权限

若需为每个创建的目录设定不同的权限,可采取分步骤的方式逐一进行设置。这样能够确保每个目录根据其具体需求获得恰当的安全配置。

import os

parent_folder = 'parent_folder'
child_folder = os.path.join(parent_folder, 'child_folder')

os.makedirs(parent_folder, mode=0o755, exist_ok=True)
os.makedirs(child_folder, mode=0o700, exist_ok=True)

5. 创建临时目录

使用 tempfile 模块可以创建临时目录,适用于需要临时存储文件的场景。

import tempfile

with tempfile.TemporaryDirectory() as temp_dir:
    print(f'临时目录路径:{temp_dir}')
    # 在这里进行操作

# 离开 `with` 块后,临时目录将被自动删除。

五、常见问题解答

1. os.makedirs()os.mkdir() 的区别

  • os.mkdir():只能创建单级目录,如果其父目录不存在,则会引发异常。
  • os.makedirs()可以递归创建多级目录,父目录不存在也不会出错

2. 如何处理权限不足的问题

当您没有足够的权限在指定位置创建目录时,系统会抛出 PermissionError 异常。为了解决这一问题,您可以采取以下措施:

  • 验证当前用户账户是否拥有在目标路径创建文件夹的权限。
  • 调整程序的执行权限,或选择一个当前用户有足够权限的其他目录来执行创建操作。

3. 在多线程或多进程环境下的注意事项

同时多个线程或进程创建同一目录可能会导致竞态条件。使用 exist_ok=True 可以减少异常的发生


六、实战练习

练习 1:创建一个多级目录,并在其中创建一个文件

import os

# 定义目录和文件路径:
folder_path = os.path.join('data', 'images', '2023')
file_path = os.path.join(folder_path, 'picture.jpg')

# 创建多级目录:
os.makedirs(folder_path, exist_ok=True)

# 创建一个空文件:
with open(file_path, 'w') as f:
    f.write('这是一个示例文件')

练习 2:安全地创建目录,避免异常中断程序

import os

def safe_mkdir(path):
    try:
        os.makedirs(path, exist_ok=True)
        print(f'成功创建目录:{path}')
    except Exception as e:
        print(f'创建目录失败:{e}')

safe_mkdir('logs/2023/11')

七、总结

  • os.makedirs() 方法是创建多级目录的强大工具。
  • 使用 exist_ok=True 参数,可以防止因目录已存在而引发的异常。
  • 结合 os.path 模块,可以编写出更加健壮且跨平台的代码。
  • 处理潜在的异常情况,能够提升程序的稳定性。

希望通过以上详尽的解释和示例,您能深入理解并熟练运用 os.makedirs() 方法!


相关链接:

  • Python 官方文档 - os.makedirs(name, mode=0o777, exist_ok=False)

  • Python3 os.makedirs() 和 os.mkdir() 用法

你可能感兴趣的:(心流,Python,编程语言,文件和目录操作,os,makedirs)