🔥알림🔥
① 테디노트 유튜브 - 구경하러 가기!
② LangChain 한국어 튜토리얼 바로가기 👀
③ 랭체인 노트 무료 전자책(wikidocs) 바로가기 🙌

2 분 소요

이번 포스팅에서는 Python의 glob.glob() 함수를 활용하여 파일 시스템 내의 특정 패턴을 가진 파일들을 쉽게 찾는 방법에 대해 소개하려고 합니다.

이 함수를 사용하면서 주로 활용되는 와일드카드 문자인 *?의 동작 방식을 자세히 알아보며, 이를 통해 파일 검색의 유연성을 어떻게 향상시킬 수 있는지 알아보겠습니다. 이러한 패턴 매칭 기법은 파일명뿐만 아니라 다양한 문자열 검색 작업에도 적용될 수 있어 Python에서의 파일 검색 작업을 효과적으로 수행하는 데 큰 도움이 됩니다.

🔥 와일드카드 문자열을 활용한 파일 패턴 검색

glob.glob()에서 사용하는 와일드카드 문자열은 파일 및 디렉터리 이름의 패턴을 지정하는 데 사용됩니다. 이 와일드카드 문자열을 사용하면 다양한 조건에 맞는 파일이나 디렉터리 목록을 쉽게 얻을 수 있습니다. 여기에는 다음과 같은 주요 와일드카드 문자들이 있습니다.

* ➡️ 0개 이상의 문자에 일치

(예시)

모든 .txt 파일 검색

  • 패턴: *.txt
  • 일치하는 파일: document.txt, notes.txt, chapter1.txt
import glob

# 모든 .txt 파일 검색
txt_files = glob.glob('*.txt')
print("*.txt:", txt_files)
# 예상 출력: *.txt: ['document.txt', 'notes.txt', 'chapter1.txt', 'file_1.txt', 'file_2.txt']

? ➡️ 하나의 문자에 일치

(예시)

file_ 다음에 한 문자와 .txt 확장자를 가진 파일 검색:

  • 패턴: file_?.txt
  • 일치하는 파일: file_1.txt, file_2.txt
  • 일치하지 않는 파일: file_12.txt, file_a.txt
import glob

# 'file_' 다음에 한 문자와 .txt 확장자를 가진 파일 검색
single_char_files = glob.glob('file_?.txt')
print("file_?.txt:", single_char_files)
# 예상 출력: file_?.txt: ['file_1.txt', 'file_2.txt']

[seq] ➡️ seq에 있는 어떤 문자와도 일치

예를 들어, [0123456789]모든 숫자 와 일치합니다.

(예시)

모든 숫자로 시작하는 .txt 파일 검색:

  • 패턴: [0-9]*.txt
  • 일치하는 파일: 1_notes.txt, 9_chapter.txt
  • 일치하지 않는 파일: chapter_9.txt
import glob

# 'file_' 다음에 한 문자와 .txt 확장자를 가진 파일 검색
single_char_files = glob.glob('file_?.txt')
print("file_?.txt:", single_char_files)
# 예상 출력: file_?.txt: ['file_1.txt', 'file_2.txt']

[!seq] 또는 [^seq] ➡️ seq에 없는 문자와 일치

(예시)

a, b, c 중 하나로 시작하지 않는 .txt 파일 검색:

  • 패턴: [^abc]*.txt
  • 일치하는 파일: document.txt, notes.txt
  • 일치하지 않는 파일: a_intro.txt, b_summary.txt, c_appendix.txt
import glob

# a, b, c 중 하나로 시작하지 않는 .txt 파일 검색
not_abc_prefix_files = glob.glob('[!abc]*.txt')
print("[!abc]*.txt:", not_abc_prefix_files)
# 예상 출력: [!abc]*.txt: ['document.txt', 'notes.txt']

🔥 재귀적 파일 검색: recursive=True

recursive=True 옵션은 glob.glob() 함수에 사용될 때, 해당 패턴이 지정된 디렉토리뿐만 아니라 모든 하위 디렉토리 에서도 일치하는 파일 및 디렉토리를 찾도록 지시합니다.

기본적으로 recursive=False 로 설정되어 있습니다. 따라서, ** 패턴을 사용하여 여러 디렉토리 수준에 걸친 파일을 검색하려면 recursive=True 옵션을 명시적으로 설정 해야 합니다.

**glob.glob() 에서 특별한 의미를 가진 와일드카드 패턴입니다. ** 를 사용하면 모든 파일 및 모든 디렉토리 (즉, 재귀적인 패턴)를 대상 으로 합니다.

다시 말해, **한 디렉토리나 여러 디렉토리 수준에 걸친 모든 파일과 디렉토리와 일치 하도록 합니다. 그러나 이 기능을 사용하려면 glob.glob()recursive=True 로 설정해야 합니다.

예를 들어, **/*.csv 패턴은 현재 디렉토리뿐만 아니라 그 하위의 모든 디렉토리에서 .csv 확장자를 가진 파일을 찾게 됩니다.

만약, 디렉토리 구조가 다음과 같다고 가정합시다.

project/
├── main.py
├── utils/
│   ├── __init__.py
│   ├── helper.py
└── data/
    ├── raw/
    │   ├── data1.csv
    │   ├── data2.csv
    └── processed/
        ├── data1_clean.csv
        └── data2_clean.csv

아래는 recursive=True 옵션을 사용하는 예시입니다.

import glob

# '**/*.csv' 패턴은 모든 하위 디렉토리에서 .csv 확장자를 가진 파일을 찾습니다.
csv_files = glob.glob('**/*.csv', recursive=True)

print(csv_files)
# 예상 출력: ['data/raw/data1.csv', 'data/raw/data2.csv', 'data/processed/data1_clean.csv', 'data/processed/data2_clean.csv']

이 코드를 실행하면 project 디렉토리와 그 하위의 모든 디렉토리 에서 .csv 확장자를 가진 파일들의 리스트가 출력됩니다.

댓글남기기