JSON·CSV 데이터 처리, 모듈·패키지 시스템, 가상환경 관리를 완전히 익히며 40강 파이썬 입문 시리즈를 마무리한다.
🎯 이 강의에서 배우는 것
파이썬의 힘은 언어 자체만이 아닙니다. 방대한 표준 라이브러리와 풍부한 서드파티 생태계가 합쳐져 강력해집니다. 이 마지막 강의에서는 실무에서 매일 쓰는 JSON·CSV 데이터 처리, 코드를 구조화하는 모듈과 패키지, 의존성을 격리하는 가상환경을 완전히 익힙니다. 40강 시리즈를 마무리하며 앞으로의 학습 방향도 제시합니다.
📋 JSON 처리 — 직렬화와 역직렬화
import json
from datetime import datetime
from pathlib import Path
# 파이썬 타입 ↔ JSON 타입 매핑
# dict ↔ object {}
# list ↔ array []
# str ↔ string
# int/float ↔ number
# bool ↔ boolean (true/false, 소문자!)
# None ↔ null
# json.dumps: 파이썬 → JSON 문자열
data = {
"name": "홍길동",
"age": 30,
"active": True,
"score": None,
"tags": ["python", "backend"],
}
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print(json_str)
# {
# "name": "홍길동",
# "age": 30,
# ...
# }
# json.loads: JSON 문자열 → 파이썬
parsed = json.loads(json_str)
print(type(parsed)) # <class 'dict'>
print(parsed["name"]) # 홍길동
# 파일에서 읽고 쓰기
path = Path("data.json")
with path.open("w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
with path.open("r", encoding="utf-8") as f:
loaded = json.load(f)
path.unlink()
# 사용자 정의 객체 직렬화
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat() # "2024-01-15T10:30:00"
return super().default(obj)
event = {"title": "파이썬 강의", "created_at": datetime.now()}
print(json.dumps(event, cls=DateTimeEncoder, ensure_ascii=False))
# object_hook: 역직렬화 시 커스터마이징
def datetime_hook(d: dict) -> dict:
for key, value in d.items():
if key.endswith("_at") and isinstance(value, str):
try:
d[key] = datetime.fromisoformat(value)
except ValueError:
pass
return d
json_with_dates = json.dumps(event, cls=DateTimeEncoder, ensure_ascii=False)
restored = json.loads(json_with_dates, object_hook=datetime_hook)
print(type(restored["created_at"])) # <class 'datetime.datetime'>
📊 CSV 처리 — 표 형식 데이터
import csv
from pathlib import Path
import io
# CSV 쓰기
students = [
{"name": "홍길동", "score": 85, "grade": "B"},
{"name": "이순신", "score": 95, "grade": "A"},
{"name": "강감찬", "score": 72, "grade": "C"},
]
csv_path = Path("students.csv")
with csv_path.open("w", newline="", encoding="utf-8-sig") as f:
# utf-8-sig: BOM 포함 — 엑셀에서 한글 정상 출력
# newline="" 필수: csv 모듈이 줄바꿈을 직접 제어
writer = csv.DictWriter(f, fieldnames=["name", "score", "grade"])
writer.writeheader()
writer.writerows(students)
# CSV 읽기
with csv_path.open("r", encoding="utf-8-sig") as f:
reader = csv.DictReader(f)
for row in reader:
print(f"{row['name']}: {row['score']}점 ({row['grade']})")
# 실전: 데이터 필터링과 집계
with csv_path.open("r", encoding="utf-8-sig") as f:
reader = csv.DictReader(f)
rows = list(reader)
high_scorers = [r for r in rows if int(r["score"]) >= 80]
avg_score = sum(int(r["score"]) for r in rows) / len(rows)
print(f"80점 이상: {[r['name'] for r in high_scorers]}")
print(f"평균 점수: {avg_score:.1f}")
csv_path.unlink()
# 특수 설정
# csv.reader(f, delimiter=" ") — TSV 파일 (탭 구분)
# csv.reader(f, quotechar="|") — 커스텀 인용 문자
📦 모듈과 패키지 — 코드 구조화
import sys
# import 실행 흐름:
# 1. sys.modules에서 이미 로드된 모듈 확인 (캐시)
# 2. 없으면 sys.path 탐색 (설치 패키지 → 표준 라이브러리 등)
# 3. 모듈 파일 실행 (한 번만!)
# 4. sys.modules에 캐시
print(sys.path) # 탐색 경로 확인
# 이미 로드된 모듈 목록
print("json" in sys.modules) # True (이미 사용했으니)
print("re" in sys.modules) # False (아직 안 씀)
import re
print("re" in sys.modules) # True
# if __name__ == "__main__" 패턴
# 모듈을 직접 실행할 때: __name__ == "__main__"
# 모듈을 import할 때: __name__ == 모듈 이름
# math_utils.py 예시:
# def add(a, b): return a + b
# if __name__ == "__main__":
# print(add(3, 4)) # 직접 실행 시에만
# 패키지 구조 예시:
# myproject/
# __init__.py ← 패키지 선언, 공개 API 제어
# utils/
# __init__.py
# math.py
# string.py
# models/
# __init__.py
# user.py
# __init__.py에서 공개 API 제어
# from .math import add, subtract # 상대 임포트
# __all__ = ["add", "subtract"] # from myproject import * 제어
# import 방식
import json # 모듈 임포트
import json as j # 별칭
from json import dumps, loads # 특정 이름만
from pathlib import Path # 패키지.모듈에서 클래스
🏝️ 가상환경과 의존성 관리
# 가상환경: 프로젝트마다 독립된 파이썬+패키지 환경
# 터미널에서 실행:
# 생성
# python -m venv .venv
# 활성화
# Windows: .venv\Scripts\activate
# macOS/Linux: source .venv/bin/activate
# 비활성화
# deactivate
# 패키지 관리 (pip)
# pip install requests # 설치
# pip install requests==2.31.0 # 특정 버전
# pip install -r requirements.txt # 목록 설치
# pip freeze > requirements.txt # 현재 환경 저장
# pip list # 설치된 패키지 확인
# pip uninstall requests # 제거
# requirements.txt 예시:
# requests==2.31.0
# pandas==2.1.4
# python-dotenv==1.0.0
# 현대적 방법: pyproject.toml (PEP 621 표준)
# [project]
# name = "myproject"
# version = "0.1.0"
# requires-python = ">=3.11"
# dependencies = [
# "requests>=2.31",
# "pandas>=2.0",
# ]
# 실용적인 현대 도구들:
# uv (Astral) — pip보다 10~100배 빠른 패키지 관리자
# uv init myproject # 프로젝트 초기화
# uv add requests # 의존성 추가
# uv run python main.py
# poetry — 의존성 잠금파일 + 빌드 도구
# poetry new myproject
# poetry add requests
# poetry install
# 패키지 검색: https://pypi.org
# 표준 라이브러리 문서: https://docs.python.org
# .gitignore에 추가 필수
# .venv/
# __pycache__/
# *.pyc
# .env
🗺️ 파이썬 다음 학습 로드맵
| 분야 | 핵심 라이브러리 | 용도 |
|---|---|---|
| 웹 백엔드 | FastAPI, Django | REST API, 웹 서비스 |
| 데이터 과학 | pandas, numpy, matplotlib | 데이터 분석, 시각화 |
| 머신러닝 | scikit-learn, PyTorch | 모델 학습, 추론 |
| 자동화 | selenium, playwright, httpx | 브라우저 자동화, HTTP |
| 테스트 | pytest | 단위·통합 테스트 |
| 타입 검사 | mypy, pyright | 정적 타입 분석 |
| 비동기 | asyncio, aiohttp | 동시성 프로그래밍 |
| CLI 도구 | typer, click, rich | 커맨드라인 앱 |
# 표준 라이브러리 핵심 모듈 — 꼭 알아두세요
import os # 운영체제 인터페이스 (환경변수, 프로세스)
import sys # 인터프리터 인터페이스
import re # 정규표현식
import math # 수학 함수
import random # 난수 생성
import datetime # 날짜/시간
import time # 시간 측정
import itertools # 이터레이터 도구
import functools # 고차 함수 도구 (@lru_cache 등)
import copy # 얕은/깊은 복사
import logging # 로깅
import argparse # 커맨드라인 인수
import threading # 스레드
import multiprocessing # 프로세스
import asyncio # 비동기 I/O
import socket # 소켓 통신
import urllib # URL 처리
import http # HTTP 서버/클라이언트
import sqlite3 # SQLite 데이터베이스
import hashlib # 해시 함수
import hmac # HMAC
import base64 # 인코딩
import struct # 바이너리 데이터
import io # 스트림 I/O
import contextlib # 컨텍스트 유틸리티
import dataclasses # 데이터클래스
import typing # 타입 힌트
import abc # 추상 기반 클래스
import inspect # 인트로스펙션
import ast # 추상 구문 트리
import dis # 바이트코드 디스어셈블러
# 파이썬의 철학을 항상 기억하세요:
import this # Zen of Python
# "아름다운 것이 추한 것보다 낫다."
# "명시적인 것이 암묵적인 것보다 낫다."
# "단순한 것이 복잡한 것보다 낫다."
# "가독성이 중요하다."
🎓 40강을 마치며
지금까지 파이썬의 내부 동작 원리부터 실전 생태계까지 40강을 함께했습니다. 이 시리즈가 다른 입문서와 다른 점은 "어떻게 쓰나"가 아닌 "왜 이렇게 동작하나"를 중심에 뒀다는 것입니다.
- 변수는 이름표이고 객체는 메모리에 존재한다 (5강)
- for 루프는 이터레이션 프로토콜(
__iter__/__next__)로 동작한다 (14강) - 클래스는 런타임에 실행되는 코드이며 인스턴스는 그 결과물이다 (32강)
with문은__enter__/__exit__프로토콜의 문법적 설탕이다 (39강)
이 원리들을 이해한 지금, 어떤 파이썬 코드를 만나도 "이것이 어떻게 동작하는지" 예측할 수 있습니다. 다음 단계는 직접 만들어보는 것입니다. 작은 CLI 도구, 웹 API, 데이터 분석 스크립트 — 무엇이든 만들면서 40강에서 배운 원리들이 살아 숨쉬는 코드를 경험하세요.
"파이썬을 배운 것이 아니라 프로그래밍을 생각하는 방법을 배웠다." — 이 시리즈의 진짜 목표.
⚠️ 자주 하는 실수
- JSON에서 bool True/False: JSON은
true/false(소문자), 파이썬은True/False(대문자).json.dumps(True)는"true"를 반환합니다. 직렬화·역직렬화 시 자동 변환되므로 걱정 없이 써도 됩니다. - CSV 파일에서 newline=""을 생략: Windows에서
open("file.csv", "w")로 열면 줄바꿈이\r\r\n으로 이중 삽입됩니다. 반드시newline=""을 지정하세요. - 가상환경 없이 글로벌 설치:
pip install을 가상환경 없이 쓰면 시스템 파이썬이 오염됩니다. 프로젝트마다 반드시 가상환경을 만들고 활성화 후 설치하세요.
📝 40강 시리즈 핵심 요약
- JSON:
json.loads/dumps/load/dump. ensure_ascii=False 필수. 커스텀 직렬화는 JSONEncoder 상속 또는 default 함수. - CSV:
csv.DictReader/DictWriter. newline="", encoding="utf-8-sig". 엑셀 호환성. - 모듈: 파일 = 모듈. sys.path 탐색. sys.modules 캐시.
if __name__ == "__main__". - 패키지: 디렉토리 + __init__.py. 상대/절대 임포트. __all__로 공개 API.
- 가상환경:
python -m venv .venv. 프로젝트마다 격리. requirements.txt 또는 pyproject.toml.
관련 주제
- json.dumps·json.loads
- csv.DictReader·DictWriter
- 모듈과 sys.path
- __init__.py 패키지
- if __name__ == '__main__'
- 가상환경과 pyproject.toml
- 개발·프로그래밍
- 개발·프로그래밍 강의
- 파이썬 기초 40강 — 처음 배우는 프로그래밍
- 무료강의
- 무료 온라인 강의
- NUGUNA
- 누구나
📚 시리즈 전체 공유
파이썬 기초 40강 — 처음 배우는 프로그래밍
이 강의가 속한 시리즈는 총 40강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.
댓글
0/1000
불러오는 중...
