我正在尝试创建一堆可以将文件复制到的目录/子目录。我正在使用Python,我似乎无法找到一个很好的方法来做到这一点。我有一条主要的道路,我将分支。然后,我有权重和No_Weights。男女关注。在每个男性和女性文件夹中,我有每个种族(高加索人,非裔美国人,亚洲人,西班牙人,印度人,其他人,未知)。在每个文件夹中,我的年龄范围从20以下,一直到70+(B20,20,30,40,50,60,70)。
我试图生成所有路径,所以我只需要调用mkdir大约50次,但这大约是150行代码(差不多)。
有没有简单的方法来创建所有这些文件夹而无需手动完成?
答案 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
卡住的时间;-)。