3

我正在尝试在我的 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))

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

4

2 回答 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

您还可以将字符串插值替换"%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
于 2015-06-15T04:01:31.333 回答
4

怎么样:

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)))
于 2015-06-15T04:02:39.837 回答