[Python] glob Module 사용법
glob은 Globs (Global Patterns)으로 Linux에서 널리 사용되온 pattern matching 기법이다. 주로 설정 내용을 프로젝트 내의 일부 파일에서만 적용하고 싶을 때 Globs가 사용되는데 대표적으로 .gitignore이 있다.
정규표현식 (Regular Expression)과 Globs는 비슷해 보이지만 문법이 미묘하게 다르다. Globs는 파일 시스템을 검색하는데 특화되어 있는 반면에, 정규표현식은 범용적으로 사용할 수 있는 매칭 기법이다. 따라서 정규표현식은 Globs보다 더 강력한 문자열 매칭을 제공하며 문법도 더 복잡하다.
단순히 파일을 찾을 때는 Globs를 쓰는게 더 쉽고 유리할 수 있다.
기본적인 문법
| Function | Description |
|---|---|
* | – 임의의 문자열을 의미한다. – *.*는 임의의 문자열.확장자 형태를 의미한다. |
? | – 임의의 한 문자를 의미한다. – ?.txt는 임의의 한 문자.txt 형태를 의미한다. |
[] | – 대괄호 안에 있는 문자 중 하나를 의미한다. – [abc].txt는 a.txt, b.txt, c.txt 형태를 의미한다. |
** | – 임의의 경로를 의미한다. 특히 특정 root에서 다양한 깊은 file tree에서 특정 파일들을 찾을 때 유용하게 사용된다. – ./src/**/*.txt는 ./src/ 안에 있는 임의의 경로에 있는 모든 파일 중 *.txt 파일들을 의미한다.– 사용시 반드시 recursive=True 인자를 전달해줘야 한다. |
{} | – 복수 개의 문자열을 매칭 할 때 사용된다. – **/*.{jpg,JPG}는 임의의 경로 중 *.jpg 또는 *.JPG로 마치는 파일들을 의미한다. |
() | – Wildcard (*) 매칭 시 어느 정도 선택지를 제한해줄 수 있다.– ?(ab|cd)라는 패턴은 ab 또는 cd와 매칭되며 빈문자열과도 매칭된다.. – 반면에 *(ab|cd)라는 패턴은 ab, abab, cd, cdcd, abcd, cdab, ababcdabcd 등 다양한 문자열과 매칭될 수 있다. |
Example
# 해당 경로의 모든 파일 찾기
print(glob.glob("*.*"))
# 해당 경로의 모든 폴더 찾기
print(glob.glob("*/"))
# 해당 경로의 .txt로 마치는 모든 파일 찾기
print(glob.glob("**/*.txt", recursive=True))
# 숫자로 시작하는 모든 txt 파일 찾기
print(glob.glob("./**/[0-9]*.txt", recursive=True))
# 또는 iglob을 사용할 수 도 있다.
for i in glob.iglob("./**/[0-9]*.txt", recursive=True):
print(i)
# 특정 폴더에서 알파벳으로 시작하는 모든 확장자의 파일 찾기
print(glob.glob("./**/[a-zA-Z]*.*", recursive=True))
# 특정 폴더에서 한글로 시작하는 모든 확장자의 파일 찾기
print(glob.glob("**/[가-힣ㄱ-ㅎㅏ-ㅡ]*.*", recursive=True))
# 특정 폴더에서 어떠한 두글자 다음 suffix로 끝나는 모든 확장자의 파일 찾기
print(glob.glob("**/??suffix.*", recursive=True))
import os
import glob
import shutil
source = {
"Images": [".jpg", ".png", ".jpeg", ".bmp"],
"Documents": [".docx", ".txt", ".xlsx", ".pdf", ".pptx"],
"Videos": [".avi", ".mp4", ".mkv"]
}
for foldername, extensions in source.items():
files = os.listdir("src/Exercise01")
dest = os.path.join("src/Exercise01", foldername)
for file in files:
extension = os.path.splitext(file)[-1]
src = os.path.join("src/Exercise01", file)
os.makedirs(dest, exist_ok=True)
if extension in extensions:
shutil.move(src, dest)
위 코드는 파일을 확장자 별로 분류하는 코드다.
- jpg, png, jpeg, bmp 의 확장자는
src/Exercise01/Images폴더로 이동되어야 합니다. - docx, txt, xlsx, pdf 의 확장자는
src/Exercise01/Documents폴더로 이동되어야 합니다. - avi, mp4, mkv 의 확장자는
src/Exercise01/Vidoes폴더로 이동되어야 합니다.