🔥알림🔥
① 테디노트 유튜브 -
구경하러 가기!
② LangChain 한국어 튜토리얼
바로가기 👀
③ 랭체인 노트 무료 전자책(wikidocs)
바로가기 🙌
④ RAG 비법노트 LangChain 강의오픈
바로가기 🙌
⑤ 서울대 PyTorch 딥러닝 강의
바로가기 🙌
Python 에서 glob.glob() 을 활용한 유연한 파일 검색 기법
이번 포스팅에서는 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
확장자를 가진 파일들의 리스트가 출력됩니다.
댓글남기기