Os 모듈, Shutil 모듈
1. os 모듈: 운영체제(OS)와의 상호작용
os 모듈은 "길 찾기"와 "기초 공사"에 특화되어 있습니다. 현재 내 위치가 어디인지, 경로를 어떻게 합치는지, 폴더를 새로 만들거나 지우는 등의 기본적인 OS 명령을 수행합니다.
- 경로 관리: getcwd(현재 위치), abspath(절대 경로), join(경로 합성)
- 파일/폴더 확인: exists(존재 여부), isfile(파일인가?), isdir(폴더인가?)
- 단순 조작: makedirs(폴더 생성), remove(파일 삭제), rename(이름 변경/이동)
[코드 예시: 경로 합성 및 폴더 생성]
import os
# 1. 안전하게 경로 합치기 (슬래시/역슬래시 고민 해결)
base_path = os.getcwd()
new_folder = "my_data"
full_path = os.path.join(base_path, new_folder)
# 2. 폴더가 없을 때만 생성하기
if not os.path.exists(full_path):
os.makedirs(full_path)
print(f"폴더 생성 완료: {full_path}")
경로(Path) 관련 (os.path)
- os.path.join(path1, path2): 경로와 파일명을 운영체제에 맞게 합칩니다. (가장 많이 사용!)
- os.path.abspath(path): 상대 경로를 절대 경로(전체 주소)로 바꿉니다.
- os.path.dirname(path) / os.path.basename(path): 경로에서 폴더명만 혹은 파일명만 추출합니다.
- os.path.exists(path): 해당 경로에 파일이나 폴더가 실제로 있는지 확인합니다.
- os.path.isfile() / os.path.isdir(): 대상이 파일인지 폴더인지 구분합니다.
- os.path.getsize(path): 파일의 크기를 바이트(byte) 단위로 가져옵니다.
디렉토리 및 시스템 관련
- os.getcwd(): 현재 작업 중인 폴더 위치를 가져옵니다.
- os.chdir(path): 작업 폴더를 변경합니다.
- os.listdir(path): 폴더 안의 모든 파일과 폴더 목록을 리스트로 반환합니다.
- os.makedirs(path, exist_ok=True): 폴더를 생성합니다. (하위 폴더까지 한 번에 생성 가능)
- os.remove(path): 파일을 삭제합니다.
- os.rename(src, dst): 이름 변경 또는 이동(같은 드라이브 내)을 수행합니다.
2. shutil 모듈: 고수준 파일 조작 (High-level)
shutil은 'Shell Utilities'의 약자로, os 모듈보다 "더 복잡하고 강력한 기능"을 제공합니다. 파일의 내용을 복사하거나, 폴더 전체를 통째로 옮기는 등 실제 '파일 관리자' 같은 일을 합니다.
- 복사: copy(파일 복사), copytree(폴더 전체 복사)
- 이동/삭제: move(파일/폴더 이동), rmtree(폴더 안의 내용까지 싹 삭제)
- 특징: os.rename은 드라이브가 다르면 이동이 안 되지만, shutil.move는 드라이브 간 이동도 지원합니다.
[코드 예시: 폴더 통째로 백업하기]
import shutil
source = "./work_folder"
backup = "./backup_folder"
# 폴더 안의 모든 파일과 하위 폴더를 한 번에 복사
try:
shutil.copytree(source, backup)
print("전체 백업 성공!")
except FileExistsError:
print("이미 백업 폴더가 존재합니다.")
shutil은 '복사'나 '이동', 그리고 '일괄 삭제'처럼 덩어리가 큰 작업을 한 줄로 끝낼 때 사용합니다.
- shutil.copy(src, dst): 파일을 복사합니다. (권한은 복사되지만 메타데이터는 미포함)
- shutil.copy2(src, dst): 파일을 복사하면서 생성 시간 등 메타데이터까지 그대로 보존합니다. (백업 시 권장)
- shutil.copytree(src, dst): 폴더 전체를 내부 파일까지 통째로 복사합니다.
- shutil.move(src, dst): 파일이나 폴더를 이동시킵니다. (드라이브가 달라도 이동 가능)
- shutil.rmtree(path): 폴더 내부에 파일이 들어있어도 묻지 않고 통째로 삭제합니다. (주의해서 사용!)
3. os vs shutil 한눈에 비교
| 기능 | os 모듈 | shutil 모듈 |
| 파일 복사 | 직접 구현 필요 (open/read/write) | shutil.copy()로 한 줄 해결 |
| 폴더 삭제 | os.rmdir() (비어있어야 함) | shutil.rmtree() (내용물 있어도 삭제) |
| 위치 이동 | os.rename() (같은 드라이브만) | shutil.move() (드라이브 무관) |
| 주요 목적 | 경로 제어, 시스템 정보 확인 | 파일/폴더의 대량 복사, 이동, 삭제 |
Random 모듈
1. random 모듈: 파이썬에서 무작위성(Randomness)이 필요한 모든 곳에 쓰이는 필수 도구
2. 숫자 생성 (무작위 수 뽑기)
가장 기본이 되는 숫자를 뽑는 방식입니다. 정수냐 실수냐에 따라 사용법이 달라요.
- randint(a, b): a 이상 b 이하의 정수 (끝값 포함)
- randrange(a, b): a 이상 b 미만의 정수 (끝값 포함 안 함)
- uniform(a, b): a 이상 b 이하의 랜덤한 실수
import random
print(random.randint(1, 10)) # 1, 2, ..., 10 중 하나
print(random.randrange(1, 10)) # 1, 2, ..., 9 중 하나
print(random.uniform(1.0, 10.0)) # 1.23, 5.67 같은 실수
3. 리스트 조작 (항목 선택 및 섞기)
리스트 안에 있는 데이터 중 하나를 고르거나 순서를 바꿀 때 사용합니다.
- choice(seq): 리스트에서 하나만 무작위로 선택
- sample(seq, k): 리스트에서 중복 없이 k개 선택 (로또 번호용)
- choices(seq, k): 리스트에서 중복 허용해서 k개 선택 (비밀번호용)
- shuffle(seq): 리스트의 순서를 그 자리에서(in-place) 무작위로 섞음
fruits = ['사과', '바나나', '포도', '딸기']
print(random.choice(fruits)) # 하나만 골라!
print(random.sample(fruits, k=2)) # 중복 없이 두 개 골라!
random.shuffle(fruits) # 순서 섞어!
print(fruits)
3. 핵심 명령어 한눈에 보기 (치트 시트)
| 명령어 | 결과 타입 | 주요 특징 | 추천 용도 |
| random() | 실수(float) | 0.0 ~ 1.0 사이 값 | 확률 계산 (예: 20% 확률 성공) |
| randint(a, b) | 정수(int) | b를 포함함 | 주사위, 게임 대미지 계산 |
| choice(list) | 단일 항목 | 리스트 요소 하나 반환 | 메뉴 고르기, 당첨자 1명 뽑기 |
| sample(list, k) | 리스트(list) | 중복 없음 | 로또, 카드 게임(패 돌리기) |
| choices(list, k) | 리스트(list) | 중복 허용 | 비밀번호 조합, 가중치 뽑기 |
| shuffle(list) | None | 원본 리스트를 바꿈 | 노래 재생 목록 섞기 |
Math 모듈
1. math 모듈: 복잡한 수학 연산을 간단하게 처리할 수 있도록 도와주는 내장 모듈
2. 소수점 처리 (올림·내림·반올림)
가장 자주 쓰이는 기능들입니다. 특히 음수 처리 시 결과값이 직관과 다를 수 있으니 주의해야 합니다.
| 기능 | 함수 | 설명 | 예시 |
| 올림 | math.ceil(x) | x보다 크거나 같은 가장 작은 정수 | ceil(1.4) → 2 |
| 내림 | math.floor(x) | x보다 작거나 같은 가장 큰 정수 | floor(1.7) → 1 |
| 반올림 | round(x) | 소수점 첫째 자리에서 반올림 (파이썬 내장 함수) | round(1.5) → 2 |
💡 참고: round()는 math 모듈 소속이 아닌 파이썬 기본 내장 함수입니다. 또한 파이썬의 round는 오사오입(Round to nearest even) 방식을 택하고 있어 round(0.5)가 0이 되는 특이점이 있습니다.
3. 수치 계산 (제곱근·팩토리얼)
수학적 공식에 자주 등장하는 연산들입니다.
- 제곱근 (math.sqrt(x)): $x$의 루트 값을 구합니다. 결과는 항상 실수(float) 타입입니다.
- math.sqrt(16) → 4.0
- 팩토리얼 (math.factorial(x)): $1$부터 $x$까지의 모든 양의 정수를 곱합니다.
- math.factorial(5) → $5 \times 4 \times 3 \times 2 \times 1 = 120$
4. 수학적 상수
파이썬이 미리 저장해둔 정밀한 수학 상수값입니다.
- 원주율 (math.pi): 원의 둘레나 넓이를 구할 때 쓰는 $\pi$ 값입니다.
- 3.141592653589793
- 자연상수 (math.e): 로그 계산 등에 쓰이는 $e$ 값입니다. (약 2.718)
import math
# 1. ceil() - 올림
print(math.ceil(1.4)) # 2
print(math.ceil(1.7)) # 2
print(math.ceil(-1.4)) # -1
# 2. round() - 반올림
print(round(1.4)) # 1
print(round(1.7)) # 2
print(round(1.5)) # 2
print(round(-1.5)) # -2
# 3. floor() - 내림
print(math.floor(1.7)) # 1
print(math.floor(1.4)) # 1
print(math.floor(-1.7)) # -2
# 4. sqrt() - 제곱근
print(math.sqrt(4)) # 2.0
print(math.sqrt(2)) # 1.4142135623730951
# 5. factorial() - 계승
print(math.factorial(5)) # 120 (5! = 5 × 4 × 3 × 2 × 1)
print(math.factorial(3)) # 6 (3! = 3 × 2 × 1)
# 6. pi - 원주율
print(math.pi) # 3.141592653589793
Datetime 모듈
1. math 모듈: 복잡한 수학 연산을 간단하게 처리할 수 있도록 도와주는 내장 모듈
2. 날짜와 시간 객체 생성 및 정보 추출
날짜만 다루는 date, 시간까지 포함하는 datetime 객체가 있습니다. 각 속성(.year, .month 등)을 통해 세부 정보를 꺼낼 수 있습니다.
import datetime as dt
# 현재 시점 추출
now = dt.datetime.now()
# 특정 날짜 지정 (년, 월, 일, 시, 분, 초)
xmas = dt.datetime(2024, 12, 25, 10, 30)
print(now) # 2023-10-05 14:30:00.123456
print(now.year) # 2023
print(now.month) # 10
print(now.day) # 5
print(now.hour) # 14
print(now.minute) # 30
print(now.second) # 0
print(now.microsecond) # 123456
print(now.weekday()) # 3 (0: 월요일, 1: 화요일, ..., 6: 일요일) # 개발자 친화적
print(now.isoweekday()) # 4 (1: 월요일, 2: 화요일, ..., 7: 일요일) # 국제 표준
* 주요 포맷 코드
| 코드 | 설명 | 예시 |
| %Y | 4자리 연도 | 2026 |
| %m | 2자리 월 | 05 |
| %d | 2자리 일 | 04 |
| %H | 24시간제 시 | 18 |
| %I | 12시간제 시 | 6 |
| %M | 분 | 33 |
| %S | 초 | 12 |
| %A | 요일 이름 | Monday |
| %B | 월 이름 | January |
3. 문자와 시간의 변환 (Formatting & Parsing)
가장 많이 헷갈리는 부분이지만, 약자만 기억하면 쉽습니다.
- strftime: 시간 → 문자(String from time) / "출력용"
- strptime: 문자 → 시간(String parse time) / "입력받은 데이터 처리용"
# 1. 시간 객체를 예쁜 문자열로 바꾸기 (출력)
now_str = now.strftime('%Y년 %m월 %d일')
print(now_str) # 예: 2026년 05월 04일
# 2. 문자열 데이터를 시간 객체로 바꾸기 (계산 가능한 상태로 변환)
date_str = "2025-01-01"
converted = dt.datetime.strptime(date_str, "%Y-%m-%d")
4. 날짜 계산 (timedelta)
날짜에 특정 기간을 더하거나 뺄 때는 timedelta 객체를 사용합니다. "며칠 전", "몇 시간 후" 등을 계산할 때 필수입니다.
from datetime import datetime, timedelta
now = datetime.now()
# 100일 후 계산
d_100 = now + timedelta(days=100)
# 1주일 전 계산
last_week = now - timedelta(weeks=1)
# 두 날짜 사이의 차이 구하기
diff = d_100 - now
print(diff.days) # 100
Time 모듈
1. time 모듈: 파이썬에서 날짜뿐만 아니라 프로그램의 실행 시간 측정, 일시 정지, 운영체제의 시간 데이터를 다룰 때 주로 사용
2. 타임스탬프 (Unix Time)
time.time()은 1970년 1월 1일 0시 0분 0초 이후부터 현재까지 경과한 시간을 초(second) 단위의 실수로 반환합니다. 이를 '타임스탬프'라고 부르며, 프로그램 성능 측정(코드 실행 시간 계산)에 자주 쓰입니다.
import time
start = time.time() # 시작 시간 기록
# 작업 수행 (예: 1초 대기)
time.sleep(1)
end = time.time() # 종료 시간 기록
print(f"작업 소요 시간: {end - start:.2f}초")
2. 구조적 시간 (struct_time)
time.localtime()은 초 단위의 숫자를 우리가 읽기 쉬운 형태(연, 월, 일, 시, 분, 초 등)의 객체로 변환해줍니다.
import time
now_struct = time.localtime()
print(f"현재 연도: {now_struct.tm_year}")
print(f"현재 월: {now_struct.tm_mon}")
3. 시간 포맷팅 (strftime)
구조적 시간 데이터를 원하는 형식의 문자열로 변환할 때 사용합니다. datetime의 strftime과 사용법이 거의 동일합니다.
import time
now = time.localtime()
# 사용자가 보기 편한 포맷으로 변환
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", now)
print("현재 시간:", formatted_time) # 출력: 2026-05-04 18:45:12
* time모듈 vs datetime 모듈
보내주신 일정 관리 코드에서는 두 모듈이 섞여 사용될 수 있는데, 보통 다음과 같이 구분해서 씁니다.
| 특징 | time 모듈 | datetime 모듈 |
| 주요 용도 | 시스템 시간 확인, 실행 속도 측정 | 날짜 계산, 일정 관리, 기간 비교 |
| 장점 | 가볍고 시스템(OS) 친화적 | 날짜 간의 뺄셈/더하기가 매우 쉬움 |
| 비유 | 스톱워치나 유닉스 서버 시계 | 탁상 달력이나 플래너 |
느낀점
오늘은 지금까지 사용해왔던 모듈이나 자주 사용하는 모듈에 대해 알아보았다. 사용되는 모듈이 많고 그 모듈에 대한 메소드나, 클래스등 사용하는 명령어들도 많기 때문에 이걸 외운다기 보다는 이해하고 이런 메소드가 있구나라고 받아들이고 넘긴 것 같다.
——————————————————————————
본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.
'학습일지' 카테고리의 다른 글
| [스나이퍼팩토리] 한컴AI아카데미(26.05.07) (1) | 2026.05.07 |
|---|---|
| [스나이퍼팩토리] 한컴AI아카데미(26.05.06) (0) | 2026.05.07 |
| [스나이퍼팩토리] 한컴AI아카데미(영단어장 리뷰) (0) | 2026.04.30 |
| [스나이퍼팩토리] 한컴AI아카데미(26.04.29) (0) | 2026.04.29 |
| [스나이퍼팩토리] 한컴AI아카데미(26.04.28) (0) | 2026.04.28 |