'glob' 모듈은 파일 시스템 내에서 특정 패턴에 매칭되는 파일 경로들을 찾을 수 있도록 도와주는 파이썬 표준 라이브러리이다.
glob.glob(pattern, recursive=False)
glob 의 사용법 및 정의는 다음과 같습니다.
- pattern : 파일 경로 패턴을 지정합니다. (예, *txt, *.py, data/*.csv) 등
- recursive : True 로 설정하면 하위 디렉터리까지 탐색할 수 있습니다.
glob 함수의 결과값으로는 매칭되는 파일(또는 디렉토리0 경로들의 리스트를 반환합니다.
glob은 간단하게 'import glob' 으로 사용할 수 있습니다.
import glob
# 현재 디렉토리의 source 디렉토리 하위의 존재하는 모든 .png 파일 목록을 가져온다.
png_list = glob.glob("./source/*.png")
print(png_list)
[결과]
파일 패턴 사용 예시
glob.glob() 함수를 사용할 때, '*' 와 '?' 같은 와일드카드를 사용하여 파일 패턴을 활용할 수 있습니다.
와일드카드 문자를 사용하여 복잡한 패턴도 매칭할 수 있는것이죠.
- * : 모든 문자열(0글자 이상)
- ? : 정확히 한글자
- [...] : 대괄호 안에 들어있는 문자 중 하나
- ** : 디렉토리 트리(폴더 하위구조)를 재귀적으로 탐색(recursive=True 필요)
import glob
# 1) 확장자가 txt인 모든 파일 찾기
png_list = glob.glob("./source/*.png")
print(png_list)
print()
# 2) 이름에 "il" 이 들어가는 모든 파일 찾기
il_list = glob.glob("./source/*il*")
print(il_list)
print()
# 3) 하나의 글자를 제외한 패턴 (예, file1.txt, file2.txt)
file_list = glob.glob("./source/file?.txt")
print(file_list)
print()
# 4) 하위 디렉터리까지 탐색
all_png_list = glob.glob("./source/**/*.png", recursive=True)
print(all_png_list)
print()
# 5) 파일 이름이 a, b, 혹은 c 중 하나로 시작하고 .txt로 끝나는 파일 찾기
abc_list = glob.glob("./source/[abc]*.txt")
print(abc_list)
==============================================================================
# 실행결과1
['./source/file19.png', './source/file6.png', './source/file10.png', './source/file11.png']
# 실행결과2
['./source/file2.txt', './source/file8.py', './source/file1.txt', './source/file5.txt', './source/file7.txt', './source/file21.txt', './source/file19.png', './source/file12.py', './source/file13.py', './source/file3.py', './source/file17.py', './source/file6.png', './source/file10.png', './source/file4.py', './source/file18.dll', './source/file11.png', './source/file9.txt', './source/file16.bin', './source/file14.txt', './source/file15.txt']
# 실행결과3
['./source/file2.txt', './source/file1.txt', './source/file5.txt', './source/file7.txt', './source/file9.txt']
# 실행결과4
['./source/file19.png', './source/file6.png', './source/file10.png', './source/file11.png', './source/sub1/file24.png', './source/sub1/file28.png', './source/sub2/file31.png', './source/sub2/file32.png']
# 실행결과5
['./source/banana.txt', './source/apple.txt', './source/cat.txt']
보통 언제 사용할까?
glob 모듈은 주로 다음과 같은 상황에 사용이 됩니다.
예시 코드는 GPTo1 모델이 작성해준 코드로 직접 확인해보지 않아 코드에 에러가 존재할 수 있습니다.
1. 특정 파일 확장자에 대해 일괄 처리할 때
하위 디렉터리 아래에 존재하는 .png 파일을 모두 찾아 .jpg 변환하는 코드입니다.
import glob
from PIL import Image # Pillow 패키지 필요
# images/ 폴더 하위의 모든 .png 파일 찾기
png_files = glob.glob('images/**/*.png', recursive=True)
for png_file in png_files:
# 파일을 열고 jpg로 변환
with Image.open(png_file) as img:
# .png -> .jpg 파일명 변경
jpg_file = png_file.replace('.png', '.jpg')
img.convert('RGB').save(jpg_file, 'JPEG')
print(f"Converted: {png_file} -> {jpg_file}")
'images/' 하위에 존재하는 모든 .png 파일을 찾은 후 Pillow 라이브러리(PIL)를 사용하여 이미지를 열고 저장 형식을 바꾸는 코드입니다.
2. 대량의 로그 파일이나 이미지 파일을 정리할 때
서버 로그 파일이 'logs/' 디렉토리에 'server1_20250120.log', 'server2_20250120.log' 형태로 쌓일 때, 원하는 날짜의 로그만 골라서 통계 작업을 할 수도 있습니다.
import glob
# 2025년 01월 20일자 로그 파일만 찾기
log_pattern = 'logs/*_20250120.log'
logs = glob.glob(log_pattern)
error_count = 0
for log_file in logs:
with open(log_file, 'r') as f:
for line in f:
if 'ERROR' in line:
error_count += 1
print(f"2025-01-20 총 에러 발생 횟수: {error_count}")
위 예시는 날짜 별로 분리된 로그를 처리하거나, 특정 문자열(ERROR)이 포함된 라인을 세는 단순 스크립트 형태로 응용이 가능합니다.
3. 재귀적으로 하위 디렉토리를 탐색해야 할 때
위에서 glob 사용법에 자주 사용되었으므로 간단한 예시만 보여드리고 넘어가겠습니다.
import glob
# 프로젝트 폴더 내의 모든 파이썬 파일(.py) 리스트 얻기
python_files = glob.glob('**/*.py', recursive=True)
print("=== 발견된 .py 파일 목록 ===")
for file_path in python_files:
print(file_path)
4. 간단한 스크립트 자동화
....넘어가겠습니다.
좀 더 효율적인 방법은?
glob 모듈을 사용함으로써 복잡한 디렉토리 구조에서도 손쉽게 파일을 검색할 수 있다는 장점이 있습니다.
또한, 다양한 패턴 매칭 옵션을 사용하여 필요한 파일만 선택적으로 로드할 수 있으며, 플랫폼 독립적이기 때문에 다양한 운영체제에서 일관된 방식으로 작동하여, 코드의 이식성을 높여준다는 장점이 존재합니다.
하지만, 큰 디렉토리나 많은 파일이 있는 경우, 모든 파일 목록을 메모리에 한 번에 로드하기 때문에 성능 저하가 존재할 수 있습니다.
또한, 반환된 파일 리스트가 파일 시스템에 따라 다른 순서로 정렬될 수 있다는 단점이 존재합니다.
대규모 파일 시스템에서 glob.glob 의 단점을 보완할 수 있는 더 효율적인 파일 검색 방법이 여러가지 존재하고 있습니다.
해당 글은 glob 의 사용법을 설명하고 있는 글이기 때문에 이 부분은 아주 간단하게만 살펴보고 마치겠습니다.
1. os.walk
os.walk 는 디렉토리 트리를 순회하면서 파일과 폴더 목록을 Generator 형태로 반환합니다.
이는 대규모 파일 시스템에서 메모리 사용량을 줄이는 데 도움이 됩니다.
[Python] os 모듈 사용방법 - 파이썬을 사용하여 파일을 생성하고 읽고 써보자
os 모듈은 OS에 의존하는 다양한 기능을 제공하는 모듈입니다.os 모듈을 사용하여 파일이나 디렉토리를 조작할 수 있으며, 파일의 목록이나 path 를 얻거나 새로운 파일 혹은 디렉토리를 작성하는
developshrimp.com
2. scandir 사용
파이썬 3.5 이상에서는 os.scandir() 함수를 사용할 수 있으며, os.walk 보다 더 효율적으로 디렉터리 내의 항목을 순회합니다. scandir 은 각 항목에 대한 메타데이터 접근을 최적화하여 성능을 향상시킵니다.
import os
with os.scandir("./source/") as entries:
for e in entries:
if e.is_file() and e.name.endswith(".png"):
print(e.path)
[결과]
3. pathlib 모듈 사용
파이썬 3.4 이상에서는 pathlib 모듈이 도입되었으며 해당 모듈은 파일 시스템 경로를 객체 지향적으로 쉽게 다룰 수 있게 해줍니다.
from pathlib import Path
path = Path("./source/")
for file_path in path.rglob("*.png"):
print(file_path)
[결과]
'Python' 카테고리의 다른 글
[Python] 파이썬으로 JSON 데이터를 다루는 방법 (0) | 2025.01.29 |
---|---|
[Python] 일급 함수 정의와 특징 (0) | 2025.01.25 |
[Python] Namedtuple 사용방법 (1) | 2025.01.22 |
[Python] os 모듈 사용방법 - 파이썬을 사용하여 파일을 생성하고 읽고 써보자 (0) | 2025.01.19 |
[Python] map() filter() reduce() 사용법 정리 (0) | 2025.01.17 |