참고자료 B: CSV 파일과 JSON 파일

CSV 파일

CSV(Comma-Separated Values) 파일은 데이터를 쉼표(,)로 구분하여 저장하는 텍스트 파일 형식이다. 주로 엑셀(Excel), 데이터베이스, 웹 애플리케이션 등에서 데이터를 저장하고 교환하는 데 사용된다. CSV 파일은 일반적으로 행(row)과 열(column) 형태로 데이터를 저장하며, 각 행은 줄바꿈 문자(\n), 각 열은 쉼표(,)로 구분된다.

CSV 관련 함수
기능 함수
CSV 파일 쓰기 (리스트) csv.writer(file).writerows(data)
CSV 파일 읽기 (리스트) csv.reader(file)
CSV 파일 쓰기 (딕셔너리) csv.DictWriter(file, fieldnames=[])
CSV 파일 읽기 (딕셔너리) csv.DictReader(file)
헤더 추가 writer.writeheader()
CSV 구분자 변경 csv.writer(file, delimiter=";")
파일 존재 여부 확인 os.path.exists("파일명")

Python의 csv 모듈을 활용하면 엑셀 파일을 다루듯이 데이터를 쉽게 저장하고 읽을 수 있다.

CSV 파일 형식

이름,나이,직업
철수,25,학생
영희,30,개발자
민수,28,디자이너
  • 첫 번째 행: 헤더(Header) → 열(column)의 이름을 정의
  • 이후 행: 데이터(Data)

CSV 파일 쓰기

Python에서 CSV 파일을 저장할 때는 csv 모듈을 사용한다.

CSV 파일 저장 (writerow())

import csv

# 저장할 데이터
data = [
    ["이름", "나이", "직업"],
    ["철수", 25, "학생"],
    ["영희", 30, "개발자"],
    ["민수", 28, "디자이너"]
]

# CSV 파일로 저장
with open("data.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)  # CSV 작성 객체 생성
    writer.writerows(data)  # 여러 행을 한 번에 저장

출력 (data.csv 파일)
이름,나이,직업
철수,25,학생
영희,30,개발자
민수,28,디자이너
  • csv.writer(file): CSV 작성 객체 생성
  • writerow(): 한 행씩 저장
  • writerows(): 여러 행을 한 번에 저장
  • newline="": 줄바꿈 문제를 방지

CSV 파일 읽기

CSV 파일을 읽을 때는 csv.reader()를 사용하여 데이터를 리스트로 변환할 수 있다.

CSV 파일 읽기 (reader())

import csv

# CSV 파일 읽기
with open("data.csv", "r", encoding="utf-8") as file:
    reader = csv.reader(file)  # CSV 읽기 객체 생성
    for row in reader:
        print(row)

출력

['이름', '나이', '직업']
['철수', '25', '학생']
['영희', '30', '개발자']
['민수', '28', '디자이너']
  • csv.reader(file): CSV 읽기 객체 생성
  • 각 행(row)은 리스트 형태로 반환됨

CSV 파일을 딕셔너리 형태로 저장 및 읽기

(1) CSV 파일을 딕셔너리로 저장 (DictWriter)

딕셔너리(dict) 데이터를 CSV 파일로 저장할 수도 있다.

import csv

# 딕셔너리 데이터
data = [
    {"이름": "철수", "나이": 25, "직업": "학생"},
    {"이름": "영희", "나이": 30, "직업": "개발자"},
    {"이름": "민수", "나이": 28, "직업": "디자이너"}
]

# CSV 파일 저장
with open("data_dict.csv", "w", newline="", encoding="utf-8") as file:
    fieldnames = ["이름", "나이", "직업"]
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    
    writer.writeheader()  # 헤더 저장
    writer.writerows(data)  # 데이터 저장

출력 (data_dict.csv 파일)

이름,나이,직업
철수,25,학생
영희,30,개발자
민수,28,디자이너
  • csv.DictWriter(file, fieldnames=[]): 딕셔너리를 CSV로 저장하는 객체
  • writeheader(): 헤더(Header) 저장
  • writerows(): 여러 개의 딕셔너리를 한 번에 저장

(2) CSV 파일을 딕셔너리로 읽기 (DictReader)

import csv

# CSV 파일 읽기
with open("data_dict.csv", "r", encoding="utf-8") as file:
    reader = csv.DictReader(file)  # 딕셔너리 형태로 읽기
    for row in reader:
        print(row)

출력
{'이름': '철수', '나이': '25', '직업': '학생'}
{'이름': '영희', '나이': '30', '직업': '개발자'}
{'이름': '민수', '나이': '28', '직업': '디자이너'}
  • csv.DictReader(file): CSV 데이터를 딕셔너리(dict) 형태로 변환
  • 각 행이 dict 형태로 반환됨

CSV 파일 존재 여부 확인 후 읽기

import os
import csv

file_name = "data.csv"

if os.path.exists(file_name):
    with open(file_name, "r", encoding="utf-8") as file:
        reader = csv.reader(file)
        for row in reader:
            print(row)
else:
    print("파일이 존재하지 않습니다.")

CSV 파일에서 특정 열만 읽기

CSV 파일에서 특정 열(column)만 선택하여 읽을 수도 있다.

import csv

with open("data.csv", "r", encoding="utf-8") as file:
    reader = csv.reader(file)
    next(reader)  # 헤더 건너뛰기
    for row in reader:
        print(row[0])  # '이름' 열만 출력

CSV 파일 구분자 변경

기본적으로 CSV는 쉼표(,)로 구분되지만, 세미콜론(;) 또는 탭(\t)으로 변경할 수도 있다.

(1) 세미콜론(;)으로 구분

with open("data_semicolon.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file, delimiter=";")  # 구분자 변경
    writer.writerows(data)

(2) 탭(\t)으로 구분

with open("data_tab.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file, delimiter="\t")
    writer.writerows(data)

JSON 파일

JSON(JavaScript Object Notation)은 데이터를 저장하고 전송하기 위한 경량 데이터 형식으로, Python에서는 json 모듈을 사용하여 JSON 파일을 읽고 쓸 수 있다. JSON은 키-값 쌍으로 이루어진 구조이며, Python의 dict와 유사하다. 따라서 Python의 딕셔너리, 리스트 등의 자료형을 JSON 파일로 저장하거나 불러올 수 있다.

JSON 관련 함수
기능 함수
Python 객체 → JSON 파일 저장 json.dump(data, file)
JSON 파일 → Python 객체 읽기 json.load(file)
Python 객체 → JSON 문자열 변환 json.dumps(data)
JSON 문자열 → Python 객체 변환 json.loads(json_string)
JSON을 보기 좋게 저장 indent=4
한글 깨짐 방지 ensure_ascii=False

JSON 파일 형식

JSON 파일은 아래와 같은 형태로 구성된다.

{
    "이름": "철수",
    "나이": 25,
    "취미": ["축구", "독서", "영화 감상"],
    "주소": {
        "도시": "서울",
        "우편번호": "12345"
    }
}
  • 문자열(String): 큰따옴표(" ")로 감싸야 한다.
  • 숫자(Number): 따옴표 없이 사용한다.
  • 배열(Array, 리스트와 유사): []로 감싸서 사용한다.
  • 객체(Object, 딕셔너리와 유사): {}로 감싸서 키-값 쌍을 사용한다.

JSON 파일 쓰기

Python 객체(딕셔너리, 리스트 등)를 JSON 파일로 저장할 수 있다.

JSON 파일 저장

import json

# 저장할 데이터 (Python 딕셔너리)
data = {
    "이름": "철수",
    "나이": 25,
    "취미": ["축구", "독서", "영화 감상"],
    "주소": {
        "도시": "서울",
        "우편번호": "12345"
    }
}

# JSON 파일로 저장
with open("data.json", "w", encoding="utf-8") as file:
    json.dump(data, file, ensure_ascii=False, indent=4)

출력(data.json 파일 내용)

{
    "이름": "철수",
    "나이": 25,
    "취미": ["축구", "독서", "영화 감상"],
    "주소": {
        "도시": "서울",
        "우편번호": "12345"
    }
}
  • json.dump(data, file): Python 객체를 JSON 파일로 저장한다.
  • ensure_ascii=False: 한글을 올바르게 저장하기 위해 사용 (기본값 True이면 유니코드 변환됨)
  • indent=4: JSON 파일을 보기 좋게 정렬

JSON 파일 읽기

JSON 파일을 읽어서 Python 객체로 변환할 수 있다.

JSON 파일 읽기

import json

# JSON 파일 열기
with open("data.json", "r", encoding="utf-8") as file:
    data = json.load(file)  # JSON을 Python 객체로 변환

# 데이터 출력
print(data)
print(data["이름"])  # '철수'
print(data["취미"])  # ['축구', '독서', '영화 감상']
  • json.load(file): JSON 파일을 읽어서 Python 객체로 변환한다.
  • JSON 데이터는 Python의 딕셔너리(dict) 또는 리스트(list)로 변환됨.

JSON 문자열 변환

  • JSON 파일이 아닌 문자열 데이터를 다룰 때 json.dumps()json.loads()를 사용한다.

(1) Python 객체 → JSON 문자열 (dumps())

import json

data = {"이름": "영희", "나이": 30}

# Python 객체를 JSON 문자열로 변환
json_str = json.dumps(data, ensure_ascii=False, indent=4)
print(json_str)
{
    "이름": "영희",
    "나이": 30
}

(2) JSON 문자열 → Python 객체 (loads())

import json

json_str = '{"이름": "영희", "나이": 30}'

# JSON 문자열을 Python 객체로 변환
data = json.loads(json_str)
print(data["이름"])  # '영희'
영희

JSON 데이터 활용 예제

(1) 리스트 데이터를 JSON으로 저장하고 읽기

import json

# 리스트 데이터
fruits = ["사과", "바나나", "포도"]

# JSON 파일로 저장
with open("fruits.json", "w", encoding="utf-8") as file:
    json.dump(fruits, file, ensure_ascii=False)

# JSON 파일 읽기
with open("fruits.json", "r", encoding="utf-8") as file:
    fruits_list = json.load(file)

print(fruits_list)  # ['사과', '바나나', '포도']

(2) JSON 파일이 존재하는지 확인 후 읽기

파일이 존재하는지 확인한 후 JSON을 읽으면 오류를 방지할 수 있다.

import os
import json

file_name = "data.json"

if os.path.exists(file_name):  # 파일 존재 여부 확인
    with open(file_name, "r", encoding="utf-8") as file:
        data = json.load(file)
    print(data)
else:
    print("파일이 존재하지 않습니다.")