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).
glob.glob('*.txt') :
합니다.glob.glob('*/*.txt') :
와glob.glob('**/*.txt') :
즉시 하위 디렉터리에서만 '.txt'로 끝나는 모든 파일과 일치하지만 현재 디렉터리에서는 일치하지 않습니다.glob.glob('*.txt',recursive=True) :
와glob.glob('*/*.txt',recursive=True) :
33파운드와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을 사용하는 것에 대해 이야기하고 있었다는 것을 깨달았습니다.그러나 모든 하위 폴더를 재귀적으로 검색하려는 의도에 대한 답변이라고 생각합니다.
그rglob
function은 최근 데이터 읽기 순서에 대한 고정된 가정으로 폴더 구조를 사용하는 데이터 처리 알고리즘의 속도를 100배 향상시켰습니다., 만지와 함께, 께함과 함께rglob
우리는 지정된 상위 디렉토리 또는 그 아래에 있는 모든 파일을 한 번 검색하고, 목록(100만 개 이상의 파일)에 이름을 저장한 다음, 해당 목록을 사용하여 파일 이름 지정 규칙과 폴더 이름만 비교하여 나중에 열 필요가 있는 파일을 결정할 수 있었습니다.
언급URL : https://stackoverflow.com/questions/14798220/how-can-i-search-sub-folders-using-glob-glob-module
'programing' 카테고리의 다른 글
파이썬에서 모든 크기의 빈 목록을 얻으려면 어떻게 해야 합니까? (0) | 2023.07.16 |
---|---|
텍스트를 어떻게 문장으로 나눌 수 있습니까? (0) | 2023.07.16 |
좌측 앵커와 선행 앵커의 차이점은 무엇입니까? (0) | 2023.07.16 |
N:M 관계에 대해 MongoDB에서 계단식 삭제를 권장하는 것은 무엇입니까? (0) | 2023.07.16 |
Python/NumPy 목록에서 Nan을 제거하는 방법 (0) | 2023.07.16 |