Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 만드는 정크 파일 자동 정리 도우미

파일과 폴더를 한곳에 몰아두다 보니 어떤 파일들이 있는지도 헷갈리고, 일일이 손으로 정리하기엔 너무 귀찮은 개발자라면 이 스크립트가 딱 맞을 것입니다. 아래에서 소개하는 파이썬 프로그램은 지정한 폴더 안의 모든 파일을 확장자별로 알맞은 하위 폴더에 단 한 번의 실행으로 분류하고, 빈 디렉터리까지 자동으로 삭제해 줍니다.

여러 종류의 파일이 뒤섞여 있는 하나의 디렉터리가 있다고 가정해 보겠습니다. 프로그램을 실행하면 각 파일이 자신의 확장자에 맞는 폴더로 깔끔하게 이동됩니다.

정리 전 폴더 구조

Python으로 만드는 정크 파일 자동 정리 도우미

정리 후 목표 결과

Python으로 만드는 정크 파일 자동 정리 도우미

1단계: 폴더별 확장자 목록 정의

먼저 파일을 분류할 폴더 이름과, 각 폴더로 옮길 확장자 목록을 딕셔너리 형태로 정의합니다. HTML, 이미지, 동영상, 문서, 압축 파일, 오디오 등 카테고리별로 확장자를 그룹화했습니다.

DIRECTORIES = {
    "HTML": [".html5", ".html", ".htm", ".xhtml"],
    "IMAGES": [".jpeg", ".jpg", ".tiff", ".gif", ".bmp", ".png", ".bpg", "svg",
    ".heif", ".psd"],
    "VIDEOS": [".avi", ".flv", ".wmv", ".mov", ".mp4", ".webm", ".vob", ".mng",
    ".qt", ".mpg", ".mpeg", ".3gp"],
    "DOCUMENTS": [".oxps", ".epub", ".pages", ".docx", ".doc", ".fdf", ".ods",
    ".odt", ".pwi", ".xsn", ".xps", ".dotx", ".docm", ".dox",
    ".rvg", ".rtf", ".rtfd", ".wpd", ".xls", ".xlsx", ".ppt",
    "pptx"],
    "ARCHIVES": [".a", ".ar", ".cpio", ".iso", ".tar", ".gz", ".rz", ".7z",
    ".dmg", ".rar", ".xar", ".zip"],
    "AUDIO": [".aac", ".aa", ".aac", ".dvf", ".m4a", ".m4b", ".m4p", ".mp3",
    ".msv", "ogg", "oga", ".raw", ".vox", ".wav", ".wma"],
    "PLAINTEXT": [".txt", ".in", ".out"],
    "PDF": [".pdf"],
    "PYTHON": [".py"],
    "XML": [".xml"],
    "EXE": [".exe"],
    "SHELL": [".sh"]
}

2단계: 확장자-폴더 매핑과 정리 함수 작성

딕셔너리 컴프리헨션을 활용하면 위의 DIRECTORIES를 '확장자 → 폴더' 형태의 역방향 매핑(FILE_FORMATS)으로 손쉽게 변환할 수 있습니다. 이어서 실제 파일을 이동시키는 organise_folder() 함수를 작성합니다.

FILE_FORMATS = {file_format: directory
    for directory, file_formats in DIRECTORIES.items()
    for file_format in file_formats}

def organise_folder():
    for entry in os.scandir():
        if entry.is_dir():
            continue
        file_path = Path(entry)
        file_format = file_path.suffix.lower()
        if file_format in FILE_FORMATS:
            directory_path = Path(FILE_FORMATS[file_format])
            directory_path.mkdir(exist_ok=True)
            file_path.rename(directory_path.joinpath(file_path))

    try:
        os.mkdir("OTHER-FILES")
    except:
        pass

    for dir in os.scandir():
        try:
            if dir.is_dir():
                os.rmdir(dir)
            else:
                os.rename(os.getcwd() + '/' + str(Path(dir)), os.getcwd() + '/OTHER-FILES/' + str(Path(dir)))
        except:
            pass

함수의 동작 방식

  • 파일 순회: os.scandir()로 현재 디렉터리의 항목을 살펴보되, 폴더는 continue로 건너뜁니다.
  • 확장자 확인: pathlib.Path의 suffix 속성으로 확장자를 얻고 lower()로 소문자화한 뒤, FILE_FORMATS에 등록된 확장자인지 검사합니다.
  • 폴더 생성 및 이동: 대상 폴더가 없으면 mkdir(exist_ok=True)로 새로 만들고, rename()으로 파일을 해당 폴더로 옮깁니다.
  • 기타 파일 처리: 분류 기준에 없는 파일들은 OTHER-FILES 폴더로 모읍니다.
  • 빈 폴더 삭제: 마지막으로 os.rmdir()을 호출해 내용이 없는 디렉터리를 제거합니다.

완성된 최종 스크립트

지금까지의 내용을 합치면 아래와 같은 완성형 스크립트가 됩니다. 정리하고 싶은 폴더 안에서 실행하면 됩니다.

#Python Lazy Junk Files Organizer

#Import important libraries
import os
from pathlib import Path

#
DIRECTORIES = {
    "HTML": [".html5", ".html", ".htm", ".xhtml"],
    "IMAGES": [".jpeg", ".jpg", ".tiff", ".gif", ".bmp", ".png", ".bpg", "svg",
    ".heif", ".psd"],
    "VIDEOS": [".avi", ".flv", ".wmv", ".mov", ".mp4", ".webm", ".vob", ".mng",
    ".qt", ".mpg", ".mpeg", ".3gp"],
    "DOCUMENTS": [".oxps", ".epub", ".pages", ".docx", ".doc", ".fdf", ".ods",
    ".odt", ".pwi", ".xsn", ".xps", ".dotx", ".docm", ".dox",
    ".rvg", ".rtf", ".rtfd", ".wpd", ".xls", ".xlsx", ".ppt",
    "pptx"],
    "ARCHIVES": [".a", ".ar", ".cpio", ".iso", ".tar", ".gz", ".rz", ".7z",
    ".dmg", ".rar", ".xar", ".zip"],
    "AUDIO": [".aac", ".aa", ".aac", ".dvf", ".m4a", ".m4b", ".m4p", ".mp3",
    ".msv", "ogg", "oga", ".raw", ".vox", ".wav", ".wma"],
    "PLAINTEXT": [".txt", ".in", ".out"],
    "PDF": [".pdf"],
    "PYTHON": [".py"],
    "XML": [".xml"],
    "EXE": [".exe"],
    "SHELL": [".sh"]
}

FILE_FORMATS = {file_format: directory
    for directory, file_formats in DIRECTORIES.items()
    for file_format in file_formats}

def organise_folder():
    for entry in os.scandir():
        if entry.is_dir():
            continue
        file_path = Path(entry)
        file_format = file_path.suffix.lower()
        if file_format in FILE_FORMATS:
            directory_path = Path(FILE_FORMATS[file_format])
            directory_path.mkdir(exist_ok=True)
            file_path.rename(directory_path.joinpath(file_path))
    try:
        os.mkdir("OTHER-FILES")
    except:
        pass

    for dir in os.scandir():
        try:
            if dir.is_dir():
                os.rmdir(dir)
            else:
                os.rename(os.getcwd() + '/' + str(Path(dir)), os.getcwd() + '/OTHER-FILES/' + str(Path(dir)))
        except:
            pass

if __name__ == "__main__":
    organise_folder()

커스터마이징 팁

  • 새로운 확장자를 추가하려면 DIRECTORIES 딕셔너리의 해당 카테고리 리스트에 확장자만 추가하면 됩니다.
  • 새로운 카테고리가 필요하다면 예를 들어 "FONTS": [".ttf", ".otf", ".woff"]처럼 키-값 쌍을 추가하세요.
  • 스크립트는 실행 위치의 파일만 정리하므로, 반드시 정리 대상 폴더 안에서 실행하거나 대상 경로를 지정하도록 코드를 수정해야 합니다.

위 스크립트를 특정 디렉터리 경로에서 실행하면 아래와 같이 파일이 폴더별로 깔끔하게 정리된 결과를 확인할 수 있습니다.

실행 결과

Python으로 만드는 정크 파일 자동 정리 도우미