programing

glob.glob 모듈을 사용하여 하위 폴더를 검색하려면 어떻게 해야 합니까?

bestprogram 2023. 7. 16. 13:44

glob.glob 모듈을 사용하여 하위 폴더를 검색하려면 어떻게 해야 합니까?

폴더에서 일련의 하위 폴더를 열고 텍스트 파일을 찾아 텍스트 파일의 줄을 인쇄합니다.사용 중:

configfiles = glob.glob('C:/Users/sam/Desktop/file1/*.txt')

그러나 하위 폴더에도 액세스할 수 없습니다.동일한 명령을 사용하여 하위 폴더에도 액세스할 수 있는 방법을 아는 사람이 있습니까?

3 Python 3.5를 합니다.**/기능:

configfiles = glob.glob('C:/Users/sam/Desktop/file1/**/*.txt', recursive=True)

recursive 설됨정,**경로 구분 기호 뒤에 0개 이상의 하위 디렉터리가 일치합니다.

의 파이썬에서 파이썬은glob.glob()하위 디렉터리의 파일을 재귀적으로 나열할 수 없습니다.

그런 경우에는 다음과 결합하여 사용합니다.

import os
import fnmatch

path = 'C:/Users/sam/Desktop/file1'

configfiles = [os.path.join(dirpath, f)
    for dirpath, dirnames, files in os.walk(path)
    for f in fnmatch.filter(files, '*.txt')]

디렉터리가 하는 디토리를렉 재 적 절 경 이 일 을 반 합 환 로 니 다 치 름 로 대 모 든 귀 이 으 로 동 고 하 names 니 ▁this ▁all 다 ▁to ▁path 합 반 ▁return.txt파일입니다. 이 특정한 경우에는.fnmatch.filter()과잉 살상일 수도 있고, 당신은 또한 사용할 수 있습니다..endswith()테스트:

import os

path = 'C:/Users/sam/Desktop/file1'

configfiles = [os.path.join(dirpath, f)
    for dirpath, dirnames, files in os.walk(path)
    for f in files if f.endswith('.txt')]

이 주제에 대해서는 많은 혼란이 있습니다.명확하게 설명할 수 있는지 알아보겠습니다(Python 3.7).

  1. glob.glob('*.txt') :합니다.
  2. glob.glob('*/*.txt') :
  3. glob.glob('**/*.txt') :즉시 하위 디렉터리에서만 '.txt'로 끝나는 모든 파일과 일치하지만 현재 디렉터리에서는 일치하지 않습니다.
  4. glob.glob('*.txt',recursive=True) :
  5. glob.glob('*/*.txt',recursive=True) :33파운드와
  6. glob.glob('**/*.txt',recursive=True):및합니다.

따라서 항상 지정하는 것이 가장 좋습니다.recursive=True.

즉시 하위 디렉터리에서 파일 찾기

configfiles = glob.glob(r'C:\Users\sam\Desktop\*\*.txt')

디렉터리를 에는 모하든위디를통재는버귀경전다의우수사있다습니용할음을과리하렉을 사용할 수 .**그리고 패스recursive=True Python 3.5 이후:

configfiles = glob.glob(r'C:\Users\sam\Desktop\**\*.txt', recursive=True)

두 함수 모두 리턴 리스트를 호출합니다.사용할 수 있습니다.glob.iglob()길을 하나씩 되돌리는 것.또는 다음을 사용합니다.

from pathlib import Path

path = Path(r'C:\Users\sam\Desktop')
txt_files_only_subdirs = path.glob('*/*.txt')
txt_files_all_recursively = path.rglob('*.txt') # including the current dir

두 방법 모두 반복기를 반환합니다(경로를 하나씩 가져올 수 있음).

glob2 패키지는 와일드카드를 지원하며 상당히 빠릅니다.

code = '''
import glob2
glob2.glob("files/*/**")
'''
timeit.timeit(code, number=1)

내 노트북에서 60,000개 이상의 파일 경로를 일치시키는 데 약 2초가 걸립니다.

Python 2.6에서 Formic을 사용할 수 있습니다.

import formic
fileset = formic.FileSet(include="**/*.txt", directory="C:/Users/sam/Desktop/")

공개 - 이 패키지의 작성자입니다.

다음은 다음과 같은 기능을 지원하는 개조된 버전입니다.glob.glob ▁using▁function▁without를 사용하지 않고 기능을 glob2.

def find_files(directory, pattern='*'):
    if not os.path.exists(directory):
        raise ValueError("Directory not found {}".format(directory))

    matches = []
    for root, dirnames, filenames in os.walk(directory):
        for filename in filenames:
            full_path = os.path.join(root, filename)
            if fnmatch.filter([full_path], pattern):
                matches.append(os.path.join(root, filename))
    return matches

그래서 만약 당신이 다음과 같은 dir 구조를 가지고 있다면.

tests/files
├── a0
│   ├── a0.txt
│   ├── a0.yaml
│   └── b0
│       ├── b0.yaml
│       └── b00.yaml
└── a1

당신은 이런 것을 할 수 있습니다.

files = utils.find_files('tests/files','**/b0/b*.yaml')
> ['tests/files/a0/b0/b0.yaml', 'tests/files/a0/b0/b00.yaml']

다 됐어요.fnmatch전체 파일 이름에서 패턴이 일치합니다. 파일 이름만 일치하는 것이 아닙니다.

(첫 번째 옵션은 물론 다른 답변에 언급되어 있습니다. 여기서 목표는 글로벌을 보여주는 것입니다.os.scandir내부적으로, 그리고 이것으로 직접적인 대답을 제공합니다.)


글로벌 사용

앞에서 설명한 것처럼 Python 3.5+를 사용하면 다음과 같이 쉽습니다.

import glob
for f in glob.glob('d:/temp/**/*', recursive=True):
    print(f)

#d:\temp\New folder
#d:\temp\New Text Document - Copy.txt
#d:\temp\New folder\New Text Document - Copy.txt
#d:\temp\New folder\New Text Document.txt

pathlib 사용

from pathlib import Path
for f in Path('d:/temp').glob('**/*'):
    print(f)

os.scandir 사용

os.scandir무엇입니까glob내부적으로 합니다.그래서 다음과 같은 방법을 사용하여 직접 수행합니다.yield:

def listpath(path):
    for f in os.scandir(path):
        f2 = os.path.join(path, f)
        if os.path.isdir(f):
            yield f2
            yield from listpath(f2)
        else:
            yield f2

for f in listpath('d:\\temp'):
    print(f)

configfiles = glob.glob('C:/Users/sam/Desktop/**/*.txt")

모든 경우에 효과가 있는 것은 아닙니다. 대신 glob2를 사용하십시오.

configfiles = glob2.glob('C:/Users/sam/Desktop/**/*.txt")

glob2 패키지를 설치할 수 있다면...

import glob2
filenames = glob2.glob("C:\\top_directory\\**\\*.ext")  # Where ext is a specific file extension
folders = glob2.glob("C:\\top_directory\\**\\")

모든 파일 이름 및 폴더:

all_ff = glob2.glob("C:\\top_directory\\**\\**")  

Python 3.4+를 실행하고 있다면 모듈을 사용할 수 있습니다.이 메서드는 다음을 지원합니다.**패턴은 "이 디렉터리와 모든 하위 디렉터리, 재귀적으로"를 의미합니다.일치하는 모든 파일에 대해 개체를 생성하는 생성기를 반환합니다.

from pathlib import Path
configfiles = Path("C:/Users/sam/Desktop/file1/").glob("**/*.txt")

기능을 사용할 수 있습니다.glob.glob()또는glob.iglob()glob 모듈에서 직접 디렉터리/파일 및 하위 디렉터리/하위 파일 내부에서 경로를 재귀적으로 검색합니다.

구문:

glob.glob(pathname, *, recursive=False) # pathname = '/path/to/the/directory' or subdirectory
glob.iglob(pathname, *, recursive=False)

예제에서는 다음과 같이 쓸 수 있습니다.


import glob
import os

configfiles = [f for f in glob.glob("C:/Users/sam/Desktop/*.txt")]

for f in configfiles:
    print(f'Filename with path: {f}')
    print(f'Only filename: {os.path.basename(f)}')
    print(f'Filename without extensions: {os.path.splitext(os.path.basename(f))[0]}')

출력:

Filename with path: C:/Users/sam/Desktop/test_file.txt
Only filename: test_file.txt
Filename without extensions: test_file

도움말: 설명서os.path.splitext 관련 문서os.path.basename.

마르틴이 지적했듯이, 글로벌은 오직 이것을 통해서만 할 수 있습니다.**연산자는 Python 3.5에 도입되었습니다.OP가 명시적으로 글로벌 모듈을 요청했으므로 다음은 유사하게 동작하는 게으른 평가 반복기를 반환합니다.

import os, glob, itertools

configfiles = itertools.chain.from_iterable(glob.iglob(os.path.join(root,'*.txt'))
                         for root, dirs, files in os.walk('C:/Users/sam/Desktop/file1/'))

한 번만 반복할 수 있습니다.configfiles하지만 이 접근법에서는.여러 작업에 사용할 수 있는 구성 파일의 실제 목록이 필요한 경우 다음을 사용하여 명시적으로 생성해야 합니다.list(configfiles).

rglob디렉터리 구조의 가장 깊은 하위 수준에서 무한 재귀를 수행합니다.그러나 한 단계만 깊이를 원하는 경우에는 사용하지 마십시오.

저는 OP가 glob.glob을 사용하는 것에 대해 이야기하고 있었다는 것을 깨달았습니다.그러나 모든 하위 폴더를 재귀적으로 검색하려는 의도에 대한 답변이라고 생각합니다.

rglobfunction은 최근 데이터 읽기 순서에 대한 고정된 가정으로 폴더 구조를 사용하는 데이터 처리 알고리즘의 속도를 100배 향상시켰습니다., 만지와 함께, 께함과 함께rglob우리는 지정된 상위 디렉토리 또는 그 아래에 있는 모든 파일을 한 번 검색하고, 목록(100만 개 이상의 파일)에 이름을 저장한 다음, 해당 목록을 사용하여 파일 이름 지정 규칙과 폴더 이름만 비교하여 나중에 열 필요가 있는 파일을 결정할 수 있었습니다.

언급URL : https://stackoverflow.com/questions/14798220/how-can-i-search-sub-folders-using-glob-glob-module