파이썬(Python)의 내장 모듈인 glob을 이용하면 파일명의 패턴을 이용하여 특정 폴더와 그 하위에 있는 파일을 찾아낼 수 있다. 이번 포스팅에서는 glob 모듈을 이용하여 특정 패턴을 갖는 파일과 폴더를 탐색하는 방법에 대해서 알아보고자 한다.
glob 사용법
여기서는 많이 사용되는 조건을 바탕으로 glob 사용법을 알아본다.
1) 현재 디렉토리 내 폴더와 파일 확인하기
a. 현재 디렉토리에 있는 폴더만 확인 : **/, */
아래 코드는 현재 폴더 내 모든 폴더를 출력한다.
## 현재 폴더 내 모든 폴더
for folder_name in glob.glob('**/'): ## 또는 glob.glob(*/)
print(folder_name)
b. 현재 폴더 내 폴더와 파일까지 확인 : **, *
와일드카드 '*' 또는 '**'를 사용하면 현재 폴더의 폴더와 파일 모두 확인할 수 있다.
## 현재 폴더 내 모든 폴더와 파일
for f in glob.glob('**'): ## 또는 glob.glob(*)
print(f)
c. 현재 폴더의 파일만 탐색하기
참고로 현재 폴더의 파일만 탐색하고 싶다면 glob 자체만으로는 하기 어렵고 os.path.isfile 함수를 이용하면 쉽게 할 수 있다. glob을 이용하여 모든 폴더와 파일 리스트를 뽑은 다음 os.path.isfile을 이용하여 파일만 빼내면 된다.
## 현재 폴더의 파일만 갖고 오기
import os
all_folder = glob.glob('*') ## 또는 glob.glob('**')
all_file = [x for x in all_folder if os.path.isfile(x)]
for file_name in all_file:
print(file_name)
d. 하위 폴더에 있는 폴더와 파일 가져오기
아래 코드는 현재 폴더는 제외하고 현재 폴더의 모든 하위 폴더에 있는 폴더와 파일을 출력한다.
## 현재 폴더의 하위에 있는 폴더와 파일(현재 폴더는 포함 안됨)
for f in glob.glob('*/*'): ## 또는 **/**, **/*, */**
print(f)
이번엔 현재 폴더를 포함하여 하위 폴더의 폴더와 파일명을 모두 가져와 본다. 이때에 glob의 recursive=True로 설정한다. 만약 폴더와 파일이 많은 경우 성능 부하가 생길 수 있으니 조심하자. 아래 코드는 500개까지만 출력한다.
## 현재 폴더의 하위에 있는 폴더와 파일(현재 폴더는 포함)
for i, f in enumerate(glob.glob('**', recursive=True)):
print(f)
'**'와 '*'의 차이
와일드카드 '**'와 '*'은 원래는 차이가 없지만 glob에서 recursive=True인 경우에 차이가 난다. '*'는 recursive 탐색이 안되면 '**'은 recursive 탐색이 가능하다는 차이가 있다. 아래 코드는 recursive=True인 상황에서 '**'와 '*'의 동작 방식을 3가지로 나눈 것이다. 이에 대한 설명은 주석을 참고하자.
glob.glob('*/*', recursive=True) ## 현재 폴더의 하위 폴더들 속에 있는 폴더와 파일(현재 폴더 포함 X)
glob.glob('*/**', recursive=True) ## 현재 폴더의 모든 하위 폴더와 파일(현재 폴더 포함 X)
glob.glob('**', recursive=True) ## 현재 폴더와 모든 하위 폴더 그리고 파일(현재 폴더 포함 O) ** 대신 **/*을 해도 됨.
2) 특정 확장자 찾기
a. 특정 확장자 찾기
와일드 카드 '*'를 이용하여 test_folder 내에 있는 텍스트 파일을 검색한다.
## test_folder에 텍스트 파일(바로 아래 단계까지만 검색 된다.)
for file_name in glob.glob('test_folder/*.txt'):
print(file_name)
만약 test_folder 내 하위 폴더를 포함한 모든 텍스트 파일을 검색하고자 한다면 다음과 같이 한다.
## test_folder와 하위 폴더에 포함된 모든 텍스트 파일
for file_name in glob.glob('test_folder/**/*.txt', recursive=True):
print(file_name)
b. 둘 이상 확장자 찾기
만약 test_folder 속에 txt와 bmp 파일 모두 찾고자 한다면 아래와 같이 한다.
## test_folder와 하위 폴더에 포함된 모든 텍스트 파일
types = ['test_folder/*.txt', 'test_folder/*.bmp']
all_f = []
for t in types:
all_f.extend(glob.glob(t))
for file_name in all_f:
print(file_name)
3) 파일명 패턴으로 찾기
a. 특정 문자열로 시작하거나 끝나는 파일 찾기
특정 문자 뒤에 '*'을 붙이면 해당 문자로 시작하는 파일을 찾을 수 있다. 아래 코드는 test_folrder 내 test로 시작하는 텍스트 파일을 출력한다.
## test_folder에서 test로 시작하는 텍스트 파일 출력
start_str = 'test'
for f in glob.glob(f'test_folder/{start_str}*.txt'):
print(f)
반대로 특정 문자로 끝나는 파일을 찾고 싶다면 '*' 뒤에 해당 문자를 붙여주면 된다.
## test_folder에서 test로 끝나는 텍스트 파일 출력
end_str = 'test'
for f in glob.glob(f'test_folder/*{end_str}.txt'):
print(f)
b. 특정 문자열을 포함하는 파일 찾기
'*' 사이에 찾고자 하는 문자열을 넣어주면 해당 문자열을 포함하는 파일을 찾을 수 있다.
## test_folder에서 test를 포함하는 텍스트 파일 출력
target_str = 'test'
for f in glob.glob(f'test_folder/*{target_str}*.txt'):
print(f)
c. 파일명 문자 개수로 찾기
와일드카드 '?'는 문자 하나를 의미하므로 원하는 파일명의 문자 개수만큼 '?'을 붙여주면 원하는 파일을 찾을 수 있다.
## test_folder에서 문자가 6개인 파일명을 가진 텍스트 파일 출력
for f in glob.glob('test_folder/??????.txt'):
print(f)
'프로그래밍 > Python' 카테고리의 다른 글
파이썬(Python) 파일 압축 및 압축 풀기 (feat. zlib, gzip, zipfile, tarfile) (0) | 2023.05.06 |
---|---|
파이썬(Python) fnmatch를 이용한 폴더와 파일 탐색 (0) | 2023.04.24 |
파이썬(Python) 텍스트 파일 쉽게 수정하기 (feat. fileinput) (0) | 2023.04.19 |
파이썬(Python) 폴더와 파일 다루기 (feat. os, pathlib) (2) | 2023.04.14 |
파이썬(Python) statistics 모듈을 이용한 통계량 계산하기 (0) | 2023.03.25 |
댓글