콘텐츠 대표 이미지 - 파이썬 자동화 스크립트: 업무 효율성 높이기

파이썬 자동화 스크립트: 업무 효율성 높이기

반복 업무는 이제 그만! 칼퇴를 부르는 파이썬 자동화의 모든 것 🪄

안녕! 👋 오늘 좀 특별한 이야기를 해볼까 해. 매일같이 우리를 괴롭히는 '그 녀석', 바로 '반복 업무'에 대한 이야기야. 복사해서 붙여넣기, 파일 이름 바꾸기, 매일 아침 똑같은 보고서 만들기... 생각만 해도 머리가 지끈거리지? 🤯

만약 이 모든 귀찮은 일들을 대신해 줄 나만의 '디지털 비서'가 있다면 어떨까? 내가 커피 한 잔 마시는 동안, 혹은 동료와 잠시 수다를 떠는 동안에도 묵묵히 내 일을 처리해 주는 그런 존재 말이야. "에이, 그런 게 어딨어?" 싶겠지만, 놀랍게도 가능해. 바로 파이썬(Python)이라는 마법 지팡이만 있다면 말이지!

이 글은 코딩의 'ㅋ'자도 모르던 내가 어떻게 파이썬 자동화의 세계에 발을 들였고, 어떻게 '복붙의 노예'에서 '자동화 마법사'로 거듭났는지에 대한 여정을 담은 일종의 비밀 지도야. 단순히 "이 코드는 이 기능이에요"라고 말하는 딱딱한 설명서가 아니야. 친구에게 "야, 이거 진짜 대박이야! 너도 한번 해봐!"라고 말하는 것처럼, 신나고 재미있게, 그리고 아주 솔직하게 모든 꿀팁을 탈탈 털어줄게.

우리는 오늘 함께 파이썬이라는 언어가 왜 자동화에 최적화된 '사기캐'인지 알아보고, 내 컴퓨터에 마법을 부릴 준비(개발 환경 세팅)를 한 다음, 아주 간단한 주문(기초 문법)부터 시작해서 파일 정리, 웹 서핑, 엑셀 작업, 심지어 이메일 발송까지 대신해 주는 강력한 마법 스크립트들을 하나씩 만들어 볼 거야. 겁먹을 필요 없어. 최대한 쉽고, 직관적으로, 그리고 '그래서 이걸로 뭘 할 수 있는데?'라는 질문에 바로 답할 수 있는 실용적인 예제들로 가득 채워 놨으니까! 😉

자, 이제 지긋지긋한 반복 업무에 작별을 고하고, 저녁이 있는 삶, '칼퇴'의 기쁨을 누릴 준비가 됐다면, 나와 함께 이 흥미진진한 여정을 시작해 보자! 🚀

모든 마법의 시작: 나만의 자동화 작업실 세팅하기 🛠️

자, 대망의 첫걸음이야! 어떤 위대한 마법사도 처음엔 지팡이를 고르고 마법 주문을 외울 자신만의 공간을 마련하는 법이지. 우리도 마찬가지야. 파이썬으로 자동화 마법을 부리기 전에, 우리 컴퓨터에 '자동화 작업실'을 멋지게 꾸며야 해. "아, 벌써부터 설치하고 설정하고... 머리 아파 😫"라고 생각했다면 잠시만! 요즘엔 정말 쉬워졌어. 딱 세 가지만 준비하면 돼: 파이썬, 코드 에디터, 그리고 가상 환경. 내가 차근차근 알려줄 테니 그대로만 따라와 봐!

1단계: 마법의 언어, 파이썬 설치하기

가장 기본이 되는 재료, 바로 파이썬을 우리 컴퓨터에 설치해야 해. 파이썬은 공식 웹사이트(python.org)에서 무료로 다운로드할 수 있어. 웹사이트에 접속하면 바로 눈에 띄는 'Downloads' 버튼이 보일 거야. 최신 버전(Latest version)을 다운로드하면 돼.

여기서 잠깐! ✋ 설치할 때 아주 중요한 체크박스가 하나 있어.

설치 파일을 실행하면 첫 화면 아래쪽에 `Add Python [version] to PATH` 라는 체크박스가 보일 거야. 이걸 반드시 체크해 줘! 이걸 체크해야 우리가 컴퓨터 어디에서든 "파이썬, 나와라!" 하고 명령을 내렸을 때 파이썬이 "네, 주인님!" 하고 바로 알아들을 수 있거든. 이걸 놓치면 나중에 좀 귀찮아지니까 꼭 기억해 줘.

체크했다면 `Install Now`를 눌러서 설치를 진행하면 끝! 정말 간단하지? 설치가 잘 됐는지 확인하고 싶다면, '명령 프롬프트(CMD)'나 '터미널'을 열고 아래처럼 입력해 봐.

python --version

`Python 3.x.x` 같은 버전 정보가 멋지게 출력된다면, 성공적으로 파이썬을 설치한 거야! 축하해! 🎉

2단계: 마법 주문서, 코드 에디터 선택하기

파이썬이라는 언어는 이제 우리 컴퓨터에 준비됐어. 그럼 이 언어로 마법 주문(코드)은 어디에 써야 할까? 메모장에? 물론 가능은 하지만, 그건 마치 마법 주문을 휴지 조각에 적는 것과 같아. 우리는 좀 더 스마트하고 효율적인 '마법 주문서'가 필요해. 그게 바로 코드 에디터야.

세상에는 정말 다양한 코드 에디터가 있지만, 요즘 가장 '힙'하고 강력한 도구는 단연 Visual Studio Code (VS Code)야. 마이크로소프트에서 만들었고, 무료인데다 기능도 어마어마하게 강력하거든. 마치 모든 마법 주문을 자동으로 완성해주고, 오타까지 잡아주는 똑똑한 깃펜 같달까?

VS Code 역시 공식 웹사이트(code.visualstudio.com)에서 쉽게 다운로드하고 설치할 수 있어. 설치 과정은 특별히 어려운 게 없으니 다음, 다음 버튼을 눌러서 완료하면 돼.

VS Code를 설치했다면, 파이썬 마법을 더 강력하게 만들어 줄 '확장 프로그램(Extensions)' 몇 개를 설치해 주자. VS Code 왼쪽 메뉴에서 레고 블록처럼 생긴 아이콘을 클릭하고, 검색창에 아래 이름들을 검색해서 설치해 봐.

- Python: 파이썬 코드를 작성할 때 필수적인 기능들을 제공해. 코드 자동 완성, 오류 검사 등등. 이건 무조건 1순위!
- Pylance: 마이크로소프트가 만든 파이썬 언어 서버인데, 코드를 더 빠르고 정확하게 분석해서 똑똑한 제안을 해줘.
- Korean Language Pack for Visual Studio Code: 영어가 불편하다면 이걸 설치해서 메뉴를 한글로 바꿀 수 있어.

이 정도만 설치해도 아주 쾌적한 코딩 환경이 만들어질 거야. 이제 우리는 최고의 마법 주문서를 손에 넣었어!

3단계: 프로젝트별 비밀 공간, 가상 환경(venv) 만들기

자, 이제 마지막 단계야. 어쩌면 초보자들이 가장 많이 놓치지만, 가장 중요한 부분일 수도 있어. 바로 가상 환경이라는 개념이야.

이게 뭐냐면, 우리가 앞으로 여러 자동화 프로젝트를 진행하게 될 거잖아? '엑셀 정리 프로젝트', '웹사이트 정보 수집 프로젝트' 등등. 이때 각 프로젝트마다 필요한 마법 도구(라이브러리)들이 조금씩 다를 수 있어. 예를 들어 엑셀 프로젝트에는 `openpyxl`이라는 도구가 필요하고, 웹 정보 수집에는 `requests`와 `BeautifulSoup4`라는 도구가 필요하지.

이 모든 도구들을 그냥 컴퓨터 전체에 한꺼번에 설치해버리면 어떻게 될까? 프로젝트 A에서는 도구 1.0 버전이 필요한데, 프로젝트 B를 위해 2.0 버전으로 업그레이드했더니 갑자기 A가 작동하지 않는 '대참사'가 벌어질 수 있어. 😱 이걸 '의존성 충돌'이라고 하는데, 생각만 해도 끔찍하지?

가상 환경은 이런 문제를 막기 위해, 각 프로젝트마다 독립된 '비밀 공간'을 만들어주는 기술이야. A 프로젝트의 도구들은 A 공간에만, B 프로젝트의 도구들은 B 공간에만 설치해서 서로 전혀 간섭하지 않도록 하는 거지. 정말 현명한 방법이지?

💡 잠깐! 라이브러리가 뭔가요?

라이브러리(Library)는 다른 마법사들이 이미 만들어 놓은 강력한 '마법 주문 모음집'이라고 생각하면 쉬워. 우리가 복잡한 마법을 처음부터 다 만들 필요 없이, 이 모음집을 가져와서 "엑셀 파일 열어줘!", "웹사이트 정보 가져와줘!" 라고 간단히 명령만 내리면 되는 거야. 파이썬이 강력한 이유 중 하나가 바로 이 어마어마한 양의 라이브러리 덕분이야!

가상 환경을 만드는 건 아주 간단해. 먼저, 프로젝트를 저장할 폴더를 하나 만들자. 예를 들어 `my-automation`이라는 폴더를 만들었다고 해보자. 그리고 VS Code에서 이 폴더를 열어줘. (`파일 > 폴더 열기`)

그 다음, VS Code 안에서 터미널을 열어줘. (`터미널 > 새 터미널`)

이제 터미널에 아래의 마법 주문을 입력하는 거야.

python -m venv venv

이 명령의 뜻은 "파이썬아, `venv`라는 도구를 사용해서, `venv`라는 이름의 가상 환경을 만들어줘!" 라는 뜻이야. (앞의 `venv`는 도구 이름, 뒤의 `venv`는 우리가 만들 가상 환경 폴더 이름이야. 보통 이렇게 똑같이 써.)

명령을 실행하면 왼쪽에 `venv`라는 폴더가 생긴 게 보일 거야. 이제 이 가상 환경을 '활성화'해서 앞으로 모든 작업을 이 안에서 하겠다고 선언해야 해.

Windows (CMD, PowerShell):

.\venv\Scripts\activate

macOS / Linux (bash, zsh):

source venv/bin/activate

이 명령을 실행하면 터미널 프롬프트 앞에 `(venv)`라는 표시가 붙을 거야. 이 표시가 보인다면, 이제 우리는 외부와 완벽히 격리된 우리만의 비밀 작업실에 들어온 거야! 이제 여기서 설치하는 모든 라이브러리는 이 프로젝트에만 적용돼. 다른 프로젝트에 아무런 영향을 주지 않지. 작업을 끝내고 가상 환경을 나오고 싶을 땐 터미널에 `deactivate`라고 입력하면 돼.

어때? 파이썬 설치, VS Code 설치, 그리고 가상 환경 설정까지. 우리의 '자동화 작업실'이 완벽하게 준비됐어. 이제 진짜 마법을 부리러 가볼까? ✨

자동화 주문의 기초: 이것만 알면 절반은 성공!

좋아, 작업실 세팅은 끝났어. 이제 본격적으로 마법 주문을 배워볼 시간이야. "으악, 프로그래밍 문법이라니... 너무 어려울 것 같아!"라고 지레 겁먹을 필요 없어. 파이썬은 현존하는 프로그래밍 언어 중에 가장 배우기 쉽고, 사람의 생각과 가장 가까운 언어 중 하나야. 우리는 자동화에 꼭 필요한 핵심 개념 몇 가지만 쏙쏙 뽑아서 알아볼 거야. 이것만 알아도 우리가 하려는 웬만한 자동화는 다 할 수 있어. 진짜야!

변수: 데이터를 담는 마법 상자 📦

가장 기본이 되는 개념, 바로 변수(Variable)야. 변수는 간단히 말해 '데이터를 담는 상자'라고 생각하면 돼. 우리가 어떤 값이나 정보를 나중에 또 사용하고 싶을 때, 이 상자에 이름을 붙여서 보관해두는 거지.

# 'name'이라는 상자에 '홍길동'이라는 글자를 담는다.
name = "홍길동"

# 'age'라는 상자에 25라는 숫자를 담는다.
age = 25

# 'files'라는 상자에 여러 파일 이름을 목록으로 담는다.
files = ["보고서.docx", "자료.xlsx", "사진.jpg"]

print(name)  # '홍길동'이 출력된다.
print(age)   # 25가 출력된다.
print(files) # ['보고서.docx', '자료.xlsx', '사진.jpg']가 출력된다.

어때? `=` 기호를 써서 상자 이름(변수명)에 원하는 값(데이터)을 할당하는 거야. 정말 직관적이지? 이렇게 변수를 사용하면 복잡한 데이터도 `name`, `age`처럼 간단한 이름으로 불러와서 쓸 수 있으니 코드가 훨씬 깔끔하고 이해하기 쉬워져.

반복문(for): 똑같은 일을 알아서 척척! 🔄

자동화의 심장, 자동화의 꽃! 바로 반복문(for loop)이야. 만약 우리에게 파일 100개의 이름을 바꿔야 하는 임무가 주어졌다고 생각해 봐. 100번의 복사/붙여넣기... 상상만 해도 끔찍하지? 😫 이럴 때 반복문이 등장하면 상황이 180도 달라져.

반복문은 '이 목록에 있는 아이템들을 하나씩 꺼내서, 똑같은 작업을 반복해줘!'라고 명령하는 거야.

files = ["보고서.docx", "자료.xlsx", "사진.jpg", "계획안.pptx"]

# 'files' 목록에서 아이템을 하나씩 꺼내 'file'이라는 상자에 담아서 반복한다.
for file in files:
    # 각 파일 이름 앞에 '[중요]'라는 글자를 붙여서 출력한다.
    new_name = "[중요] " + file
    print(new_name)

이 코드를 실행하면 결과가 어떻게 나올까?

[중요] 보고서.docx
[중요] 자료.xlsx
[중요] 사진.jpg
[중요] 계획안.pptx

대박이지? 파일이 4개든 100개든 1000개든, 코드는 단 세 줄이면 끝이야. 반복문은 이렇게 리스트(여러 데이터를 순서대로 모아놓은 것)에 있는 요소들을 하나씩 순회하면서 똑같은 로직을 적용할 때 어마어마한 위력을 발휘해. 파일 목록 처리, 엑셀의 모든 행 읽기, 웹사이트에서 여러 개의 뉴스 기사 가져오기 등 거의 모든 자동화 작업에 이 `for` 반복문이 사용된다고 보면 돼.

조건문(if): 상황에 맞게 판단하는 스마트함 🤔

자동화 스크립트가 그냥 멍청하게 똑같은 일만 반복하면 곤란할 때가 있어. "만약 파일 이름에 '보고서'라는 글자가 포함되어 있다면, A 폴더로 옮겨줘. 그렇지 않고 '사진'이라는 글자가 있다면, B 폴더로 옮겨줘." 처럼, 특정 조건에 따라 다른 행동을 하도록 만들어야 진짜 스마트한 자동화라고 할 수 있겠지? 이럴 때 사용하는 것이 바로 조건문(if statement)이야.

`if`는 말 그대로 '만약 ~라면'이라는 뜻이야. `if`, `elif`(else if, 그게 아니고 만약 ~라면), `else`(그 밖의 모든 경우)를 조합해서 아주 정교한 로직을 만들 수 있어.

file_name = "최종_보고서_2023.docx"

# 만약 파일 이름에 "보고서"라는 글자가 포함되어 있다면
if "보고서" in file_name:
    print("이 파일은 '보고서' 폴더로 이동합니다.")

# 그게 아니고, 만약 "사진"이라는 글자가 포함되어 있다면
elif "사진" in file_name:
    print("이 파일은 '사진' 폴더로 이동합니다.")

# 위의 모든 조건에 해당하지 않는다면
else:
    print("이 파일은 '기타' 폴더로 이동합니다.")

위 코드에서는 `file_name`에 "보고서"라는 단어가 있으니, 첫 번째 `if` 조건에 해당해서 "이 파일은 '보고서' 폴더로 이동합니다."라는 문장이 출력될 거야. 만약 `file_name`이 "제주도_사진_01.jpg"였다면 두 번째 `elif` 조건에 걸려서 "이 파일은 '사진' 폴더로 이동합니다."가 출력됐겠지?

이처럼 조건문은 내 스크립트에 '판단 능력'을 부여하는 아주 중요한 도구야. 반복문과 조건문을 함께 사용하면 "폴더에 있는 모든 파일을 하나씩 확인하면서, 특정 조건을 만족하는 파일만 골라서 특별한 작업을 해줘!" 같은 훨씬 복잡하고 유용한 자동화를 만들 수 있게 돼.

🤔 잠깐! 파일 경로는 어떻게 다루죠?

자동화 작업을 하다 보면 파일이나 폴더의 위치, 즉 '경로'를 다룰 일이 정말 많아. 이때 두 가지 경로 개념을 알아두면 좋아.

1. 절대 경로 (Absolute Path): C드라이브나 내 컴퓨터의 최상위 위치부터 시작해서 파일까지의 전체 주소를 말해. (예: `C:\Users\MyUser\Documents\보고서.docx`) 누가 봐도 절대 헷갈리지 않는 주소지만, 다른 사람 컴퓨터에서는 경로가 달라져서 코드가 작동하지 않을 수 있어.

2. 상대 경로 (Relative Path): 현재 내가 작업하고 있는 스크립트 파일을 기준으로 파일의 위치를 나타내는 방식이야. (예: `data\보고서.docx` -> 현재 폴더 안의 data 폴더 안의 보고서.docx) 내 프로젝트 폴더를 통째로 다른 사람에게 전달해도 경로 문제 없이 잘 작동한다는 장점이 있어. 웬만하면 상대 경로를 사용하는 습관을 들이는 게 좋아!

자, 어때? 변수, 반복문, 조건문. 딱 이 세 가지 개념만 머릿속에 넣어둬. 이것들이 바로 우리가 앞으로 만들 모든 자동화 스크립트의 뼈대가 될 거야. 이제 이 뼈대에 살을 붙여서 진짜 살아 움직이는 자동화 프로그램을 만들어 볼 시간이야. 준비됐지? 가자!

파이썬 자동화의 3대 핵심 요소 📦 변수 (Variable) 데이터를 담는 상자 🔄 반복문 (For Loop) 똑같은 작업의 자동화 🤔 조건문 (If) 상황에 따른 판단

Level 1 자동화: 파일 & 폴더 정복하기 📂

자, 이제 진짜 실전이야! 우리 주변에서 가장 흔하게 발생하는 반복 업무가 뭘까? 아마 '파일 정리'가 아닐까 싶어. 매일같이 쌓이는 다운로드 폴더, 뒤죽박죽 섞여버린 프로젝트 파일들... 이것들을 손으로 하나하나 정리하다 보면 어느새 퇴근 시간은 훌쩍 지나있지. 😫 하지만 이제 걱정 마. 파이썬의 기본 마법인 `os`와 `shutil` 라이브러리만 있으면, 우리는 컴퓨터 정리의 신이 될 수 있어!

`os`는 Operating System(운영체제)의 약자로, 파이썬이 내 컴퓨터의 파일이나 폴더 정보를 읽고, 생성하고, 삭제하는 등 OS와 소통하게 해주는 다리 역할을 해. `shutil`은 shell utilities의 약자로, 파일을 복사하거나 이동하는 등 좀 더 고수준의 파일 작업을 도와주는 강력한 도구야. 이 둘은 파이썬을 설치하면 기본으로 따라오는 '기본 마법'이라 따로 설치할 필요도 없어!

실전 예제 1: 다운로드 폴더 자동 정리 스크립트

우리 모두의 골칫거리, '다운로드' 폴더를 타겟으로 삼아보자. 이 폴더엔 이미지 파일(`.jpg`, `.png`), 문서 파일(`.pdf`, `.docx`), 압축 파일(`.zip`) 등 온갖 종류의 파일이 뒤섞여 있지. 우리의 목표는 이 파일들을 확장자별로 각각 '이미지', '문서', '압축파일' 같은 폴더를 만들어 자동으로 옮겨주는 스크립트를 만드는 거야.

먼저, 프로젝트 폴더에 `file_organizer.py` 라는 이름으로 파이썬 파일을 하나 만들어 봐. 그리고 아래 코드를 그대로 입력하거나 복사-붙여넣기 해보자.

import os
import shutil

# 1. 정리할 폴더 경로를 지정합니다.
#    여기에 자신의 다운로드 폴더 경로를 입력하세요!
#    팁: 경로 복사 후, \를 /로 바꿔주거나 \\로 두 개씩 써주면 오류가 안 나요.
target_folder = "C:/Users/YourUsername/Downloads" 

# 2. 정리된 파일들을 옮길 폴더들을 미리 정의합니다. (카테고리 설정)
#    key: 확장자, value: 옮겨질 폴더명
dest_folders = {
    "images": [".jpg", ".jpeg", ".png", ".gif", ".bmp"],
    "documents": [".pdf", ".docx", ".pptx", ".xlsx", ".hwp", ".txt"],
    "archives": [".zip", ".rar", ".7z", ".gz"],
    "videos": [".mp4", ".mov", ".avi", ".wmv"],
    "executables": [".exe", ".msi"]
}

print(f"'{target_folder}' 폴더 정리를 시작합니다...")

# 3. target_folder에 있는 모든 파일과 폴더 목록을 가져옵니다.
all_files = os.listdir(target_folder)

# 4. 각 파일을 확인하며 분류 작업을 시작합니다.
for file in all_files:
    # 파일의 전체 경로를 만듭니다.
    file_path = os.path.join(target_folder, file)

    # 만약 폴더라면 건너뜁니다. (파일만 대상으로)
    if os.path.isdir(file_path):
        continue

    # 파일의 확장자를 추출합니다. (예: "image.JPG" -> ".jpg")
    # 파일 이름과 확장자를 분리하고, 확장자만 가져온 뒤 소문자로 바꿉니다.
    filename, extension = os.path.splitext(file)
    extension = extension.lower()

    # 5. 적절한 목적지 폴더를 찾습니다.
    moved = False
    for folder_name, extensions in dest_folders.items():
        if extension in extensions:
            # 목적지 폴더 경로를 만듭니다. (예: C:/Users/.../Downloads/images)
            dest_path = os.path.join(target_folder, folder_name)

            # 만약 목적지 폴더가 존재하지 않으면, 새로 생성합니다.
            if not os.path.exists(dest_path):
                os.makedirs(dest_path)
                print(f"'{folder_name}' 폴더를 생성했습니다.")

            # 파일을 목적지 폴더로 이동시킵니다.
            shutil.move(file_path, dest_path)
            print(f"'{file}' -> '{folder_name}' 폴더로 이동 완료!")
            moved = True
            break # 이동했으니 더 이상 다른 카테고리를 확인할 필요 없음
    
    # 6. 어디에도 속하지 않는 파일 처리
    if not moved:
        # 'etc' 폴더를 만들어 관리할 수도 있습니다.
        etc_path = os.path.join(target_folder, "etc")
        if not os.path.exists(etc_path):
            os.makedirs(etc_path)
            print("'etc' 폴더를 생성했습니다.")
        
        shutil.move(file_path, etc_path)
        print(f"'{file}' -> 'etc' 폴더로 이동 완료!")


print("폴더 정리가 모두 완료되었습니다! ✨")
🚨 주의! 코드를 실행하기 전에!

위 코드의 `target_folder` 변수 값을 반드시 여러분 자신의 실제 다운로드 폴더 경로로 바꿔주세요! 경로를 잘못 지정하면 엉뚱한 폴더가 정리될 수 있으니 꼭 확인해야 합니다. 윈도우 탐색기 주소창에서 경로를 복사한 뒤, `\`를 `/`로 바꾸거나 `\\`처럼 두 개씩 써주는 것을 잊지 마세요!

자, 코드를 분석해볼까?
1. `import os`, `import shutil`로 필요한 마법 도구를 불러왔어.
2. `target_folder`에 정리할 폴더를 지정하고, `dest_folders`라는 딕셔너리(key-value 쌍으로 데이터를 저장하는 자료구조)에 어떤 확장자를 어떤 폴더로 보낼지 규칙을 정했지.
3. `os.listdir()` 함수로 `target_folder` 안의 모든 파일/폴더 목록을 리스트로 쫙 가져왔어.
4. `for` 반복문으로 각 파일을 하나씩 순회하면서, `os.path.splitext()` 함수로 파일 이름과 확장자를 깔끔하게 분리했어. 확장자는 대소문자 구분 없이 비교하기 위해 `.lower()`로 모두 소문자로 바꿔주는 센스!
5. 또 다른 `for` 반복문으로 `dest_folders` 규칙을 하나씩 확인하면서, 파일의 확장자가 규칙에 맞는지 `if extension in extensions:` 코드로 체크했어.
6. 규칙에 맞는 폴더를 찾으면, `os.path.exists()`로 그 폴더가 이미 있는지 확인하고, 없으면 `os.makedirs()`로 새로 만들어줬어.
7. 마지막으로 대망의 `shutil.move()` 함수로 파일을 해당 폴더로 슝~ 하고 이동시킨 거야!
8. 어떤 카테고리에도 속하지 않는 파일들은 'etc' 폴더로 보내도록 처리해서 놓치는 파일이 없게 만들었어.

이 스크립트를 한 번 실행하는 것만으로, 몇 분, 혹은 몇십 분이 걸렸을지도 모를 다운로드 폴더 정리가 단 몇 초 만에 끝나는 마법을 경험하게 될 거야! 🤩

실전 예제 2: 수십 개 파일 이름 한 번에 바꾸기

이번엔 또 다른 흔한 시나리오야. 카메라로 찍은 사진 파일들이 `DSC001.JPG`, `DSC002.JPG` 처럼 의미 없는 이름으로 저장되어 있거나, 업무 파일 앞에 일괄적으로 날짜나 프로젝트명을 붙여야 할 때가 있지. 이럴 때 '파일 이름 일괄 변경' 스크립트가 있다면 정말 편할 거야.

예를 들어, '제주도 여행' 폴더에 있는 사진 파일들의 이름을 `제주도여행_2023_01.jpg`, `제주도여행_2023_02.jpg` 와 같이 바꿔보자.

프로젝트 폴더에 `rename_files.py` 파일을 만들고 아래 코드를 작성해 봐.

import os

# 1. 파일 이름을 바꿀 폴더 경로를 지정합니다.
target_folder = "D:/여행사진/제주도"

# 2. 파일 이름에 사용할 접두사를 정합니다.
prefix = "제주도여행_2023_"

# 3. 파일 번호를 매기기 위한 카운터를 만듭니다.
count = 1

print(f"'{target_folder}' 폴더의 파일 이름 변경을 시작합니다...")

# 4. 폴더 안의 모든 파일을 순회합니다.
for filename in os.listdir(target_folder):
    # 파일의 확장자를 분리합니다.
    name_body, extension = os.path.splitext(filename)

    # 이미지 파일(.jpg, .png 등)만 대상으로 하고 싶다면 아래와 같이 조건 추가
    if extension.lower() in [".jpg", ".jpeg", ".png"]:
        # 5. 새로운 파일 이름을 조합합니다.
        #    zfill(2)는 숫자를 2자리로 만들고, 빈 자리는 0으로 채워줍니다. (예: 1 -> 01, 10 -> 10)
        new_name = f"{prefix}{str(count).zfill(2)}{extension}"

        # 6. 기존 파일 경로와 새로운 파일 경로를 만듭니다.
        old_path = os.path.join(target_folder, filename)
        new_path = os.path.join(target_folder, new_name)

        # 7. os.rename() 함수로 파일 이름을 변경합니다!
        os.rename(old_path, new_path)
        print(f"'{filename}' -> '{new_name}' 으로 변경 완료!")

        # 8. 다음 파일을 위해 카운터를 1 증가시킵니다.
        count += 1

print("파일 이름 변경 작업이 모두 끝났습니다! 📸")

이 스크립트의 핵심은 `os.rename(기존경로, 새로운경로)` 함수야. 정말 간단하지?
반복문을 돌면서 각 파일에 대해 `prefix`와 `count`, 그리고 원래 `extension`을 조합해서 새로운 파일 이름을 만들어내. 여기서 `f-string` (f"...") 문법과 `zfill()` 함수를 사용해서 `제주도여행_2023_01.jpg` 처럼 깔끔한 이름을 만드는 디테일도 챙겼어. `count` 변수를 1씩 증가시키면서 모든 파일에 고유한 번호를 붙여주는 로직도 중요해.

이제 수백, 수천 장의 사진도 단 몇 초 만에 원하는 규칙으로 정리할 수 있게 됐어. 이 스크립트를 조금만 응용하면 파일 이름에서 특정 단어를 삭제하거나, 다른 단어로 바꾸는 등 무궁무진한 활용이 가능해!

어때? `os`와 `shutil`만 잘 활용해도 우리의 디지털 라이프가 훨씬 윤택해질 것 같지 않아? 이게 바로 파이썬 자동화의 첫걸음이자, 가장 즉각적인 만족감을 주는 마법이야. 다음 레벨에서는 컴퓨터를 벗어나 더 넓은 세상, 바로 '웹'을 정복하러 가볼 거야! 기대되지? 😉

Level 2 자동화: 웹 서핑은 이제 그만! 파이썬에게 시키기 🌐

이제 우리 컴퓨터 안에서의 작업은 어느 정도 마스터했어. 그렇다면 이제 시야를 넓혀서 온라인 세상, 즉 인터넷으로 나가볼 시간이야! 매일 아침 주요 뉴스 헤드라인을 확인하고, 관심 있는 상품의 가격 변동을 체크하고, 특정 웹사이트에 자동으로 로그인하는 일... 이런 것들도 전부 파이썬에게 맡길 수 있다면 얼마나 좋을까? 이번 챕터에서는 바로 그 방법을 배울 거야. 웹 자동화는 크게 두 가지로 나뉘어. 하나는 웹사이트의 정보를 조용히 긁어오는 '웹 스크레이핑(Web Scraping)', 다른 하나는 실제 사람처럼 브라우저를 조종하는 '브라우저 자동화(Browser Automation)'야.

파트 1: 웹 스크레이핑 - 정보 사냥꾼 되기 (requests & BeautifulSoup4)

웹 스크레이핑은 웹사이트에 접속해서 우리가 원하는 정보(텍스트, 이미지, 링크 등)만 쏙쏙 뽑아내는 기술이야. 마치 과일 가게에서 잘 익은 사과만 골라 담는 것과 같지. 이 작업을 위해 우리는 두 명의 환상적인 파트너, `requests`와 `BeautifulSoup4`를 고용할 거야.

  • requests: 아주 예의 바른 배달원이야. 우리가 "이 웹사이트 주소로 가서, 거기 있는 HTML 문서 좀 가져다주세요!"라고 부탁하면, 군말 없이 해당 웹사이트의 소스 코드를 통째로 가져다줘.
  • BeautifulSoup4: 뛰어난 탐정이야. `requests`가 가져온 복잡하고 어지러운 HTML 문서 속에서, 우리가 "제목 태그 안에 있는 텍스트만 찾아줘!" 또는 "이미지 주소만 전부 뽑아줘!"라고 의뢰하면, 날카롭게 분석해서 원하는 정보만 정확히 찾아내 줘.

이 두 라이브러리는 기본 라이브러리가 아니기 때문에, 우리가 직접 설치해 줘야 해. VS Code 터미널(가상 환경이 활성화된 상태에서!)에 아래 명령어를 입력해서 설치하자.

pip install requests
pip install beautifulsoup4
💡 잠깐! 웹 스크레이핑, 아무데나 해도 될까? (매너 지키기)

웹 스크레이핑은 강력한 기술이지만, 동시에 조심해서 사용해야 해. 웹사이트 입장에서 보면, 너무 잦은 요청은 서버에 부담을 줄 수 있거든. 그래서 많은 웹사이트들은 `robots.txt`라는 파일을 통해 어떤 정보를 긁어가도 되는지, 어떤 정보는 안 되는지 규칙을 정해두고 있어. (예: `https://www.example.com/robots.txt`) 스크레이핑을 하기 전에 이 파일을 확인하고, 서버에 과도한 부담을 주지 않도록 요청 사이에 적절한 시간 간격(`time.sleep()`)을 두는 것이 좋은 매너야!

실전 예제: 네이버 뉴스 헤드라인 가져오기

매일 아침, 네이버 뉴스 경제 섹션의 헤드라인을 자동으로 가져와서 보여주는 스크립트를 만들어보자.

프로젝트 폴더에 `news_scraper.py` 파일을 만들고 코드를 작성해 봐.

import requests
from bs4 import BeautifulSoup

# 1. 스크레이핑할 웹사이트 주소
url = "https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=101"

# 2. requests를 이용해 웹사이트의 HTML 정보 가져오기
#    'User-Agent' 헤더를 추가해서, 브라우저에서 접속하는 것처럼 위장!
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
response = requests.get(url, headers=headers)

# 3. BeautifulSoup을 이용해 HTML을 파싱(분석하기 쉽게 변환)하기
#    response.text는 가져온 HTML 텍스트 전체를 의미
soup = BeautifulSoup(response.text, 'html.parser')

# 4. 원하는 정보가 있는 위치 찾기 (CSS 선택자 활용)
#    개발자 도구(F12)를 이용해 헤드라인이 어떤 태그와 클래스에 있는지 확인해야 함!
#    이 예제에서는 'cluster_text_headline' 클래스를 가진 <a> 태그를 찾는다.
headlines = soup.select('a.cluster_text_headline')

print("=== 네이버 경제 뉴스 헤드라인 (오늘) ===")

# 5. 찾은 정보들을 반복문으로 하나씩 출력하기
#    limit=5를 사용해 상위 5개만 가져오도록 제한
for i, headline in enumerate(headlines[:5]):
    # .text 속성을 이용해 태그 안의 텍스트만 추출하고, strip()으로 양쪽 공백 제거
    title = headline.text.strip()
    print(f"{i+1}. {title}")

print("====================================")

이 코드의 핵심은 4번 단계, `soup.select('a.cluster_text_headline')` 부분이야. 이게 바로 탐정 BeautifulSoup에게 내리는 지령이지. "HTML 문서 전체에서, `a` 태그이면서 동시에 `cluster_text_headline`이라는 클래스(class)를 가진 녀석들을 전부 찾아와!"라는 뜻이야. (CSS 선택자 문법인데, `.`은 클래스를 의미해.)

그럼 이 `a.cluster_text_headline`은 어떻게 알았을까? 바로 웹 브라우저의 '개발자 도구(F12)'를 이용한 거야. 뉴스 헤드라인에 마우스 오른쪽 버튼을 클릭하고 '검사'를 눌러보면, 해당 텍스트가 어떤 HTML 태그로 둘러싸여 있는지 구조를 엿볼 수 있어. 이걸 분석해서 우리가 원하는 정보의 '주소'를 찾아내는 과정이 웹 스크레이핑의 가장 중요한 부분이야!

이 스크립트를 실행하면, 터미널에 현재 네이버 경제 뉴스의 헤드라인 상위 5개가 깔끔하게 출력될 거야. 이제 매일 아침 브라우저를 켤 필요 없이, 이 스크립트 한 번만 실행하면 되는 거지! 🚀

파트 2: 브라우저 자동화 - 나만의 웹 서핑 로봇 (Selenium)

스크레이핑만으로는 한계가 있을 때가 있어. 예를 들어, 로그인을 해야만 볼 수 있는 정보라거나, 버튼을 클릭하고 날짜를 선택하는 등 사용자의 '행동'이 필요한 경우지. 이럴 때 등장하는 것이 바로 Selenium(셀레니움)이야.

셀레니움은 실제 웹 브라우저(크롬, 파이어폭스 등)를 파이썬 코드로 직접 제어하게 해주는 엄청난 도구야. 마치 보이지 않는 유령이 마우스를 움직이고 키보드를 입력하는 것처럼, 브라우저를 마음대로 조종할 수 있게 돼. 자동 로그인, 설문조사 자동 참여, 반복적인 웹사이트 테스트 등 활용 분야가 무궁무진해.

셀레니움도 설치가 필요해. 그리고 셀레니움이 조종할 '웹 드라이버'라는 것도 필요하지. 우리는 가장 대중적인 크롬 브라우저를 사용해 볼 거야.

터미널에 아래 명령어를 입력해서 셀레니움을 설치하자.

pip install selenium

예전에는 크롬 버전에 맞는 웹 드라이버를 따로 다운로드해서 경로를 지정해 줘야 하는 번거로움이 있었지만, 요즘엔 `selenium` 4.6.0 버전 이상부터는 이 과정이 자동으로 처리돼서 훨씬 편해졌어! (이래서 라이브러리는 최신 버전을 쓰는 게 좋아 👍)

실전 예제: 특정 사이트 자동 로그인하기

여기서는 가상의 로그인 페이지를 예로 들어볼게. 실제 사이트에 적용할 때는 ID와 비밀번호를 입력하는 input 태그의 `id`나 `name` 값을 개발자 도구로 직접 확인해야 해.

프로젝트 폴더에 `auto_login.py` 파일을 만들고 코드를 작성해 봐.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

# 1. 로그인 정보 (실제 ID와 비밀번호를 여기에 입력)
my_id = "your_id"
my_pw = "your_password"

# 2. 크롬 브라우저를 실행합니다.
driver = webdriver.Chrome()
print("크롬 브라우저를 엽니다.")

# 3. 로그인 페이지로 이동합니다.
#    여기에 실제 로그인하고 싶은 페이지의 URL을 입력하세요.
driver.get("https://www.example-login-page.com") 
print("로그인 페이지로 이동합니다.")

# 페이지가 로딩될 때까지 잠시 기다려줍니다. (3초)
time.sleep(3)

# 4. ID와 비밀번호 입력창을 찾습니다.
#    개발자 도구로 확인한 실제 id 값을 사용해야 합니다.
#    여기서는 'login_id'와 'login_pw'를 예시로 사용합니다.
id_input = driver.find_element(By.ID, "login_id")
pw_input = driver.find_element(By.ID, "login_pw")
print("ID/PW 입력창을 찾았습니다.")

# 5. ID와 비밀번호를 입력합니다.
id_input.send_keys(my_id)
pw_input.send_keys(my_pw)
print("ID와 PW를 입력했습니다.")

# 6. 엔터 키를 눌러 로그인을 시도합니다.
pw_input.send_keys(Keys.RETURN)
print("로그인을 시도합니다.")

# 로그인이 완료되고 다음 페이지가 뜰 때까지 잠시 기다립니다.
time.sleep(5)

print("자동 로그인 작업 완료! 브라우저를 5초 후에 닫습니다.")
time.sleep(5)

# 7. 브라우저를 닫습니다.
driver.quit()
🚨 보안 경고! ID/PW를 코드에 직접 쓰지 마세요!

위 예제는 설명을 위해 ID와 비밀번호를 코드에 직접 작성했지만, 이건 아주 위험한 방식이야! 이 코드가 다른 사람에게 노출되면 내 계정 정보가 그대로 유출되는 거니까. 실제 프로젝트에서는 `dotenv` 라이브러리를 사용해서 별도의 설정 파일(`.env`)에 민감한 정보를 저장하고, 코드에서 불러와 사용하는 것이 훨씬 안전해. 꼭 기억해 줘!

셀레니움 코드의 흐름을 보자.
1. `webdriver.Chrome()`으로 크롬 브라우저를 딱! 열어.
2. `driver.get(URL)`로 원하는 페이지로 이동해.
3. `driver.find_element()` 함수로 우리가 조작하고 싶은 HTML 요소를 찾아. 요소를 찾는 방법은 `By.ID`, `By.CLASS_NAME`, `By.CSS_SELECTOR`, `By.XPATH` 등 다양해. 개발자 도구를 보고 가장 찾기 쉬운 방법을 선택하면 돼.
4. 찾은 요소에 `send_keys()`를 사용해서 키보드 입력을 하고, `Keys.RETURN`으로 엔터키를 누르거나, 로그인 버튼을 찾아서 `.click()`을 해줄 수도 있어.
5. `time.sleep()`은 아주 중요해. 웹페이지가 로딩되는 시간을 기다려주지 않으면, 요소가 미처 화면에 나타나기도 전에 찾으려고 하다가 오류가 날 수 있거든. 로봇에게 잠시 숨 돌릴 틈을 주는 거야.
6. 모든 작업이 끝나면 `driver.quit()`으로 브라우저를 깔끔하게 닫아줘.

이제 웹 스크레이핑과 브라우저 자동화라는 강력한 무기까지 손에 넣었어. 이걸로 뭘 할 수 있을까? 경쟁사 제품 가격 모니터링, 부동산 매물 정보 수집, 커뮤니티에 올라오는 특정 키워드 알림 받기, 쇼핑몰 특가 상품 알림... 상상하는 거의 모든 웹 관련 반복 작업을 자동화할 수 있는 문이 열린 거야! 다음 챕터에서는 우리 직장인들의 영원한 친구이자 숙적인 엑셀과 워드를 정복하러 가보자! 📈

Level 3 자동화: 엑셀과 워드, 더 이상 두렵지 않아! 📈

직장인의 삶에서 엑셀과 워드를 빼놓고 이야기할 수 있을까? 😥 아마 불가능할 거야. 수백, 수천 줄의 데이터를 정리하고, 매주 똑같은 양식의 보고서를 만들고, 수십 명에게 보낼 안내문에 이름만 바꿔서 출력하는 일... 생각만 해도 손목이 저려오는 기분이지. 하지만 우리에겐 파이썬이 있잖아! 파이썬을 이용하면 엑셀과 워드를 프로그램처럼 자유자재로 다룰 수 있어. 더 이상 단순 반복 작업에 우리의 소중한 시간을 낭비하지 말자고!

엑셀 자동화의 신세계: OpenPyXL

엑셀 파일을 파이썬으로 다루게 해주는 라이브러리는 여러 가지가 있지만, 그중에서도 `OpenPyXL`은 가장 유명하고 기능이 막강한 도구 중 하나야. `.xlsx` 파일을 읽고, 쓰고, 수정하는 거의 모든 작업을 할 수 있어. 심지어 셀 스타일을 바꾸거나 차트를 그리는 것도 가능해! 먼저 `OpenPyXL`을 설치해 주자.

pip install openpyxl

실전 예제 1: 흩어진 월별 매출 데이터를 하나의 파일로 합치기

상황을 가정해보자. 우리에겐 `1월_매출.xlsx`, `2월_매출.xlsx`, `3월_매출.xlsx`... 처럼 여러 파일로 흩어져 있는 매출 데이터가 있어. 이걸 하나의 `통합_매출보고서.xlsx` 파일에 순서대로 착착 쌓아서 정리하는 스크립트를 만들어 볼 거야.

먼저, 예제용 엑셀 파일을 몇 개 만들어두자. 각 파일에는 `상품명`, `수량`, `단가`, `매출액` 같은 간단한 데이터가 들어있다고 가정할게. (첫 번째 행은 헤더)

프로젝트 폴더에 `excel_merger.py` 파일을 만들고 코드를 작성해 봐.

import openpyxl
import os

# 1. 데이터 파일들이 있는 폴더 경로
data_folder = "./sales_data"

# 2. 새로운 통합 엑셀 파일을 만듭니다.
#    메모리 상에 새로운 워크북(엑셀 파일)을 생성
output_workbook = openpyxl.Workbook()
output_sheet = output_workbook.active # 기본으로 생성된 시트를 활성화
output_sheet.title = "통합 매출" # 시트 이름 변경

# 3. 헤더(첫 행)를 먼저 추가합니다.
#    한 번만 추가되어야 하므로 반복문 바깥에 위치!
header = ["파일 출처", "상품명", "수량", "단가", "매출액"]
output_sheet.append(header)

# 4. 데이터 폴더 안의 모든 엑셀 파일을 순회합니다.
for filename in os.listdir(data_folder):
    # 엑셀 파일(.xlsx)이 아니면 건너뜁니다.
    if not filename.endswith(".xlsx"):
        continue

    file_path = os.path.join(data_folder, filename)
    
    # 5. 각 엑셀 파일을 열고 시트를 활성화합니다.
    workbook = openpyxl.load_workbook(file_path)
    sheet = workbook.active

    # 6. 각 시트의 모든 행(row)을 순회합니다. (헤더 제외)
    #    iter_rows(min_row=2)는 두 번째 행부터 시작하라는 의미
    for row in sheet.iter_rows(min_row=2):
        # 각 행의 셀(cell) 값을 리스트로 만듭니다.
        row_data = [cell.value for cell in row]

        # 데이터 출처를 알기 위해 파일 이름을 맨 앞에 추가합니다.
        output_sheet.append([filename] + row_data)

# 7. 완성된 통합 엑셀 파일을 저장합니다.
output_workbook.save("통합_매출보고서.xlsx")

print("엑셀 파일 통합 작업이 완료되었습니다! 📄")

이 코드의 작동 방식을 단계별로 살펴보자.
1. `openpyxl.Workbook()`로 새로운 빈 엑셀 파일을 메모리에 만들어.
2. `output_sheet.append(header)`로 맨 첫 줄에 우리가 원하는 헤더를 추가해.
3. `os.listdir()`로 데이터 폴더를 뒤져서 엑셀 파일들을 찾아내.
4. `for` 반복문 안에서 `openpyxl.load_workbook()`로 각 엑셀 파일을 하나씩 열어.
5. `sheet.iter_rows(min_row=2)`로 각 파일의 두 번째 줄(데이터 시작 부분)부터 한 줄씩 데이터를 읽어와.
6. `output_sheet.append()`를 사용해서 읽어온 데이터를 통합 파일 시트에 한 줄씩 착착 추가하는 거야.
7. 모든 파일 작업이 끝나면 `output_workbook.save()`로 최종 결과물을 파일로 저장해.

이제 파일이 수십, 수백 개라도 걱정 없어. 이 스크립트 한 번이면 커피 한 잔 마실 시간에 모든 데이터가 깔끔하게 합쳐질 테니까! ☕

워드 문서 자동 생성: python-docx

이번엔 워드 문서(.docx)를 다뤄보자. `python-docx` 라이브러리를 사용하면 파이썬 코드로 워드 문서를 새로 만들고, 제목, 단락, 표, 이미지 등을 마음대로 추가할 수 있어. 반복적인 보고서나 안내장, 수료증 등을 대량으로 생성해야 할 때 그야말로 구세주 같은 존재지.

먼저 `python-docx`를 설치하자.

pip install python-docx

실전 예제: 엑셀 명단으로 수료증 자동 생성하기

엑셀 파일에 교육 수료자 명단(`이름`, `과정명`)이 있다고 가정해보자. 이 명단을 읽어서 각 사람에 대한 수료증을 개별 워드 파일로 만들어주는 스크립트를 작성해 볼 거야.

먼저, `수료자명단.xlsx` 파일을 하나 만들고, '이름'과 '과정명' 열에 몇 명의 데이터를 입력해두자.

프로젝트 폴더에 `cert_generator.py` 파일을 만들고 코드를 작성해 봐.

from docx import Document
from docx.shared import Inches, Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH
import openpyxl

# 1. 수료자 명단이 있는 엑셀 파일을 엽니다.
wb = openpyxl.load_workbook("수료자명단.xlsx")
sheet = wb.active

# 2. 엑셀 파일의 두 번째 행부터 순회합니다. (헤더 제외)
for row in sheet.iter_rows(min_row=2):
    # 각 열에서 이름과 과정명을 가져옵니다.
    name = row[0].value
    course = row[1].value

    # 이름 데이터가 없으면 중단합니다.
    if name is None:
        break

    # 3. 새로운 워드 문서를 생성합니다.
    doc = Document()

    # 4. 제목 추가
    title = doc.add_heading("수 료 증", level=0)
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER

    # 빈 줄 추가 (간격)
    doc.add_paragraph()

    # 5. 본문 내용 추가
    #    f-string을 이용해 이름과 과정명을 동적으로 채워넣습니다.
    p1 = doc.add_paragraph()
    p1.add_run(f"성  명: {name}\n").bold = True
    p1.add_run(f"과정명: {course}\n").bold = True

    doc.add_paragraph() # 간격

    content = doc.add_paragraph(f"위 사람은 본 기관에서 실시한 '{course}' 과정을\n우수한 성적으로 수료하였기에 이 증서를 수여합니다.")
    content.alignment = WD_ALIGN_PARAGRAPH.CENTER

    doc.add_paragraph() # 간격
    doc.add_paragraph() # 간격

    # 6. 날짜 및 기관명 추가
    date = doc.add_paragraph("2023년 10월 26일")
    date.alignment = WD_ALIGN_PARAGRAPH.CENTER

    doc.add_paragraph() # 간격

    org = doc.add_paragraph("재능넷 지식인의 숲")
    org.alignment = WD_ALIGN_PARAGRAPH.CENTER
    # 폰트 크기 조절
    org_runs = org.runs
    for run in org_runs:
        run.font.size = Pt(20)
        run.bold = True

    # 7. 각 개인의 이름으로 워드 파일을 저장합니다.
    doc.save(f"수료증_{name}.docx")
    print(f"'{name}'님의 수료증 생성이 완료되었습니다.")

print("모든 수료증 생성이 완료되었습니다! 🎓")

이 스크립트는 정말 마법 같지 않아?
먼저 `openpyxl`로 엑셀 파일을 열어서 한 줄씩 이름과 과정명을 읽어와. 그리고 `for` 반복문 안에서 각 사람마다 `Document()`로 새로운 워드 문서를 생성해.
`doc.add_heading()`으로 제목을, `doc.add_paragraph()`로 문단을 추가할 수 있어. `add_run()`을 사용하면 한 문단 안에서도 글자별로 굵게(`bold=True`) 만들거나 스타일을 다르게 지정할 수 있지.
가장 멋진 부분은 `f"성 명: {name}"` 처럼, 엑셀에서 읽어온 데이터를 템플릿 문장 안에 쏙쏙 집어넣는 거야.
마지막으로 `doc.save(f"수료증_{name}.docx")` 코드를 통해 '수료증_홍길동.docx', '수료증_김철수.docx' 와 같이 개인별 파일로 깔끔하게 저장해.

🚀 한 걸음 더! PDF 자동화

엑셀, 워드 자동화까지 마스터했다면 PDF도 궁금해질 거야. 파이썬으로는 PDF 작업도 가능해! 예를 들어 `PyPDF2`나 최신 버전인 `pypdf` 라이브러리를 사용하면 여러 PDF 파일을 하나로 합치거나, 특정 페이지만 추출하거나, 텍스트를 읽어오는 등의 작업을 할 수 있어. 위에서 만든 워드 수료증들을 PDF로 변환하고 싶다면 `docx2pdf` 같은 라이브러리를 사용해봐. `from docx2pdf import convert`를 불러온 뒤 `convert("수료증_홍길동.docx")` 한 줄이면 끝! 정말 간단하지?

이제 우리는 엑셀 데이터 정리부터 워드 문서 대량 생성까지, 사무업무 자동화의 핵심 기술을 손에 넣었어. 이 기술들을 잘 조합하면 "웹사이트에서 데이터를 긁어와서 엑셀로 정리한 뒤, 그 데이터를 기반으로 워드 보고서를 자동으로 생성하는" 엄청난 파이프라인도 구축할 수 있게 돼. 이제 마지막 관문이야. 이렇게 만든 결과물들을 다른 사람에게 전달하고, 정해진 시간에 알아서 실행되도록 만드는 '디지털 비서'를 완성하러 가보자!

Level 4 자동화: 나만의 디지털 비서 만들기 🤖

지금까지 우리는 정말 많은 것을 배웠어. 파일 정리, 웹 스크레이핑, 엑셀과 워드 자동화까지... 이제 이 강력한 능력들을 한데 모아, 우리를 위해 24시간 일해 줄 '디지털 비서'를 만들어 볼 시간이야. 이 비서는 인터넷 세상의 최신 정보를 물어다 주고(API 활용), 완성된 보고서를 이메일로 착착 보내주며(이메일 자동화), 심지어 우리가 정해놓은 시간에 스스로 일어나서 일을 시작하는(스케줄링) 스마트함까지 갖추게 될 거야!

API: 인터넷 세상의 정보를 얻는 정식 창구

웹 스크레이핑은 웹사이트의 HTML 구조를 분석해서 억지로 정보를 '긁어오는' 방식이었지? 이건 웹사이트 디자인이 바뀌면 코드를 수정해야 하는 번거로움이 있어. 반면 API(Application Programming Interface)는 서비스 제공자가 "우리 데이터를 사용하고 싶으면, 이 공식적인 창구를 통해서 정해진 양식대로 요청하세요!"라고 만들어 놓은 '정문'과 같아. 훨씬 안정적이고 깔끔하게 데이터를 얻을 수 있지.

API는 보통 JSON이라는 데이터 형식으로 결과를 돌려주는데, 파이썬의 딕셔너리와 아주 비슷해서 다루기 정말 쉬워. 우리는 `requests` 라이브러리를 다시 한번 사용해서 API와 통신해 볼 거야.

실전 예제: 날씨 API로 오늘 날씨 정보 받아보기

무료 날씨 정보를 제공하는 OpenWeatherMap API를 사용해서, 내가 사는 도시의 현재 날씨를 알려주는 스크립트를 만들어보자. (먼저 OpenWeatherMap 웹사이트에 가입해서 무료 API Key를 발급받아야 해!)

import requests
import json

# 1. 발급받은 API 키와 도시 이름을 설정합니다.
api_key = "여러분이_발급받은_API_키를_여기에_입력하세요"
city_name = "Seoul"
lang = "kr" # 한국어로 결과를 받기 위함

# 2. API 요청을 보낼 URL을 조립합니다.
#    f-string을 이용해 변수들을 URL 안에 삽입합니다.
api_url = f"https://api.openweathermap.org/data/2.5/weather?q={city_name}&appid={api_key}&lang={lang}&units=metric"

# 3. requests를 이용해 API에 GET 요청을 보냅니다.
response = requests.get(api_url)

# 4. 응답받은 데이터를 JSON 형태로 변환합니다. (파이썬 딕셔너리처럼 다룰 수 있게 됨)
data = response.json()

# 5. JSON 데이터에서 원하는 정보를 추출합니다.
#    API 문서를 보고 어떤 key에 어떤 정보가 있는지 확인해야 합니다.
if data["cod"] == 200: # 'cod'가 200이면 요청 성공
    weather_desc = data["weather"][0]["description"]
    current_temp = data["main"]["temp"]
    feels_like_temp = data["main"]["feels_like"]
    min_temp = data["main"]["temp_min"]
    max_temp = data["main"]["temp_max"]

    print(f"--- 오늘의 {city_name} 날씨 정보 ---")
    print(f"날씨: {weather_desc}")
    print(f"현재 기온: {current_temp}°C")
    print(f"체감 기온: {feels_like_temp}°C")
    print(f"최저/최고 기온: {min_temp}°C / {max_temp}°C")
    print("---------------------------------")
else:
    print("날씨 정보를 가져오는 데 실패했습니다. API 키나 도시 이름을 확인해주세요.")
    print(f"에러 메시지: {data.get('message', '')}")

API를 사용하는 건 웹 스크레이핑보다 훨씬 간단해. 정해진 URL에 요청을 보내고, 받은 JSON 데이터를 딕셔너리 다루듯이 `data['main']['temp']` 와 같이 키(key)를 이용해 값을 쏙쏙 뽑아오면 끝이야. 이제 날씨뿐만 아니라 주식 시세, 환율 정보, 번역 등 수많은 공개 API를 활용해서 내 스크립트를 훨씬 더 똑똑하게 만들 수 있어!

이메일 자동화: 보고서 발송은 이제 손가락 까딱 안 하기 (smtplib)

자동으로 생성한 보고서, 매번 직접 이메일에 첨부해서 보내는 것도 일이지. 파이썬의 `smtplib`과 `email` 라이브러리를 사용하면 이 과정마저 완벽하게 자동화할 수 있어. 스크립트가 끝나면 알아서 지정된 사람들에게 이메일을 촥! 보내주는 거지.

🚨 잠깐! Gmail을 사용하려면 '앱 비밀번호'가 필요해요!

보안상의 이유로, 요즘 Gmail은 일반 계정 비밀번호로는 외부 프로그램에서의 로그인을 허용하지 않아. 대신 '2단계 인증'을 설정한 뒤, '앱 비밀번호'를 새로 발급받아서 사용해야 해. 구글 계정 설정에서 쉽게 만들 수 있으니, 꼭 앱 비밀번호를 사용하도록 하자!

실전 예제: 텍스트와 파일을 첨부하여 이메일 보내기

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

# 1. 이메일 서버 정보 및 계정 정보
smtp_server = "smtp.gmail.com"
smtp_port = 587
sender_email = "your_email@gmail.com"
sender_password = "your_app_password" # 발급받은 앱 비밀번호
receiver_email = "receiver@example.com"

# 2. 이메일 메시지 객체 생성 (MIMEMultipart는 텍스트, 파일 등 여러 파트를 담을 수 있음)
msg = MIMEMultipart()
msg["Subject"] = "파이썬 자동화 테스트 이메일입니다."
msg["From"] = sender_email
msg["To"] = receiver_email

# 3. 이메일 본문 (텍스트 파트) 추가
body = "안녕하세요,\n\n이것은 파이썬으로 보낸 자동화 이메일입니다.\n첨부파일을 확인해주세요.\n\n감사합니다."
msg.attach(MIMEText(body, "plain"))

# 4. 첨부 파일 추가
file_path = "통합_매출보고서.xlsx" # 첨부할 파일 경로
try:
    with open(file_path, "rb") as f:
        # MIMEApplication을 이용해 파일을 이진 데이터로 읽고 첨부
        part = MIMEApplication(f.read(), Name=os.path.basename(file_path))
    # 파일 첨부에 필요한 헤더 추가
    part['Content-Disposition'] = f'attachment; filename="{os.path.basename(file_path)}"'
    msg.attach(part)
    print(f"'{file_path}' 파일 첨부 완료.")
except FileNotFoundError:
    print(f"첨부 파일을 찾을 수 없습니다: {file_path}")

# 5. SMTP 서버에 연결하고 이메일 발송
try:
    with smtplib.SMTP(smtp_server, smtp_port) as server:
        server.starttls() # TLS 암호화
        server.login(sender_email, sender_password)
        server.send_message(msg)
        print("이메일을 성공적으로 발송했습니다! 🚀")
except Exception as e:
    print(f"이메일 발송에 실패했습니다: {e}")

코드가 조금 복잡해 보이지만, 구조는 간단해.
1. `MIMEMultipart`라는 큰 편지 봉투를 만들어.
2. `MIMEText`로 편지지를 만들어서 봉투에 넣어. (`msg.attach`)
3. `MIMEApplication`으로 파일을 포장해서 봉투에 또 넣어. (`msg.attach`)
4. `smtplib`을 이용해 우체국(SMTP 서버)에 접속해서 로그인하고, 편지 봉투를 통째로 보내는 거야! (`server.send_message`)

이제 어떤 결과물이든 원하는 사람에게 자동으로 보낼 수 있게 됐어!

스케줄링: 정해진 시간에 알아서 일하는 비서 (schedule)

지금까지 만든 스크립트들은 우리가 직접 실행해야만 작동했어. 하지만 진짜 '비서'라면 "매일 아침 9시에 뉴스 헤드라인을 긁어서 이메일로 보내줘"처럼, 정해진 시간에 스스로 일을 시작해야겠지? 파이썬의 `schedule` 라이브러리를 사용하면 이 작업을 아주 우아하게 처리할 수 있어.

먼저 `schedule`을 설치하자.

pip install schedule

실전 예제: 특정 작업을 매일, 매시간, 매분마다 실행하기

import schedule
import time

def job_every_10_seconds():
    print("저는 10초마다 실행되는 작업입니다! ⏰")

def job_every_morning():
    print("굿모닝! 아침 9시에 실행되는 작업입니다. ☀️")
    # 여기에 뉴스 스크레이핑 및 이메일 발송 코드를 넣으면 됨!

# 1. 스케줄 등록
schedule.every(10).seconds.do(job_every_10_seconds)
schedule.every().day.at("09:00").do(job_every_morning)
schedule.every().monday.at("13:00").do(job_every_morning) # 매주 월요일 13시에
schedule.every().hour.do(job_every_10_seconds) # 매시간 정각에

print("스케줄러가 시작되었습니다. Ctrl+C를 눌러 종료할 수 있습니다.")

# 2. 무한 루프를 돌면서 스케줄을 계속 확인
while True:
    schedule.run_pending() # 등록된 스케줄 중에 실행할 시간이 된 작업이 있는지 확인하고 실행
    time.sleep(1) # 1초마다 확인 (CPU 부담을 줄이기 위함)

`schedule` 라이브러리의 문법은 거의 영어 문장 같아서 정말 쉬워. `schedule.every(10).minutes.do(작업함수)` 처럼, 얼마나 자주, 어떤 작업을 할지만 정해주면 돼. 그리고 `while True:` 무한 루프 안에서 `schedule.run_pending()`을 계속 호출해주면, 스케줄러가 알아서 시간을 체크하다가 제시간이 되면 등록된 함수를 실행해 줘.

💡 전문가처럼 스케줄링하기: Cron & 작업 스케줄러

`schedule` 라이브러리는 스크립트가 계속 실행 중이어야 한다는 단점이 있어. 컴퓨터를 끄거나 터미널을 닫으면 스케줄러도 멈추지. 더 안정적이고 강력한 스케줄링을 원한다면 운영체제(OS)에 내장된 도구를 사용하는 게 좋아. Linux나 macOS에서는 `Cron`을, Windows에서는 `작업 스케줄러`를 사용하면, 컴퓨터가 켜져 있는 동안에는 파이썬 스크립트가 꺼져 있어도 정해진 시간에 알아서 딱! 실행시켜 줘. 이건 진짜 '서버'처럼 자동화를 돌리는 전문가 레벨의 기술이야!

자, 이제 우리는 API로 정보를 얻고, 이메일로 결과물을 발송하며, 정해진 시간에 스스로 작동하는 완벽한 '디지털 비서'를 만드는 방법까지 모두 알게 됐어. 하지만 여기서 멈추면 아쉽지. 이 멋진 자동화 스크립트를 나만 쓸 게 아니라, 코딩을 모르는 동료에게도 선물할 수 있다면 얼마나 좋을까? 다음 챕터에서는 바로 그 방법을 알아볼 거야!

나만 쓰는 스크립트는 이제 그만! 동료에게 선물하기 🎁

우리가 만든 자동화 스크립트, 정말 대단하지 않아? 하지만 지금까지의 스크립트는 한 가지 아쉬운 점이 있어. 바로 코드를 아는 '나'만, 내 컴퓨터에서만 실행할 수 있다는 거야. 만약 이 편리한 기능을 코딩을 전혀 모르는 동료도 마우스 클릭 몇 번으로 쉽게 사용할 수 있게 만들어준다면? 당신은 팀의 영웅, '자동화의 전도사'가 될 수 있을 거야! 🦸

이번 챕터에서는 우리가 만든 스크립트에 '얼굴'을 만들어주고(GUI), 파이썬이 설치되지 않은 컴퓨터에서도 실행될 수 있도록 '완제품'으로 포장하는 방법을 배울 거야.

GUI: 내 스크립트에 얼굴 만들어주기 (PySimpleGUI)

GUI(Graphical User Interface)는 우리가 평소에 사용하는 프로그램들처럼 버튼, 입력창, 텍스트 상자 등이 있는 그래픽 화면을 말해. 파이썬으로 GUI를 만드는 라이브러리는 `Tkinter`, `PyQt`, `wxPython` 등 여러 가지가 있지만, 초보자가 가장 쉽고 빠르게 그럴듯한 프로그램을 만들 수 있는 건 단연 `PySimpleGUI`야.

먼저 `PySimpleGUI`를 설치하자.

pip install PySimpleGUI

실전 예제: '파일 정리 스크립트'에 GUI 입히기

우리가 Level 1에서 만들었던 '다운로드 폴더 자동 정리 스크립트'를 기억하지? 매번 코드에 들어가서 폴더 경로를 수정하는 건 번거로우니, 사용자가 직접 폴더를 선택하고 '정리 시작!' 버튼을 누를 수 있는 프로그램으로 업그레이드해보자.

import PySimpleGUI as sg
import os
import shutil

# --- 파일 정리 로직 (기존 코드와 거의 동일) ---
def organize_folder(target_folder):
    # ... (Level 1에서 작성했던 파일 정리 로직 전체를 여기에 붙여넣기) ...
    # 단, print() 대신 sg.Print()나 다른 GUI 업데이트 방식을 사용하면 더 좋음
    # 여기서는 간단하게 print()를 유지하고, 실행 결과를 터미널에서 확인
    
    dest_folders = {
        "images": [".jpg", ".jpeg", ".png", ".gif", ".bmp"],
        "documents": [".pdf", ".docx", ".pptx", ".xlsx", ".hwp", ".txt"],
        "archives": [".zip", ".rar", ".7z", ".gz"],
    }
    
    try:
        all_files = os.listdir(target_folder)
        for file in all_files:
            file_path = os.path.join(target_folder, file)
            if os.path.isdir(file_path):
                continue
            
            filename, extension = os.path.splitext(file)
            extension = extension.lower()

            moved = False
            for folder_name, extensions in dest_folders.items():
                if extension in extensions:
                    dest_path = os.path.join(target_folder, folder_name)
                    if not os.path.exists(dest_path):
                        os.makedirs(dest_path)
                    shutil.move(file_path, dest_path)
                    print(f"'{file}' -> '{folder_name}' 폴더로 이동 완료!")
                    moved = True
                    break
            
            if not moved:
                etc_path = os.path.join(target_folder, "etc")
                if not os.path.exists(etc_path):
                    os.makedirs(etc_path)
                shutil.move(file_path, etc_path)
                print(f"'{file}' -> 'etc' 폴더로 이동 완료!")
        
        return True, "폴더 정리가 성공적으로 완료되었습니다!"
    except Exception as e:
        return False, f"오류가 발생했습니다: {e}"


# --- GUI 레이아웃 정의 ---
sg.theme("SystemDefault") # 윈도우/맥 기본 테마

layout = [
    [sg.Text("파일 자동 정리 프로그램", font=("Helvetica", 18))],
    [sg.Text("정리할 폴더를 선택해주세요.", size=(25, 1)), sg.InputText(key="-FOLDER_PATH-"), sg.FolderBrowse("폴더 선택")],
    [sg.Button("정리 시작!", size=(15, 2), key="-START-"), sg.Button("종료", size=(10, 2))]
]

# --- 윈도우(창) 생성 ---
window = sg.Window("파일 정리 마법사 🧙", layout)

# --- 이벤트 루프 ---
while True:
    event, values = window.read() # 이벤트와 입력값을 읽어옴

    # 창을 닫거나 '종료' 버튼을 누르면 루프 종료
    if event == sg.WIN_CLOSED or event == "종료":
        break

    # '정리 시작!' 버튼을 눌렀을 때
    if event == "-START-":
        folder_path = values["-FOLDER_PATH-"] # 입력창의 값을 가져옴
        
        if folder_path and os.path.isdir(folder_path):
            # 파일 정리 함수 실행
            success, message = organize_folder(folder_path)
            if success:
                sg.popup("성공!", message)
            else:
                sg.popup_error("오류!", message)
        else:
            sg.popup_error("오류!", "유효한 폴더를 선택해주세요.")

# --- 창 닫기 ---
window.close()

`PySimpleGUI`의 작동 방식은 정말 직관적이야.
1. `layout`이라는 리스트 안에, 프로그램 창에 들어갈 요소들([`Text`], [`InputText`], [`Button`] 등)을 한 줄 한 줄 쌓아서 디자인해. 각 요소에 `key`를 부여하면 나중에 그 요소의 값을 읽거나 이벤트를 감지할 수 있어.
2. `sg.Window()`로 이 레이아웃을 가진 창을 만들어.
3. `while True:` 이벤트 루프를 돌면서 `window.read()`로 사용자의 행동(버튼 클릭 등)을 계속 감시해.
4. 사용자가 버튼을 누르면(`event == "-START-"`), 해당 이벤트에 맞는 로직(파일 정리 함수 호출)을 실행하는 거야.
5. `sg.popup()`을 사용해서 사용자에게 작업 결과를 알려주는 팝업창을 띄워줘.

이제 동료는 더 이상 검은 터미널 화면을 무서워할 필요가 없어. 그저 이 프로그램을 실행하고, 폴더를 선택한 뒤 버튼만 누르면 되니까! 이렇게 만든 프로그램을 동료에게 공유하거나, 더 나아가 **재능넷** 같은 플랫폼에서 여러분의 자동화 스킬을 서비스로 제공해볼 수도 있겠지?

실행 파일(.exe) 만들기: 파이썬 없이도 실행되게! (PyInstaller)

자, 이제 마지막 단계야. GUI까지 입힌 멋진 프로그램을 만들었지만, 이걸 동료에게 주려면 동료 컴퓨터에도 파이썬과 `PySimpleGUI` 라이브러리가 설치되어 있어야 해. 너무 번거롭지? 이 문제를 해결해 주는 것이 바로 `PyInstaller`야.

`PyInstaller`는 우리의 파이썬 스크립트(`.py`)와 그것이 실행되는 데 필요한 모든 라이브러리를 하나의 실행 파일(`.exe` for Windows, `.app` for macOS)로 꽁꽁 묶어서 포장해 주는 도구야. 이 파일 하나만 있으면, 파이썬이 설치되지 않은 어떤 컴퓨터에서도 더블 클릭만으로 우리 프로그램을 실행할 수 있어!

먼저 `PyInstaller`를 설치하자.

pip install pyinstaller

사용법은 허무할 정도로 간단해. 터미널에서 우리가 실행 파일로 만들고 싶은 파이썬 파일이 있는 폴더로 이동한 뒤, 아래 명령어를 입력하면 끝이야.

pyinstaller --onefile --noconsole your_script_name.py
  • `pyinstaller`: PyInstaller를 실행하라는 명령어.
  • `--onefile`: 모든 것을 하나의 실행 파일로 묶어달라는 옵션이야. (이걸 안 쓰면 여러 파일이 담긴 폴더 형태로 만들어져.)
  • `--noconsole` 또는 `--windowed`: GUI 프로그램의 경우, 실행했을 때 뒤에 검은 콘솔 창(터미널)이 뜨지 않도록 해주는 아주 중요한 옵션이야!
  • `your_script_name.py`: 변환하고 싶은 파이썬 파일 이름. (위 예제에서는 `gui_organizer.py`가 되겠지?)

이 명령을 실행하면 터미널에 여러 메시지가 올라가면서 빌드 과정이 진행돼. 잠시 기다리면 프로젝트 폴더 안에 `dist`라는 폴더가 생기고, 그 안에 마법처럼 `.exe` 파일이 만들어져 있을 거야! 이제 이 파일만 동료에게 보내주면, 당신은 진정한 '문제 해결사'로 인정받게 될 거야. 😎

이제 당신도 '자동화 능력자'!

와, 정말 긴 여정이었어! 여기까지 함께 달려온 당신, 정말 대단해! 👏 우리는 파이썬이라는 마법 지팡이를 처음 손에 쥐는 법부터 시작해서, 파일 정리, 웹 서핑, 엑셀/워드 제어, 이메일 발송, 스케줄링, 그리고 GUI 앱 제작과 배포까지, '자동화'라는 마법의 거의 모든 주문을 섭렵했어.

처음엔 막막하게만 느껴졌던 '코딩'이, 이제는 내 삶을 더 편하고 윤택하게 만들어주는 강력한 '도구'로 느껴지지 않아? 지긋지긋한 반복 업무를 스크립트에게 맡기고 얻은 시간으로, 우리는 더 창의적이고 중요한 일에 집중할 수 있게 됐어. 이것이 바로 우리가 자동화를 배우는 궁극적인 이유야.

물론, 오늘 배운 것이 자동화의 전부는 아니야. 데이터 분석 라이브러리인 `Pandas`를 배우면 더 복잡한 데이터 처리도 순식간에 해낼 수 있고, 이미지 처리 라이브러리 `Pillow`를 사용하면 수천 장의 이미지에 워터마크를 박는 일도 자동화할 수 있어. 자동화의 세계는 무궁무진하고, 오늘 우리는 그 세계로 들어가는 가장 중요한 열쇠를 손에 넣은 거야.

두려워하지 말고, 계속해서 당신의 일상 속 불편함을 찾아봐. 그리고 "이것도 파이썬으로 자동화할 수 있지 않을까?"라고 질문을 던져봐. 작은 성공들이 쌓이다 보면, 어느새 당신은 주변 동료들의 문제를 해결해 주는 든든한 '자동화 전문가'가 되어 있을 거야. 여러분의 자동화 여정은 이제 시작입니다. 꾸준히 배우고 적용하다 보면, 언젠가 다른 사람의 반복 업무를 해결해주는 전문가가 될 수도 있을 거예요. **재능넷**과 같은 곳에서 여러분의 능력을 펼칠 날을 기대해 봅니다!

이제 당신의 손으로 직접, 당신의 '칼퇴'를, 당신의 '저녁이 있는 삶'을 만들어봐. 당신은 이미 그럴 자격이 충분한 '자동화 능력자'니까! 💪

댓글 작성

이 글에 대한 여러분의 생각을 들려주세요

댓글 0
댓글을 불러오는 중입니다.

아직 댓글이 없습니다.