os.아래의 디렉토리를 파고들지 않고 걸어갑니다.
제한하는 방법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
os.walk 사용하지 마세요.
예:
import os
root = "C:\\"
for item in os.listdir(root):
if os.path.isfile(os.path.join(root, item)):
print item
사용.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
재귀가 얼마나 깊이 들어가는지를 나타내는 매개변수.
해결책은 사실 매우 간단하다고 생각합니다.
사용하다
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
좋은 것입니다.파이썬 2에서 당신의 질문에 대한 직접적인 답은root, dirs, files = os.walk(dir_name).next()
.
동등한 파이썬 3 구문은root, dirs, files = next(os.walk(dir_name))
지정된 디렉토리에 있는 이름 목록(파일 및 디렉토리 모두에 대해)을 반환하는 을 사용할 수 있습니다.파일과 디렉토리를 구분해야 할 경우 다음을 호출합니다.os.stat()
각각의 이름을
최상위 디렉터리만 요구하는 것이 아니라 복잡한 요구 사항이 있는 경우(예: VCS dirs 무시 등), 디렉터리 목록을 수정하여 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
내 2펜스를 집어던지고 싶었습니다.
baselevel = len(rootdir.split(os.path.sep))
for subdirs, dirs, files in os.walk(rootdir):
curlevel = len(subdirs.split(os.path.sep))
if curlevel <= baselevel + 1:
[do stuff]
같은 생각으로listdir
, 이보다 짧습니다.
[f for f in os.listdir(root_dir) if os.path.isfile(os.path.join(root_dir, f))]
Python 3.5부터는 대신 사용할 수 있습니다. 문자열 대신 개체의 반복자를 얻을 수 있습니다.문서에서:
사용.
scandir()
대신에listdir()
파일 형식 또는 파일 속성 정보를 필요로 하는 코드의 성능을 크게 향상시킬 수 있습니다.DirEntry
객체들은 만약 운영체제가 디렉토리를 스캔할 때 그것을 제공한다면 이 정보를 노출합니다. 모두DirEntry
메소드는 시스템 호출을 수행할 수 있지만,is_dir()
그리고.is_file()
일반적으로 기호 링크에 대한 시스템 호출만 필요합니다.DirEntry.stat()
는 유닉스에서는 항상 시스템 호출이 필요하지만 윈도우에서는 심볼릭 링크에 대해서만 시스템 호출이 필요합니다.
다음을 통해 개체의 이름에 액세스할 수 있습니다.DirEntry.name
다음의 출력과 동일한 값입니다.os.listdir
다음을 수행할 수도 있습니다.
for path, subdirs, files in os.walk(dir_name):
for name in files:
if path == ".": #this will filter the files in the current directory
#code here
파이썬 3에서는 다음과 같은 작업을 수행할 수 있었습니다.
import os
dir = "/path/to/files/"
#List all files immediately under this folder:
print ( next( os.walk(dir) )[2] )
#List all folders immediately under this folder:
print ( next( os.walk(dir) )[1] )
루트 폴더는 os.walk 검색하는 모든 디렉토리에 대해 변경됩니다.루트 == 디렉토리가 있는지 확인하는 것을 해결합니다.
def _dir_list(self, dir_name, whitelist):
outputList = []
for root, dirs, files in os.walk(dir_name):
if root == dir_name: #This only meet parent folder
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
import os
def listFiles(self, dir_name):
names = []
for root, directory, files in os.walk(dir_name):
if root == dir_name:
for name in files:
names.append(name)
return names
이렇게 풀었어요.
if recursive:
items = os.walk(target_directory)
else:
items = [next(os.walk(target_directory))]
...
listdir를 사용할 때 단점이 있습니다.os.path.isdir(식별자)는 절대 경로여야 합니다.하위 디렉토리를 선택하려면 다음 작업을 수행합니다.
for dirname in os.listdir(rootdir):
if os.path.isdir(os.path.join(rootdir, dirname)):
print("I got a subdirectory: %s" % dirname)
다른 방법은 디렉터리로 변경하여 os.path.join() 없이 테스트를 수행하는 것입니다.
이 토막글을 사용할 수 있습니다.
for root, dirs, files in os.walk(directory):
if level > 0:
# do some stuff
else:
break
level-=1
제외 목록을 만들고 fnmatch를 사용하여 디렉토리 구조를 건너뛰고 프로세스를 수행합니다.
excludes= ['a\*\b', 'c\d\e']
for root, directories, files in os.walk('Start_Folder'):
if not any(fnmatch.fnmatch(nf_root, pattern) for pattern in excludes):
for root, directories, files in os.walk(nf_root):
....
do the process
....
다음과 같이 입력합니다.
if **any**(fnmatch.fnmatch(nf_root, pattern) for pattern in **includes**):
간단히 a를 사용하지 않는 이유는 무엇입니까?range
그리고.os.walk
와 zip
해결책은 가 있을 입니다. 최선의 해결책은 아니지만, 효과도 있을 것입니다.
예를 들어 다음과 같습니다.
# your part before
for count, (root, dirs, files) in zip(range(0, 1), os.walk(dir_name)):
# logic stuff
# your later part
파이썬 3에서도 통합니다.
A : Abreak
그건 그렇고 더 간단해요. (@Pieter의 대답을 보세요.)
알렉스의 대답에 약간의 변화가 있지만,__next__()
:
print(next(os.walk('d:/'))[2])
아니면print(os.walk('d:/').__next__()[2])
함께[2]
것file
인에root, dirs, file
됨 ㅜㅜㅜㅜ
이것은 좋은 비단뱀의 예입니다.
def walk_with_depth(root_path, depth):
if depth < 0:
for root, dirs, files in os.walk(root_path):
yield [root, dirs[:], files]
return
elif depth == 0:
return
base_depth = root_path.rstrip(os.path.sep).count(os.path.sep)
for root, dirs, files in os.walk(root_path):
yield [root, dirs[:], files]
cur_depth = root.count(os.path.sep)
if base_depth + depth <= cur_depth:
del dirs[:]
언급URL : https://stackoverflow.com/questions/229186/os-walk-without-digging-into-directories-below
'programing' 카테고리의 다른 글
이 버전의 응용 프로그램이 Google Play를 통한 과금을 위해 구성되지 않았습니다. (0) | 2023.09.09 |
---|---|
How do I assert the result is an integer in PHPUnit? (0) | 2023.09.09 |
PowerShell에서 2>&1의 의미 (0) | 2023.09.09 |
Angular2 구성요소 @입력 양방향 바인딩 (0) | 2023.09.09 |
Choosen 플러그인을 사용하여 선택 항목 (0) | 2023.09.09 |