[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
폴더로 이동되어야 합니다.