프로그램을 개발하다 보면 파일 시스템에 있는 파일 목록을 순회해야 하는 경우가 자주 발생하며, 특히 이름이 특정 패턴과 일치하는 파일들을 다뤄야 할 때가 많습니다. 파이썬의 glob 모듈은 특정 디렉터리 안의 파일 목록을 만들거나, 특정 확장자를 가진 파일을 찾거나, 파일 이름에 특정 문자열이 포함된 파일을 검색할 때 매우 유용하게 사용됩니다.
glob 모듈의 함수들이 사용하는 패턴 매칭 방식은 유닉스(UNIX) 경로 확장 규칙을 따릅니다. 다만 이 모듈은 물결표(~)나 셸 변수는 확장하지 않는다는 점에 유의해야 합니다.
glob 모듈에는 크게 세 가지 핵심 함수가 있습니다.
1. glob() – 패턴에 일치하는 파일 리스트 반환
glob() 함수는 pathname 매개변수에 지정한 패턴과 일치하는 파일들의 리스트를 반환합니다. 경로는 절대 경로와 상대 경로 모두 사용할 수 있으며, *나 ? 같은 와일드카드 문자를 포함할 수도 있습니다.
recursive 매개변수는 기본값이 False입니다. True로 설정하면 현재 디렉터리의 하위 디렉터리까지 재귀적으로 탐색하여 패턴과 일치하는 파일을 찾습니다.
다음 코드는 현재 디렉터리에서 확장자가 '.py'인 모든 파일을 출력합니다.
>>> import glob
>>> for file in glob.glob("*.py"):
print(file)
아래 코드처럼 recursive=True를 지정하고 ** 패턴을 사용하면, 하위 디렉터리에 있는 '.py' 파일들까지 모두 출력됩니다.
>>> for file in glob.glob("**/*.py", recursive=True):
print(file)패턴에는 ? 와일드카드 문자도 사용할 수 있습니다. 다음 문장은 이름이 세 글자이고 앞 두 글자가 'pp'인 파일 목록을 출력합니다.
>>> for file in glob.glob("pp?.py"):
print(file)다음 코드는 파일 이름이 숫자로 끝나는 파일들을 출력합니다.
>>> for file in glob.glob('*[0-9].py'):
print(file)다음 구문은 지정된 경로와 일치하는 모든 파일을 재귀적으로 탐색하여 반환합니다.
>>> glob.glob('**/*.py', recursive=True)현재 디렉터리 아래에 있는 디렉터리 이름들을 재귀적으로 출력하려면 다음과 같이 작성합니다.
>>> glob.glob('tcl/**/', recursive=True)2. iglob() – 제너레이터로 파일 하나씩 처리
iglob() 함수는 파일 리스트 대신 제너레이터(generator) 객체를 반환합니다. next() 함수를 사용하면 다음과 같이 파일 이름을 하나씩 순서대로 얻을 수 있으며, 파일 수가 매우 많을 때 메모리 효율성 면에서 유리합니다.
>>> it = glob.iglob('*.py')
>>> type(it)
<class 'generator'>
>>> while True:
try:
file = next(it)
print(file)
except StopIteration:
break3. escape() – 특수 문자 이스케이프 처리
escape() 함수는 주어진 문자를 이스케이프 처리합니다. 파일 이름에 [, ], (, ), # 같은 특수 문자가 포함되어 있어 와일드카드로 오해될 수 있는 경우에 유용합니다. 다음 예제는 chars 문자열에 있는 각 문자가 포함된 파일을 검색합니다.
>>> chars = '[]()#'
>>> for char in chars:
esc = '*' + glob.escape(char) + '.py'
for file in (glob.glob(esc)):
print(file)
xyz[.py
pp[].py
pp(.py
pp#.py
이처럼 glob 모듈을 활용하면 복잡한 파일 시스템 탐색 로직을 직접 구현하지 않고도, 간단한 패턴 문자열만으로 원하는 파일을 손쉽게 찾아 처리할 수 있습니다.