Programming,  Python

[Python] glob Module 사용법

glob은 Globs (Global Patterns)으로 Linux에서 널리 사용되온 pattern matching 기법이다. 주로 설정 내용을 프로젝트 내의 일부 파일에서만 적용하고 싶을 때 Globs가 사용되는데 대표적으로 .gitignore이 있다.

정규표현식 (Regular Expression)과 Globs는 비슷해 보이지만 문법이 미묘하게 다르다. Globs는 파일 시스템을 검색하는데 특화되어 있는 반면에, 정규표현식은 범용적으로 사용할 수 있는 매칭 기법이다. 따라서 정규표현식은 Globs보다 더 강력한 문자열 매칭을 제공하며 문법도 더 복잡하다.

단순히 파일을 찾을 때는 Globs를 쓰는게 더 쉽고 유리할 수 있다.

기본적인 문법

FunctionDescription
*– 임의의 문자열을 의미한다.
*.*는 임의의 문자열.확장자 형태를 의미한다.
?– 임의의 한 문자를 의미한다.
?.txt는 임의의 한 문자.txt 형태를 의미한다.
[]– 대괄호 안에 있는 문자 중 하나를 의미한다.
[abc].txta.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)라는 패턴은 abababcdcdcdabcdcdabababcdabcd 등 다양한 문자열과 매칭될 수 있다.

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

Leave a Reply

Your email address will not be published. Required fields are marked *