2010-07-01 2 views
3

파일을 복사 할 수있는 여러 디렉토리/하위 디렉토리를 만들려고합니다. 나는 파이썬으로 일하고 있는데, 이것을하기에 좋은 방법을 찾지 못하는 것 같다. 나는 내가 갈라지는 주요 길을 가지고있다. 그 다음엔 가중치와 가중치가 있습니다. 남성과 여성은 다음과 같습니다. 남성과 여성 폴더에는 각 민족 (백인, 아프리카 계 미국인, 아시아계, 히스패닉계, 인도인, 기타, 알 수 없음)이 있습니다. 각 폴더에는 연령대가 20 세 미만에서 70 세까지 (B20, 20, 30, 40, 50, 60, 70)까지 있습니다.파이썬에서 디렉토리 만들기/만들기 (복잡한)

모든 경로를 생성하려고 했으므로 mkdir은 약 50 번이지만 모두 약 150 줄의 코드 (거의)입니다.

손으로하지 않고 이러한 폴더를 모두 만들 수있는 간단한 방법이 있습니까?

+0

어떤 플랫폼을 사용하고 있습니까? 파이썬 버전? –

+0

잘 파이썬 2.6과 맥에서 일하고 있어요 ... (그래, 나는이 버전과 3 사이에 중요한 변화가 있었기 때문에 여전히 파이썬 2.6을 사용하고 있다는 것을 알고있다) – Brandon

답변

17
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.mkdir() 대신 os.makedirs()이 필요합니다. 전자는 모든 중간 하위 디렉토리를 전체 경로로 구성합니다. 이 예제는 시작할 수 있어야

+0

이것은 훌륭한 아이디어였다. 결코 itertools를 사용하지 않았지만 그것은 매력처럼 작동하며 물론 빠릅니다! 감사! – Brandon

0

중첩 된 for-loops가 있고 각각에 대해 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 

루프는 단지 정상에 대한 루프 :

'+'os.path.join입니다 os.mkdir

for weight in ('weights', 'no_weights'): 

MKDIR은 다음과 같습니다

os.mkdir(os.path.join(weights, sex, ethnicity, age)) 

편집 : dir_uti

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 
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

그냥 같은 것을 할 :

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)) 

와 그의주의를 기울여야한다 그것을 위해 ...

0

os.makedirs을 사용하면 모든 중간 디렉토리를 지정한 "리프"까지 만들 수 있습니다.

다른 문제 ("하나의 열 A, 하나의 열 B에서 ..."조합 생성)은 "혼합 기지에서 계산"의 문제로 가장 잘 접근합니다. ..

for p in itertools.product(*choices): 
    os.makedirs(os.path.join(p)) 

할 수 있습니다 : - 단지

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 열에서 하나, 등 등"픽,하고 내가 생산 소프트웨어 권합니다 생성하는 현대적이고 간결한 방식이다 위의 코드 (!)를 모두 바꾸십시오. 파이썬 릴리스 < 2.6 ;-)을 사용하여 붙어있는 경우를 포함하여 많은 경우에 편리하기 때문에 "혼합 기지 계산"낮은 추상화 수준 접근법을 인식하는 것도 가치가 있다고 생각합니다.