서론: 왜 Python으로 자동화하는가?

현대 업무 환경에서 반복적인 작업은 시간과 에너지를 소모하는 큰 요인입니다. 엑셀 파일 정리, 이메일 발송, 파일 백업, 데이터 수집 등 매일 반복되는 작업들을 자동화할 수 있다면 얼마나 좋을까요? Python은 이러한 자동화 작업에 가장 적합한 프로그래밍 언어입니다.

Python이 자동화에 최적인 이유는 다음과 같습니다:

  • 쉬운 문법: 영어와 유사한 직관적인 문법으로 프로그래밍 초보자도 빠르게 배울 수 있습니다.
  • 풍부한 라이브러리: 파일 처리, 웹 스크래핑, 엑셀 조작, 이메일 전송 등 거의 모든 작업에 대한 라이브러리가 존재합니다.
  • 크로스 플랫폼: Windows, Mac, Linux 어디서든 동일하게 동작합니다.
  • 활발한 커뮤니티: 문제가 생겨도 검색하면 대부분의 해결책을 찾을 수 있습니다.
  • 무료: 오픈소스로 누구나 무료로 사용할 수 있습니다.

이 시리즈에서는 Python을 활용한 실용적인 자동화 기법을 단계별로 배워나갈 것입니다. 첫 번째 편에서는 Python 설치부터 개발 환경 설정, 기본 문법 복습, 그리고 첫 번째 자동화 스크립트 작성까지 다루겠습니다.

1. Python 설치하기

1.1 Windows에서 Python 설치

Windows에서 Python을 설치하는 방법은 다음과 같습니다:

  1. Python 공식 웹사이트에 접속합니다.
  2. "Download Python 3.x.x" 버튼을 클릭하여 최신 버전을 다운로드합니다.
  3. 다운로드된 설치 파일을 실행합니다.
  4. 중요! "Add Python to PATH" 체크박스를 반드시 선택합니다.
  5. "Install Now"를 클릭하여 설치를 완료합니다.

설치 확인을 위해 명령 프롬프트(CMD)를 열고 다음 명령어를 입력합니다:

python --version
pip --version

버전 정보가 출력되면 설치가 성공적으로 완료된 것입니다.

1.2 Mac에서 Python 설치

Mac에는 Python 2가 기본 설치되어 있지만, Python 3을 별도로 설치해야 합니다:

방법 1: 공식 설치 파일 사용

  1. Python 공식 웹사이트에서 macOS용 설치 파일을 다운로드합니다.
  2. 다운로드된 .pkg 파일을 실행하여 설치합니다.

방법 2: Homebrew 사용 (권장)

# Homebrew 설치 (없는 경우)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Python 설치
brew install python

1.3 Linux에서 Python 설치

대부분의 Linux 배포판에는 Python이 기본 설치되어 있습니다. 최신 버전이 필요한 경우:

Ubuntu/Debian:

sudo apt update
sudo apt install python3 python3-pip python3-venv

CentOS/RHEL:

sudo yum install python3 python3-pip

Fedora:

sudo dnf install python3 python3-pip

2. 가상환경 설정

가상환경은 프로젝트별로 독립적인 Python 환경을 만들어주는 도구입니다. 왜 가상환경이 필요할까요?

  • 프로젝트마다 다른 버전의 패키지를 사용할 수 있습니다.
  • 시스템 Python을 깨끗하게 유지할 수 있습니다.
  • 프로젝트 의존성을 명확하게 관리할 수 있습니다.

2.1 venv (기본 제공)

Python 3.3 이상에서는 venv 모듈이 기본 제공됩니다:

# 가상환경 생성
python -m venv myenv

# Windows에서 활성화
myenv\Scripts\activate

# Mac/Linux에서 활성화
source myenv/bin/activate

# 비활성화
deactivate

가상환경이 활성화되면 프롬프트 앞에 (myenv)가 표시됩니다.

2.2 virtualenv

virtualenv는 더 많은 기능을 제공하는 서드파티 도구입니다:

# virtualenv 설치
pip install virtualenv

# 가상환경 생성
virtualenv myenv

# 특정 Python 버전으로 생성
virtualenv -p python3.11 myenv

3. pip와 패키지 관리

pip는 Python의 패키지 관리자입니다. 필요한 라이브러리를 쉽게 설치하고 관리할 수 있습니다.

3.1 기본 명령어

# 패키지 설치
pip install requests

# 특정 버전 설치
pip install requests==2.28.0

# 패키지 업그레이드
pip install --upgrade requests

# 패키지 제거
pip uninstall requests

# 설치된 패키지 목록 확인
pip list

# 패키지 정보 확인
pip show requests

3.2 requirements.txt 활용

프로젝트의 의존성을 파일로 관리하면 다른 환경에서도 동일한 패키지를 쉽게 설치할 수 있습니다:

# 현재 설치된 패키지를 requirements.txt로 저장
pip freeze > requirements.txt

# requirements.txt의 패키지 일괄 설치
pip install -r requirements.txt

requirements.txt 예시:

requests==2.31.0
beautifulsoup4==4.12.2
openpyxl==3.1.2
python-dotenv==1.0.0

4. VS Code 개발 환경 설정

Visual Studio Code는 Python 개발에 가장 인기 있는 무료 에디터입니다.

4.1 VS Code 설치

  1. VS Code 공식 웹사이트에서 다운로드합니다.
  2. 운영체제에 맞는 설치 파일을 실행합니다.

4.2 필수 확장 프로그램

VS Code를 열고 확장 프로그램(Extensions) 탭에서 다음을 설치합니다:

  • Python (Microsoft): Python 언어 지원, 디버깅, 린팅
  • Pylance (Microsoft): 향상된 코드 자동완성 및 타입 체크
  • Python Indent: 자동 들여쓰기 지원
  • autoDocstring: 독스트링 자동 생성

4.3 VS Code 설정

settings.json에 다음 설정을 추가하면 더 나은 개발 경험을 얻을 수 있습니다:

{
    "python.defaultInterpreterPath": "python",
    "python.formatting.provider": "black",
    "editor.formatOnSave": true,
    "python.linting.enabled": true,
    "python.linting.pylintEnabled": true
}

5. Python 기본 문법 복습

자동화 스크립트 작성에 필요한 핵심 문법을 빠르게 복습해봅시다.

5.1 변수와 자료형

# 기본 자료형
name = "Python"           # 문자열 (str)
version = 3.12            # 실수 (float)
count = 100               # 정수 (int)
is_active = True          # 불리언 (bool)

# 컬렉션 자료형
fruits = ["apple", "banana", "cherry"]    # 리스트
coordinates = (10, 20)                     # 튜플
person = {"name": "홍길동", "age": 30}     # 딕셔너리
unique_numbers = {1, 2, 3, 4, 5}          # 세트

# 타입 확인
print(type(name))  # 

5.2 조건문

age = 25

if age < 18:
    print("미성년자입니다.")
elif age < 65:
    print("성인입니다.")
else:
    print("노인입니다.")

# 삼항 연산자
status = "성인" if age >= 18 else "미성년자"

5.3 반복문

# for 문
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)

# range 활용
for i in range(5):
    print(i)  # 0, 1, 2, 3, 4

# enumerate 활용 (인덱스와 값 동시에)
for index, fruit in enumerate(fruits):
    print(f"{index}: {fruit}")

# while 문
count = 0
while count < 5:
    print(count)
    count += 1

# 리스트 컴프리헨션
squares = [x**2 for x in range(10)]
even_numbers = [x for x in range(20) if x % 2 == 0]

5.4 함수

# 기본 함수
def greet(name):
    return f"안녕하세요, {name}님!"

# 기본값 매개변수
def greet_with_time(name, time="아침"):
    return f"좋은 {time}이에요, {name}님!"

# 가변 인자
def sum_all(*args):
    return sum(args)

# 키워드 인자
def create_profile(**kwargs):
    return kwargs

# 람다 함수
square = lambda x: x ** 2
add = lambda x, y: x + y

# 사용 예시
print(greet("홍길동"))
print(sum_all(1, 2, 3, 4, 5))
print(create_profile(name="김철수", age=25, city="서울"))

5.5 예외 처리

try:
    result = 10 / 0
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
except Exception as e:
    print(f"오류 발생: {e}")
else:
    print("성공적으로 실행되었습니다.")
finally:
    print("항상 실행됩니다.")

6. 첫 번째 자동화 스크립트 작성

이제 배운 내용을 활용하여 실용적인 자동화 스크립트를 작성해봅시다. 지정된 폴더의 파일들을 확장자별로 정리하는 스크립트입니다.

6.1 프로젝트 구조

file_organizer/
├── organize.py
├── requirements.txt
└── README.md

6.2 스크립트 코드

"""
파일 정리 자동화 스크립트
지정된 폴더의 파일들을 확장자별로 분류합니다.
"""

import os
import shutil
from datetime import datetime

# 확장자별 폴더 매핑
EXTENSION_FOLDERS = {
    # 이미지
    '.jpg': 'Images',
    '.jpeg': 'Images',
    '.png': 'Images',
    '.gif': 'Images',
    '.bmp': 'Images',
    '.svg': 'Images',

    # 문서
    '.pdf': 'Documents',
    '.doc': 'Documents',
    '.docx': 'Documents',
    '.xls': 'Documents',
    '.xlsx': 'Documents',
    '.ppt': 'Documents',
    '.pptx': 'Documents',
    '.txt': 'Documents',

    # 동영상
    '.mp4': 'Videos',
    '.avi': 'Videos',
    '.mkv': 'Videos',
    '.mov': 'Videos',

    # 음악
    '.mp3': 'Music',
    '.wav': 'Music',
    '.flac': 'Music',

    # 압축파일
    '.zip': 'Archives',
    '.rar': 'Archives',
    '.7z': 'Archives',
    '.tar': 'Archives',
    '.gz': 'Archives',

    # 프로그램
    '.exe': 'Programs',
    '.msi': 'Programs',
    '.dmg': 'Programs',
}

def get_folder_for_extension(extension):
    """확장자에 해당하는 폴더명을 반환합니다."""
    return EXTENSION_FOLDERS.get(extension.lower(), 'Others')

def organize_files(source_folder):
    """
    지정된 폴더의 파일들을 확장자별로 정리합니다.

    Args:
        source_folder: 정리할 폴더 경로

    Returns:
        정리된 파일 수
    """
    if not os.path.exists(source_folder):
        print(f"오류: '{source_folder}' 폴더가 존재하지 않습니다.")
        return 0

    organized_count = 0

    # 폴더 내 파일들을 순회
    for filename in os.listdir(source_folder):
        file_path = os.path.join(source_folder, filename)

        # 폴더는 건너뛰기
        if os.path.isdir(file_path):
            continue

        # 확장자 추출
        _, extension = os.path.splitext(filename)

        if not extension:
            continue

        # 대상 폴더 결정
        target_folder_name = get_folder_for_extension(extension)
        target_folder = os.path.join(source_folder, target_folder_name)

        # 대상 폴더가 없으면 생성
        if not os.path.exists(target_folder):
            os.makedirs(target_folder)
            print(f"폴더 생성: {target_folder_name}")

        # 파일 이동
        target_path = os.path.join(target_folder, filename)

        # 동일한 파일명이 있는 경우 처리
        if os.path.exists(target_path):
            name, ext = os.path.splitext(filename)
            timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
            new_filename = f"{name}_{timestamp}{ext}"
            target_path = os.path.join(target_folder, new_filename)

        shutil.move(file_path, target_path)
        print(f"이동: {filename} -> {target_folder_name}/")
        organized_count += 1

    return organized_count

def main():
    """메인 실행 함수"""
    print("=" * 50)
    print("파일 정리 자동화 스크립트")
    print("=" * 50)

    # 정리할 폴더 경로 입력
    source_folder = input("정리할 폴더 경로를 입력하세요: ").strip()

    if not source_folder:
        # 기본값: 현재 사용자의 다운로드 폴더
        source_folder = os.path.join(os.path.expanduser("~"), "Downloads")
        print(f"기본 경로 사용: {source_folder}")

    # 확인
    confirm = input(f"'{source_folder}' 폴더를 정리하시겠습니까? (y/n): ")

    if confirm.lower() != 'y':
        print("취소되었습니다.")
        return

    # 파일 정리 실행
    print("\n파일 정리를 시작합니다...\n")
    count = organize_files(source_folder)

    print("\n" + "=" * 50)
    print(f"완료! 총 {count}개의 파일이 정리되었습니다.")
    print("=" * 50)

if __name__ == "__main__":
    main()

6.3 스크립트 실행

# 스크립트 실행
python organize.py

7. 마무리 및 다음 편 예고

이번 편에서는 Python 자동화의 기초를 다졌습니다. 우리가 배운 내용을 정리하면:

  • Python이 자동화에 적합한 이유
  • Windows, Mac, Linux에서 Python 설치 방법
  • 가상환경(venv, virtualenv)의 필요성과 사용법
  • pip를 통한 패키지 관리
  • VS Code 개발 환경 설정
  • Python 기본 문법 복습
  • 첫 번째 자동화 스크립트 작성

다음 편 예고: Python 자동화 마스터 2편에서는 파일 및 폴더 자동화를 심층적으로 다룹니다. os 모듈, pathlib, shutil을 활용한 고급 파일 처리 기법과 실용적인 파일 정리 프로젝트를 함께 만들어봅니다!