📔
실습 프로젝트 (Practice) · ★★★
날짜별 파일
Lv3 · 일기장
diary/YYYY-MM-DD.txt 파일로 일기를 관리. 작성·조회·검색 + 다중행 입력과 키워드 매치 기능을 갖춥니다.
pathlib파일 I/O검색
소요 시간
⏱ 3~5시간
난이도
📊 중급 종합
선수 조건
🎯 중급 4, 6주차
결과물
Path 와 글롭으로 파일 컬렉션 관리
이 강의에서 배우는 것
- 1pathlib.Path 로 파일 읽기/쓰기
- 2glob 으로 파일 컬렉션 순회
- 3다중행 입력 (빈 줄 두 번 종료)
프로젝트 개요
- 디렉토리 diary/ 안에 YYYY-MM-DD.txt
- 명령: write / read <날짜> / list / search <키워드> / quit
- 같은 날짜 재작성 시 덮어쓸지 확인
도전 과제
- 키워드 검색 시 매치 라인 + 날짜
- 통계 (총 작성일, 평균 길이)
채점 체크리스트
- 디렉토리 자동 생성
- 다중행 입력
- 검색 결과
💻 예제 (examples)
실제로 실행해 결과를 확인할 수 있는 예제 코드입니다.
solution.py— 전체 동작 코드
CODE
"""일기장 — 날짜별 파일"""
from pathlib import Path
from datetime import date
DIARY = Path("diary")
DIARY.mkdir(exist_ok=True)
def write_today():
today = date.today().isoformat()
f = DIARY / f"{today}.txt"
if f.exists():
if input(f"{today} 이미 있음. 덮어쓸까? (y/n): ").lower() != "y":
return
print("내용 입력 (빈 줄 두 번이면 종료):")
lines = []
blank = 0
while True:
line = input()
if line == "":
blank += 1
if blank >= 2: break
lines.append("")
else:
blank = 0
lines.append(line)
f.write_text("\n".join(lines), encoding="utf-8")
print(f"저장됨 ({f})")
def read(date_str):
f = DIARY / f"{date_str}.txt"
if not f.exists():
print("없음"); return
print(f.read_text(encoding="utf-8"))
def list_all():
files = sorted(DIARY.glob("*.txt"))
for f in files:
size = len(f.read_text(encoding="utf-8"))
print(f" {f.stem} ({size}자)")
print(f"\n총 {len(files)}일")
def search(keyword):
for f in sorted(DIARY.glob("*.txt")):
text = f.read_text(encoding="utf-8")
for i, line in enumerate(text.splitlines(), 1):
if keyword in line:
print(f"[{f.stem} L{i}] {line}")
def main():
while True:
raw = input("\n명령(write/read <date>/list/search <q>/quit): ").strip()
if not raw: continue
if raw == "quit": break
parts = raw.split(maxsplit=1)
cmd = parts[0]
arg = parts[1] if len(parts) > 1 else ""
if cmd == "write": write_today()
elif cmd == "read":
read(arg if arg else date.today().isoformat())
elif cmd == "list": list_all()
elif cmd == "search":
if arg: search(arg)
if __name__ == "__main__":
main()▶ 실행 결과
명령: write
내용 입력 (빈 줄 두 번이면 종료):
오늘은 좋은 날.
저장됨 (diary/2026-05-10.txt)
명령: list
2026-05-10 (10자)
총 1일
명령: search 좋은
[2026-05-10 L1] 오늘은 좋은 날.📝 과제 (exercises)
직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.
과제 1
프로젝트 구현
목표: 위 사양대로 직접 작성한다.
요구사항
- pathlib.Path
- 다중행 입력
- glob 검색
💡 힌트
DIARY.glob('*.txt')
f.stem 으로 확장자 제거
입출력 예시
[2026-05-10 L1] 오늘은 좋은 날.채점
- · 디렉토리 생성
- · 검색 정확
▶정답 코드 펼치기 / 접기
SOLUTION
# 위 solution.py 와 동일▶ 실행 결과
(예제 참고)