簡體   English   中英

在python中創建/創建目錄(復雜)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM