Python 딕셔너리 json 파일 저장 방법

파이썬 객체 딕셔너리를 파일로 저장해야 하는 경우가 있습니다. Python 딕셔너리 json 파일 저장 방법을 함께 살펴보겠습니다.

Python 딕셔너리 json 파일 저장 방법

JSON(JavaScript Object Notation)은 가볍고 사람이 읽기 쉬운 데이터 교환 형식입니다. Python의 json 모듈을 사용하여 딕셔너리(dictionary) 객체를 JSON 형식으로 직렬화(serialize)하고 저장할 수 있습니다.

기본 사용법

딕셔너리 객체를 json 파일로 저장하는 방법과 json 파일을 딕셔너리 객체로 읽어오는 방법을 살펴봅시다.

딕셔너리 객체를 JSON 파일로 저장

딕셔너리 객체를 json 파일로 저장할 때는 json 모듈의 dump() 함수를 사용해서 json 파일로 저장할 수 있습니다. dump의 첫째 파라미터는 딕셔너리 객체, 두번째 파라미터는 파일 포인터 되겠습니다.

import json

# 예시 데이터
data = {"name": "뽀로로", "age": 16, "city": "일산"}

# JSON 파일로 저장
with open('data.json', 'w') as fp:
    json.dump(data, fp)
Python

저장된 data.json 파일을 확인하면, 유니코드 값으로 저장된 것을 확인할 수 있습니다. 이유는 바로 dump()에서 사용하는 파라미터 ensure_ascii의 디폴트 값이 True이기 때문입니다. ensure_ascii 값이 True 값을 가지면 비 ASCII 문자들을 이스케이프하겠다는 것을 의미합니다. 따라서 아래 그림과 같이 저장되는 것을 확인할 수 있습니다.

그림 1. Python 딕셔너리 json 파일로 저장: ensure_ascii=True
그림 1. Python 딕셔너리 json 파일로 저장: ensure_ascii=True

다음과 같이 ensure_ascii를 False로 지정하면, 문자들이 있는 그대로 출력됩니다.

# JSON 파일로 저장
with open('data.json', 'w') as fp:
    json.dump(data, fp, ensure_ascii=False)
Python

ensure_ascii를 False로 지정했을 때는 다음과 같이 한글이 보이는 그대로 저장된 것을 확인할 수 있습니다.

그림 2. Python 딕셔너리 json 파일로 저장: ensure_ascii=False
그림 2. Python 딕셔너리 json 파일로 저장: ensure_ascii=False

JSON 파일을 딕셔너리 객체로 읽기

읽을 땐 json.load()를 이용해서 불러옵니다. 파일 포인터만 넣어주면 해당 json 파일을 읽어와서 딕셔너리로 불러옵니다.

import json

# JSON 파일로부터 읽기
with open('data.json', 'r') as fp:
    data_loaded = json.load(fp)

data_loaded
type(data_loaded)
Python

ensure_ascii 값을 무엇으로 했든 간에 상관하지 않고 아래와 같이 딕셔너리로 잘 저장된 것을 확인할 수 있습니다.

그림 3. JSON 파일을 Python 딕셔너리 객체로 읽기
그림 3. JSON 파일을 Python 딕셔너리 객체로 읽기

유용한 옵션

json 파일을 저장할 때 읽기 쉽게 하기 위해서 들여쓰기 설정, 키 정렬과 같은 것이 가능합니다.

들여쓰기(indentation) 지정

아래와 같이 indent 파라미터에 숫자값을 넘겨주면 indent 수의 칸만큼을 들여쓰기 해서 json을 작성합니다.

json.dump(data, fp, indent=4)
Python

저장한 파일을 확인하면 다음과 같이 4칸 들여쓰기가 된 것을 확인할 수 있습니다.

그림 4. Python 딕셔너리 json 저장시 들여쓰기 적용
그림 4. Python 딕셔너리 json 저장시 들여쓰기 적용

키 정렬(sorting keys)

딕셔너리 객체 자체는 키의 순서가 중요하지 않습니다. 하지만 json으로 저장할 때 sort_keys 파라미터를 사용하면 키를 ABC 순으로 정렬할 수 있습니다.

   json.dump(data, fp, indent=4, sort_keys=True)
Python

이번에는 키 정렬 옵션까지 추가로 설정한 결과입니다. 키가 age, city, name으로 ABC 순으로 정렬된 것을 확인할 수 있습니다.

그림 4. Python 딕셔너리 json 저장시 키 정렬
그림 4. Python 딕셔너리 json 저장시 키 정렬

json 파일의 장점과 단점

JSON 파일은 다음과 같은 장점이 있습니다.

  • json은 사람이 쉽게 읽고 이해할 수 있는 텍스트 형식입니다.
  • 모든 프로그래밍 언어에서 지원되기 때문에 언어나 이기종 시스템 간에 데이터를 교환하기에 적합합니다.
  • 웹 어플리케이션에서 널리 사용되며, JavaScript와 쉽게 호환됩니다.

한편 JSON 파일은 다음과 같은 단점이 있습니다.

  • JSON은 기본적으로 문자열, 숫자, 배열, 객체, 부울 및 null만 지원합니다. 따라서 복잡한 Python 객체(예: datetime, set)는 직접 직렬화할 수 없으므로, 별도로 직렬화처리를 해 줘야 합니다.
  • JSON은 텍스트 기반의 파일이므로 바이너리 파일보다는 파일 크기가 크고, 직렬화/역직렬화 속도가 느릴 수 있습니다.

Python 딕셔너리 JSON 파일 변환시 주의사항

Python 딕셔너리 객체를 JSON으로 저장하거나 읽을 때에는 다음과 같은 사항을 주의해야 합니다.

JSON은 Python의 모든 데이터 타입을 지원하지 않으므로, 직렬화할 때 데이터 타입에 주의해야 합니다. 예를 들어, datetime 객체는 str로 변환해야 합니다. 물론 문자열로 변환된 날짜나 시간과 같은 값은 추후 문자열을 다시 읽어서 datetime 객체로 변환해 주어야 합니다.

JSON 파일을 저장하고 읽을 때 인코딩을 다음과 같이 명시적으로 설정하는 것이 좋습니다.

with open('data.json', 'w', encoding='utf-8') as file:
    json.dump(data, file, ensure_ascii=False, indent=4)

with open('data.json', 'r', encoding='utf-8') as file:
    data_loaded = json.load(file)
Python

관련 자료

Python의 JSON Encoder and Decoder 페이지를 참고했습니다.

같이 읽으면 좋은 글

Leave a Comment