[英]Creating/making directories in python (complex)
我正在嘗試創建一堆可以將文件復制到的目錄/子目錄。 我正在使用Python,我似乎無法找到一個很好的方法來做到這一點。 我有一條主要的道路,我將分支。 然后,我有權重和No_Weights。 男女關注。 在每個男性和女性文件夾中,我有每個種族(高加索人,非裔美國人,亞洲人,西班牙人,印度人,其他人,未知)。 在每個文件夾中,我的年齡范圍從20以下,一直到70+(B20,20,30,40,50,60,70)。
我試圖生成所有路徑,所以我只需要調用mkdir大約50次,但這大約是150行代碼(差不多)。
是否有任何簡單的方法來創建所有這些文件夾而無需手動完成?
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()
只有前者才能構建完整路徑中的所有中間子目錄。
這個例子應該讓你開始:
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
做這樣的事情:
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))
這應該照顧你...
有一些嵌套的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
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
;-)卡住的時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.