본문 바로가기
Python

[Python] glob 모듈을 사용하여 파일 탐색하기

by 까리한 새우 2025. 1. 20.
반응형

'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)

 

[결과]

 

 

 

반응형