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

在python中创建/制作目录(复杂),python,directory,mkdir,Python,Directory,Mkdir,我正在尝试创建一组可以将文件复制到其中的目录/子目录。我正在使用Python,但似乎找不到一个好方法来实现这一点。我有一条主要的道路,我将从中分出。然后,我有重量,没有重量。男女跟随。在每个男性和女性文件夹中,我有每个种族(白种人、非裔美国人、亚裔、西班牙裔、印度裔、其他人、未知)。在每个文件夹中,我的年龄从20岁以下一直到70岁以上(B20、20、30、40、50、60、70) 我已经尝试生成所有路径,所以我只需要调用mkdir大约50次,但这大约是150行代码(几乎) 有没有简单的方法来创建

我正在尝试创建一组可以将文件复制到其中的目录/子目录。我正在使用Python,但似乎找不到一个好方法来实现这一点。我有一条主要的道路,我将从中分出。然后,我有重量,没有重量。男女跟随。在每个男性和女性文件夹中,我有每个种族(白种人、非裔美国人、亚裔、西班牙裔、印度裔、其他人、未知)。在每个文件夹中,我的年龄从20岁以下一直到70岁以上(B20、20、30、40、50、60、70)

我已经尝试生成所有路径,所以我只需要调用mkdir大约50次,但这大约是150行代码(几乎)


有没有简单的方法来创建所有这些文件夹而不必手工操作

有几个嵌套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))
Edit:dir\u util在这里可能有一些用处,因此您不必使每个子目录:

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


编辑:需要
os.makedirs()
,而不是
os.mkdir()
。只有前者将在完整路径中构造所有中间子目录。

此示例应该让您开始:

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模块是您的朋友:

就这样做:

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))
这应该会为您解决问题…

会有所帮助--它会生成所有中间目录,一直到您指定的“叶”目录

另一个问题(生成所有“一个来自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

可以替换上述所有代码(!)。我认为“以混合基数计数”的低抽象级别方法也值得注意,因为它在很多情况下都很有用(包括使用Python版本时遇到的问题)。

您使用的是什么平台?Python版本?我正在用Python 2.6在Mac上工作…(是的,我知道我仍然在使用Python 2.6,只是因为这个版本和3之间有了重大的变化)这是一个好主意…我从未使用过itertools,但它工作起来很有魅力,当然它很快!谢谢
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))
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
for p in itertools.product(*choices):
    os.makedirs(os.path.join(p))