모든 강의를 무료로 볼 수 있어요. 회원가입 없이도 학습 가능합니다.

40강 / 전체 40강

JSON·CSV 처리, 모듈·패키지·가상환경 — 파이썬 생태계 완성

14분 읽기 조회 0

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, DjangoREST 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

불러오는 중...