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

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


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


一、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() 用法

  • 作者:幸运 lucky

    物联沃分享整理
    物联沃-IOTWORD物联网 » 一文理解 Python 编程语言中的 os.makedirs() 方法

    发表回复