Python

Python을 활용한 업무 자동화 예제 [폴더 정리 기능]

Yukart 2025. 3. 18. 17:16
반응형

Python을 활용한 업무 자동화 예제 [폴더 정리 기능]

많은 직장인들이 컴퓨터에서 파일을 관리하는 데 많은 시간을 소비합니다. 특히 여러 프로젝트나 작업을 진행하면서 다운로드 폴더나 문서 폴더가 금방 지저분해지곤 하죠. 물론 겪지 않으시는 정리 잘하시는 분들도 있겠습니다만... 필자는 정리를 하지 않기 때문에 스스로 해결해보고자 이 프로그램을 만들기로 마음 먹었습니다.

 

이 글에서는 Python으로 파일 관리 자동화 도구를 만드는 방법을 단계별로 알아보겠습니다. 실제 작동하는 코드와 함께 설명을 제공하니 끝까지 읽어주시면 감사하겠습니다.

1. Python 설치

가장 먼저 필요한 것은 Python입니다. Python 공식 웹사이트에서 최신 버전을 다운로드하고 설치합니다.

설치 시 중요한 체크박스가 있습니다:

  • Add Python to PATH - 이 옵션을 반드시 체크하세요!

설치가 완료되면 명령 프롬프트(CMD)나 PowerShell에서 다음 명령을 실행하여 정상 설치 여부를 확인합니다:

python --version

2. Python IDE 설치 (PyCharm Community)

코드를 편리하게 작성하고 관리하기 위해 PyCharm Community Edition을 설치합니다.

  1. PyCharm 다운로드 페이지에서 Community Edition을 다운로드합니다.
  2. 설치 프로그램을 실행하고 기본 설정으로 설치를 진행합니다.
  3. 설치 완료 후 PyCharm을 실행하고 새 프로젝트를 생성합니다.

3. 폴더 정리 기능 소개

이 프로젝트의 핵심은 organize_folder.py 파일입니다. 이 모듈은 다음과 같은 기능을 제공합니다:

  1. 키워드 기반 파일 정리: 파일 이름에 특정 키워드가 포함되면 해당 키워드 이름의 폴더로 파일을 자동 이동
  2. 확장자별 파일 삭제: 지정한 확장자(.tmp, .log 등)를 가진 파일 자동 삭제
  3. 중복 파일 제거: 같은 내용의 파일이나 이름 패턴으로 중복 파일 감지 및 제거

예를 들어, 다음과 같은 작업을 자동화할 수 있습니다:

  • 'PDF'라는 키워드가 있는 모든 파일을 'PDF' 폴더로 이동
  • 임시 파일(.tmp)이나 로그 파일(.log) 일괄 삭제
  • '문서 (1).docx', '문서 (2).docx'와 같은 중복 파일 정리

핵심 코드 살펴보기

키워드 기반 파일 정리 코드:

# 키워드가 포함된 파일 찾아 이동
keyword_files = [f for f in files if keyword.lower() in f.lower()]

if keyword_files:
    self.add_log(f"키워드 '{keyword}'에 해당하는 파일 {len(keyword_files)}개 발견")

    for file in keyword_files:
        src_path = os.path.join(self.target_folder, file)
        dst_path = os.path.join(folder_path, file)

        try:
            # 이미 이동된 파일은 건너뛰기
            if not os.path.exists(src_path):
                continue

            shutil.move(src_path, dst_path)
            self.add_log(f"파일 이동됨: {file} -> {keyword} 폴더")
            moved_files += 1
        except Exception as e:
            self.add_log(f"오류: {file} 이동 실패 - {str(e)}")

확장자별 파일 삭제 코드:

def delete_files_by_extension(self, folder_path, extensions):
    """지정된 확장자의 파일 삭제"""
    if not extensions:
        return 0

    deleted_count = 0

    for root, _, files in os.walk(folder_path):
        for file in files:
            file_path = os.path.join(root, file)

            # 파일 확장자 확인 (대소문자 구분 없이)
            _, ext = os.path.splitext(file.lower())

            if ext in [e.lower() for e in extensions]:
                try:
                    os.remove(file_path)
                    self.add_log(f"삭제됨 (확장자: {ext}): {file}")
                    deleted_count += 1
                except Exception as e:
                    self.add_log(f"삭제 실패: {file} - {str(e)}")

    return deleted_count

중복 파일 감지 코드 (delete_duplicate_items.py에서):

def is_duplicate_by_number(name):
    """파일 또는 폴더명에 끝에 공백(숫자) 형태가 있는지 확인"""
    # 확장자를 제외한 이름만 검사
    basename = os.path.splitext(name)[0] if '.' in name else name

    # 파일명 끝에 공백(숫자) 형태가 있는지 확인
    pattern = r".*\s\([0-9]+\)$"
    return re.match(pattern, basename) is not None

4. Window 디자인 요소 (CustomTkinter)

이 프로젝트에서는 기본 Tkinter 대신 더 현대적인 UI를 제공하는 CustomTkinter 라이브러리를 사용했습니다.

CustomTkinter 설치

pip install customtkinter

기본 윈도우 설정

import customtkinter as ctk

# CustomTkinter 테마 설정
ctk.set_appearance_mode("dark")  # "dark" 또는 "light"
ctk.set_default_color_theme("blue")  # "blue", "green", "dark-blue"

# 앱 클래스
class App(ctk.CTk):
    def __init__(self):
        super().__init__()
        self.title("yukart-helper")

        # 창 크기를 화면 크기로 설정
        self.geometry("{0}x{1}+0+0".format(
            self.winfo_screenwidth(), 
            self.winfo_screenheight())
        )

탭 구성 예제

# 탭 컨트롤
self.tabview = ctk.CTkTabview(self)
self.tabview.pack(fill="both", expand=True, padx=10, pady=10)

# 폴더 정리 탭 추가
self.tabview.add("폴더 정리")
self.folder_organizer = FolderOrganizerTab(self.tabview.tab("폴더 정리"))

# 엑셀 도우미 탭 추가
self.tabview.add("엑셀 도우미")
self.excel_helper = ExcelHelper(self.tabview.tab("엑셀 도우미"))

버튼 예제

# 키워드 추가 버튼
self.add_button = ctk.CTkButton(
    button_frame,
    text="키워드 추가",
    command=self.add_keyword,
    fg_color="#2196F3",
    width=150
)
self.add_button.pack(padx=10, pady=10)

5. EXE 빌드 방법

완성된 프로젝트를 배포하기 위해 PyInstaller를 사용하여 실행 파일(.exe)로 변환합니다.

PyInstaller 설치

pip install pyinstaller

실행 파일 생성 명령어

pyinstaller --onefile --windowed --icon=cat_ghost.ico --clean --name=yukart_helper main.py

각 옵션의 의미:

  • --onefile: 모든 의존성을 하나의 실행 파일로 패키징
  • --windowed: 콘솔 창 없이 GUI만 표시
  • --icon=cat_ghost.ico: 응용 프로그램 아이콘 설정
  • --clean: 빌드 전 임시 파일 정리
  • --name=yukart_helper: 출력 파일 이름 설정

빌드가 완료되면 dist 폴더에 yukart_helper.exe 파일이 생성됩니다.

6. 실행 결과 스크린샷

폴더 정리 탭

  • 폴더 선택 영역
  • 키워드 관리 영역
  • 확장자별 파일 삭제 설정
  • 로그 영역

추가 질문이나 피드백이 있으시면 댓글로 남겨주세요. 감사합니다! 😊

반응형