Devin.KR

CSV·JSON으로 기록 저장하고 다시 읽기

메모리의 기록을 파일에 보관하고 데이터 손실을 검증합니다.

진도 0%

레슨

  1. 파일 저장과 재실행

    파일 핸들을 닫고 메모리·디스크 수명을 구분합니다.

  2. CSV 행과 열 해석하기

    쉼표·한글·빈 값의 처리 규칙을 정합니다.

  3. JSON 자료형 유지하기

    문자열·숫자·참값·목록을 구분합니다.

  4. 변환 왕복과 손실 검사

    누락·중복·인코딩 문제를 비교로 찾습니다.

독서 기록의 CSV 가져오기와 JSON 지속 저장을 추가합니다.

m05 미션 solution 전체와 기존 35개 unittest를 이어받아 persistence.py를 추가합니다. CSV 전체 검증이 성공하면 가져온 목록 전체로 JSON을 교체하고 새 실행에서 ID 저장소를 재구성합니다.

요구사항

  • UTF-8 CSV를 읽어 모든 행을 검증한 뒤 JSON 파일에 저장합니다.
  • 오류 행 번호를 보고하고 검증 실패 시 기존 저장 파일을 덮어쓰지 않습니다.
  • 저장 파일이 없는 첫 실행과 손상된 JSON을 구분합니다.
  • read_csv(path)→새 ID 저장소, load_store(path)→ID 저장소, save_store(path,store)→전체 저장, import_csv(source,destination)→저장한 새 ID 저장소 API를 구현합니다. JSON 최상위는 기록 목록, 필드는 id/title/pages/cost/completed이며 정수 completed는 0·1을 유지합니다.
  • CSV 헤더는 id,title,pages,cost,completed 순서입니다. BOM 유무를 허용하고 열 부족·초과·빈 금액·중복 ID를 거부합니다. ROW N은 오류 레코드 끝 물리적 줄 번호입니다.
  • 가져오기는 합치기가 아닌 전체 교체입니다. 헤더만 있는 CSV는 빈 목록으로 교체합니다. JSON이 없을 때만 첫 실행으로 처리하고 빈 파일·문법 손상·자료형 오류·중복 키·중복 ID는 거부합니다.
  • 파일 저장 전에 검증·직렬화를 마치고 같은 폴더의 임시 파일을 닫은 후 replace합니다. 부모 폴더는 존재해야 합니다. 읽기 실패·검증 실패·교체 실패에서 기존 파일 보존과 임시 파일 정리를 검사합니다.

완료 기준

  • 재실행해도 이전 ID·한글 제목·쪽수·완료 값이 동일합니다.
  • 제목에 쉼표가 있는 행이 왕복 보존되고 숫자는 JSON 정수로 저장됩니다.
  • 잘못된 한 행이 포함된 가져오기와 손상 파일 읽기 테스트에서 기존 데이터가 유지됩니다.
  • 기존 35개와 신규 14개, 총 49개 unittest가 통과합니다. 새 Python 프로세스에서 제목을 읽고 실패한 가져오기 전후 대상 파일 바이트가 같은지 검사합니다.
python3 -m unittest discover -s tests -p "test_*.py"
미션 시작 코드
모범 답안모범 답안 내려받기

검토 기준

  • 입력 오류를 조용히 건너뛰지 않고 처리 정책을 설명합니다.
  • 파일을 닫는 시점과 저장 전 검증 순서를 설명합니다.
  • docs/persistence.md에 전체 교체 정책·오류 줄 번호·첫 실행 구별·단일 작성자 범위를 설명합니다. 정전 내구성과 동시 수정 충돌 해결은 이번 구현의 보장 범위에 포함하지 않습니다.