← 파이썬 강의 목록으로
📔
실습 프로젝트 (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 와 동일
▶ 실행 결과
(예제 참고)
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗