在python中创建/创建目录(复杂)

时间:2010-07-01 14:51:07

标签: python directory mkdir

我正在尝试创建一堆可以将文件复制到的目录/子目录。我正在使用Python,我似乎无法找到一个很好的方法来做到这一点。我有一条主要的道路,我将分支。然后,我有权重和No_Weights。男女关注。在每个男性和女性文件夹中,我有每个种族(高加索人,非裔美国人,亚洲人,西班牙人,印度人,其他人,未知)。在每个文件夹中,我的年龄范围从20以下,一直到70+(B20,20,30,40,50,60,70)。

我试图生成所有路径,所以我只需要调用mkdir大约50次,但这大约是150行代码(差不多)。

有没有简单的方法来创建所有这些文件夹而无需手动完成?

5 个答案:

答案 0 :(得分:18)

import itertools
import os

dirs = [["Weights", "No_Weights"],
        ["Male", "Female"],
        ["Caucasian", "African-American", "Asian", "Hispanic", "Indo", "Other", "Unknown"], 
        ["B20", "20", "30", "40", "50", "60", "70"]]

for item in itertools.product(*dirs):
    os.makedirs(os.path.join(*item))

itertools.product()将构建所有可能的路径变体,然后os.path.join()将使用您平台的正确语法将子路径连接在一起。

编辑:os.makedirs()代替os.mkdir()。只有前者才能在完整路径中构建所有中间子目录。

答案 1 :(得分:3)

这个例子应该让你开始:

import itertools
import os.path

ROOT = r'C:\base\path'

sex = ('male', 'female')
ethnicity = ('Caucasian', 'African-American', 'Asian')
ages = ('B20', '20', '30')

for path in itertools.product(sex, ethnicity, ages):
    print os.path.join(ROOT, *path)

itertools模块是你的朋友: http://docs.python.org/library/itertools.html#itertools.product

答案 2 :(得分:2)

做这样的事情:

main = 'somedir'
weight = ['weights', 'No_weights']
ethnicity = ['Caucasian', #the rest]
ages = ['B20'] +  range(20, 71, 10)

for w in weights:
    os.mkdir(os.path.join(main, w)
    for e in ethnicity:
        os.mkdir(os.path.join(main, w, e))
        for a in ages:
            os.mkdir(os.path.join(main, w, e, a))

那应该照顾你......

答案 3 :(得分:0)

有一些嵌套的for循环,然后是每个os.mkdir。使用os.path.join将目录路径连接在一起。

类似的东西:

loop weights
    mkdir weight
    loop sexes
        mkdir weights + sex
        loop ethnicities
            mkdir weights + sex + ethnicity
            loop ages
                mkdir weights + sex + ethnicity + age

这里循环只是一个正常的for循环:

for weight in ('weights', 'no_weights'):

mkdir是os.mkdir

'+'是os.path.join:

os.mkdir(os.path.join(weights, sex, ethnicity, age))

编辑:dir_util可能在这里有用,所以你不必创建每个子目录:

http://docs.python.org/release/2.5.2/dist/module-distutils.dirutil.html

loop weights
    loop sexes
        loop ethnicities
            loop ages
                mkpath weights + sex + ethnicity + age

答案 4 :(得分:0)

os.makedirs可以提供帮助 - 它使所有中间目录一直到您指定的“叶子”。

另一个问题(生成所有“A列中的一个,B列中的一个,......”组合)最好接近“混合基数计数”的问题 - 粗略地说,s /类似于...... :

choices = [ ['Weights', 'Noweights'],
            ['Male', 'Female'],
            ['Caucasian', 'AfricanAmerican', ...
            ...
          ]
Ls = [len(x) for x in choices]
ct = [0] * len(Ls)

while True:
    p = [c[i] for i, c in zip(ct, choices)]
    os.makedirs(os.path.join(p))
    n = -1
    while n > -len(Ls):
      ct[n] += 1
      if ct[n] < Ls[n]: break
      ct[n] = 0
      n -= 1
    else:
      break

itertools.product是一种现代而简洁的方法,用于生成所有“A列等等”选项,以及我在制作软件中提出的建议 - 只是:

for p in itertools.product(*choices):
    os.makedirs(os.path.join(p))

可以替换以上所有代码(!)。我认为值得注意的是“计算混合基础”的低抽象级方法,因为它在许多情况下都很方便(包括使用Python版本< 2.6卡住的时间;-)。