如何在Python 2.7中高效而优雅地创建目录和子目录?

3

我正在尝试在我的电脑上的特定位置创建一堆目录和子目录。我的流程如下:

  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风格)?

2个回答

5

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

您也可以使用os.path.join(dir1, dir2)代替字符串插值"%s/%s" %(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 表示目录已经存在),如果不是,则重新抛出异常。 - Raniz

5
如何:
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)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接