【问题标题】:How to create directories and sub directories efficiently and elegantly in Python 2.7?Python 2.7 如何高效优雅地创建目录和子目录?
【发布时间】:2015-08-30 11:19:22
【问题描述】:

我正在尝试在我的 PC 中的特定位置创建一堆目录和子目录。我的流程是这样的:

  1. 检查是否有同名目录。如果是,请跳过。
  2. 如果没有,则在该目录下创建目录和预定义的子目录。

这是我使用os 模块编写的代码:

def Test():
    main_dir = ["FolderA", "FolderB"] 
    common_dir = ["SubFolder1", "SubFolder2", "SubFolder3"]

    for dir1 in main_dir:
        if not os.path.isdir(dir1):
            for dir2 in common_dir:
                os.makedirs("%s/%s" %(dir1,dir2))

我想知道是否有更好的方法来完成同样的任务(可能更短、更高效且更 Python 化)?

【问题讨论】:

    标签: python python-2.7 directory directory-structure python-os


    【解决方案1】:

    Python 遵循哲学

    请求宽恕比请求许可更好。

    因此,与其检查isdir,您只需捕获叶目录已存在时引发的异常:

    def Test():
        main_dir = ["FolderA", "FolderB"] 
        common_dir = ["SubFolder1", "SubFolder2", "SubFolder3"]
    
        for dir1 in main_dir:
            for dir2 in common_dir:
                try: os.makedirs(os.path.join(dir1,dir2))
                except OSError: pass
    

    您还可以将字符串插值"%s/%s" %(dir1,dir2) 替换为os.path.join(dir1, dir2)

    另一种更简洁的方法是做笛卡尔积,而不是使用两个嵌套的 for 循环:

    for dir1, dir2 in itertools.product(main_dir, common_dir):
        try: os.makedirs(os.path.join(dir1,dir2))
        except OSError: pass
    

    【讨论】:

    • 这将以相同的方式处理现有目录和创建目录的失败尝试(例如缺少权限)。您应该检查error.errno == 17(17 表示该目录已存在),如果不存在则重新抛出异常。
    【解决方案2】:

    怎么样:

    import os
    from itertools import starmap
    
    def Test():
        main_dir = ["FolderA", "FolderB"] 
        common_dir = ["SubFolder1", "SubFolder2", "SubFolder3"]
    
        map(os.makedirs, starmap(os.path.join, zip(main_dir, common_dir)))
    

    如果我们担心os.makedirs() 抛出错误:

    import os
    from itertools import starmap
    
    def safe_makedirs(*args):
        try:
            return os.makedirs(*args)
        except:
            pass  # Ignore errors; for example if the paths already exist!
    
    def Test():
        main_dir = ["FolderA", "FolderB"] 
        common_dir = ["SubFolder1", "SubFolder2", "SubFolder3"]
    
        map(safe_makedirs, starmap(os.path.join, zip(main_dir, common_dir)))
    

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 2013-04-30
      相关资源
      最近更新 更多