[python] 아래 디렉토리를 파지 않고 os.walk

os.walk내가 제공 한 디렉토리의 파일 만 반환하도록 제한 하려면 어떻게합니까 ?

def _dir_list(self, dir_name, whitelist):
    outputList = []
    for root, dirs, files in os.walk(dir_name):
        for f in files:
            if os.path.splitext(f)[1] in whitelist:
                outputList.append(os.path.join(root, f))
            else:
                self._email_to_("ignore")
    return outputList



답변

walklevel기능을 사용하십시오 .

import os

def walklevel(some_dir, level=1):
    some_dir = some_dir.rstrip(os.path.sep)
    assert os.path.isdir(some_dir)
    num_sep = some_dir.count(os.path.sep)
    for root, dirs, files in os.walk(some_dir):
        yield root, dirs, files
        num_sep_this = root.count(os.path.sep)
        if num_sep + level <= num_sep_this:
            del dirs[:]

처럼 작동 os.walk하지만 level재귀의 깊이를 나타내는 매개 변수를 전달할 수 있습니다 .


답변

os.walk를 사용하지 마십시오.

예:

import os

root = "C:\\"
for item in os.listdir(root):
    if os.path.isfile(os.path.join(root, item)):
        print item


답변

해결책은 실제로 매우 간단하다고 생각합니다.

사용하다

break

for 루프의 첫 번째 반복 만 수행하려면 더 우아한 방법이 있어야합니다.

for root, dirs, files in os.walk(dir_name):
    for f in files:
        ...
        ...
    break
...

os.walk를 처음 호출하면 현재 디렉토리에 대한 튤립을 반환 한 다음 다음 디렉토리의 내용을 루프합니다.

원본 스크립트를 가져 와서 휴식을 추가하십시오 .

def _dir_list(self, dir_name, whitelist):
    outputList = []
    for root, dirs, files in os.walk(dir_name):
        for f in files:
            if os.path.splitext(f)[1] in whitelist:
                outputList.append(os.path.join(root, f))
            else:
                self._email_to_("ignore")
        break
    return outputList


답변

사용 제안 listdir은 좋은 것입니다. Python 2에서 귀하의 질문에 대한 직접적인 대답은 root, dirs, files = os.walk(dir_name).next().

동등한 Python 3 구문은 다음과 같습니다. root, dirs, files = next(os.walk(dir_name))


답변

os.listdir()주어진 디렉토리에서 이름 목록 (파일과 디렉토리 모두)을 반환하는 것을 사용할 수 있습니다 . 파일과 디렉토리를 구별해야하는 경우 os.stat()각 이름을 호출하십시오 .


답변

최상위 디렉토리보다 더 복잡한 요구 사항이있는 경우 (예 : VCS 디렉토리 무시 등) 디렉토리 목록을 수정하여 os.walk가 반복되지 않도록 할 수도 있습니다.

즉 :

def _dir_list(self, dir_name, whitelist):
    outputList = []
    for root, dirs, files in os.walk(dir_name):
        dirs[:] = [d for d in dirs if is_good(d)]
        for f in files:
            do_stuff()

참고-목록을 리 바인드하는 것보다 변경하는 데주의하십시오. 분명히 os.walk는 외부 리 바인딩에 대해 알지 못합니다.


답변

for path, dirs, files in os.walk('.'):
    print path, dirs, files
    del dirs[:] # go only one level deep