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