programing

os.아래의 디렉토리를 파고들지 않고 걸어갑니다.

lastmoon 2023. 9. 9. 10:06
반응형

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.walkzip해결책은 가 있을 입니다. 최선의 해결책은 아니지만, 효과도 있을 것입니다.

예를 들어 다음과 같습니다.

# 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

반응형