2009-06-05 6 views

답변

7

체크 아웃 Python Recursive Directory Walker. 간단히 말해 os.listdir()과 os.walk()는 친구입니다. 다만이 결과를 얻기 위해 다른 경로로

os.getcwd() 

을 변경

import os 

for e in os.walk(os.getcwd()): 
    print e 

: 당신은 현재 디렉토리에 나열 할 경우

-1

는, 당신은 같은 것을 사용할 수 있습니다.

+0

이 답변은 OP 질문을 다루지 않으며 같은 대답을 찾고있는 대부분의 사람들에게 관련이 없습니다. – Andrew

59
import os 
import os.path 

for dirpath, dirnames, filenames in os.walk("."): 
    for filename in [f for f in filenames if f.endswith(".log")]: 
     print os.path.join(dirpath, filename) 
+1

"."과 다른 디렉토리에서 검색하려면 direcotry를 sys.argv [1]로 전달하고 os.walk (sys.argv [1])를 호출 할 수 있습니다. –

+2

추가 개선 사항 : list comprehension 대신 generator 사용 : filename in (f ... f의 경우) –

+1

특정 디렉토리 (예 :'old_logs ')를 제외하려면'dirnames'에서 제거하면됩니다. 'dirnames.remove ("old_logs")' – CGFoX

6

os.walk와 함께 glob 모듈을 사용할 수도 있습니다.

import os 
for logfile in os.popen('find . -type f -name *.log').read().split('\n')[0:-1]: 
     print logfile 

또는이 두

import subprocess 
(out, err) = subprocess.Popen(["find", ".", "-type", "f", "-name", "*.log"], stdout=subprocess.PIPE).communicate() 
for logfile in out.split('\n')[0:-1]: 
    print logfile 

find . -type f -name *.log의 장점을 가지고 :

import os 
from glob import glob 

files = [] 
start_dir = os.getcwd() 
pattern = "*.log" 

for dir,_,_ in os.walk(start_dir): 
    files.extend(glob(os.path.join(dir,pattern))) 
+0

for-loop에서 밑줄 문자는 무엇을합니까? '_' –

+1

@nueverest'os.walk'는 매 반복마다 3 개의 튜플 (dirpath, dirnames, filenames)를 반환하며'dirpath' (위의'dir '에 할당 됨)에만 관심이 있습니다. 밑줄은 우리가 관심이없는 다른 두 개의 값 (즉,'dirnames', 그리고'filenames', 변수'_'에 할당됩니다. 우리는 결코 사용하지 않을 것입니다)의 자리 표시 자로 사용됩니다. – tavnab

0

나는 해결책을 가지고 있습니다.

첫 번째는 간단하지만 -name *.log, 을 추가하지만, (내 OS X의 환경에서) 단순히 find ../testdata -type f 을 위해 잘 작동 할 때 공백에 대한 을 보장하지 않습니다.

두 번째 서브 프로세스를 사용하는 것이 더 복잡해 보이지만 이것은 공백으로 안전합니다 (내 OS X 환경에서).

는 크리스 무리,이 질문에 대해 에서 영감을 https://stackoverflow.com/a/3503909/2834102

관련 문제