4

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

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

是否有任何简单的方法可以创建所有这些文件夹而无需手动操作?

4

5 回答 5

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(). 只有前者会构建完整路径中的所有中间子目录。

于 2010-07-01T15:00:38.327 回答
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

于 2010-07-01T15:02:04.563 回答
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))

那应该为你处理它......

于 2010-07-01T15:02:20.330 回答
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
于 2010-07-01T14:55:42.533 回答
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;-)。

于 2010-07-01T15:06:12.497 回答