2017-11-09 15 views
0

디렉토리에 ".txt"확장명을 가진 모든 파일을 읽고이 파일에 쓰여진 숫자로 작업을 수행하는 프로그램이 있습니다. 이 프로그램은 다음과 같습니다.모든 하위 폴더에서 Python 프로그램을 반복적으로 실행

import glob 
    list_of_files = glob.glob("*.txt") 
    for filename in list_of_files: 
     p,j, x = open(filename, "r") 
     #do things 

예를 들어 폴더의 모든 파일을 모두 합칠 수 있습니다. 것은 동일한 구조를 가진 많은 폴더가 있고 그 각각의 동일한 프로그램을 실행할 필요가 있다는 것입니다. 이후 각 폴더에 python 프로그램을 붙여 넣기를 복사하고 실행하지 않으려 고 재귀 적으로 수행하는 방법을 찾고있었습니다.

내가 파이썬이 도울 수있는 라이브러리라는 OS가 있음을 발견했다 :

for root, dirs, files in os.walk(path): 
     for name in files: 
     #do things 

문제는 그 프로그램이 모든 폴더에 대해 한 번 수행되어 있는지 확인하는 방법을 알고, 내가 없다는 것입니다

for root, dirs in os.walk(path): 
     for files in dirs: 
      glob.glob("*.txt) 
      #do things 
+0

실제 재귀를 시도해 보셨습니까? – Eumel

+0

당신은 더 자세히 설명해 주시겠습니까? 이해가 안 됨 –

+0

모든 폴더에 공통 루트가 있습니까? – gionni

답변

0

: 나는 sperately 각 폴더의 모든 파일 작업을 할 필요 동안 잠재적으로, 한 번에 모든 하위 폴더의 모든 파일을 고려할 수있다 이런 식으로 일을 ... 다른 관점에서 내가 좋아하는 뭔가를해야한다는 두려움 나는 구문에 100 % 확실하지 않으므로 대신에 python 화 된 pse를 줄 것이다. 우드 코드. 폴더의 모든 레이어를 통과 할 때까지 찾은 모든 폴더에 대해 folder_parser를 호출합니다.

def folder_parser(dir): 
    if(dir): 
     for subdir in dir_list: 
      if(is_a_folder()): 
       folder_parser(subdir) 
      elif(is_a_text()): 
       do_your_text_thing() 
      else: continue 
    else: break 

는에 AlFe는 os.walk뿐만 아니라 작동 (아마도 더 많거나 적은 같은 것을 좀 더 빨리 큰 directorys에 대한 않습니다) 제안한다. 디렉토리와 하위 디렉토리에있는 3 개의 값, 경로, 포함 된 폴더 목록 및 al 폴더에 대한 포함 된 파일 목록이있는 생성자 객체를 반환합니다.

for things in os.walk(dir): 
    for files in things[2]: 
     if(is_a_text(files)): 
      do_your_text_thing(things[0]+files) 
+0

'os.walk()'을보세요. – Alfe

+0

if 문을 list_of_files = glob.glob ('*. txt') 또는 이미 갖고있는 프로그램 구조를 유지하기위한 것으로 대체 할 수 있습니까? –

+0

@FrancescoDiLauro 정확히 무엇을 대체하고 싶은지 확실하지 않지만 glob가 목록을 반환하기 때문에 if 문이 대체 할 항목이 아니기 때문입니다. 디렉토리의 파일이 텍스트 파일이나 폴더 일 뿐이라는 확신이 들면 os.walk 부분에서 if 문을 무시할 수 있습니다. – Eumel