본문으로 건너뛰기

Python JSON 파일 읽고 쓰기

JSON이 무엇인지 알아보고 Python에서 JSON 파일을 읽고 쓰는 방법을 알아보겠습니다.

1. JSON 이란?

JSON은 JavaScript Object Notation의 약자로, JavaScript에서 데이터를 전달하기 위해 만들어졌습니다. 하지만 요즘은 JavaScript 뿐만 아니라 다양한 프로그래밍 언어에서 사용합니다.

JSON은 데이터를 문자열 형태로 저장할 수 있습니다. JSON은 다음과 같이 key-value 형태로 데이터를 갖고 있습니다. 여기서 value는 문자열, 숫자, 배열, Boolean 등이 될 수 있습니다.

{
"squadName": "Super hero squad",
"homeTown": "Metro City",
"members": [
{
"name": "Molecule Man",
"age": 29,
"powers": [
"Radiation resistance",
"Radiation blast"
]
},
{
"name": "Madame Uppercut",
"age": 39,
"powers": [
"Million tonne punch",
"Damage resistance",
]
},
}

2. JSON 파일을 읽고 데이터를 객체로 변환

파이썬에서 JSON 파일의 데이터를 읽어서 파이썬의 딕셔너리, 리스트 객체로 변환할 수 있습니다.

예를 들어, sample.json 파일은 아래와 같은 JSON 데이터를 갖고 있습니다.

{
"posts": [
{
"title": "How to get storage size",
"url": "https://codechacha.com/ko/get-free-and-total-size-of-volumes-in-android/",
"draft": "false"
},
{
"title": "Android Q, Scoped Storage",
"url": "https://codechacha.com/ko/android-q-scoped-storage/",
"draft": "false"
}
]
}

위의 JSON 파일은 아래와 같은 코드로 읽어 파이썬 객체로 변환할 수 있습니다. json.load(file)은 JSON 파일을 읽고 객체로 리턴하는 함수입니다. 변환된 객체는 JSON과 같은 구조로 구성되어있어, 동일한 구조로 데이터에 접근할 수 있습니다.

import json

file_path = "./sample.json"

with open(file_path, "r") as json_file:
json_data = json.load(json_file)
print(json_data)
print(json_data['posts'])
print(json_data['posts'][0]['title'])

Output:

{'posts': [{'title': 'How to get storage size', 'url': 'https://codechacha.com/ko/get-free-and-total-size-of-volumes-in-android/', 'draft': 'false'}, {'title': 'Android Q, Scoped Storage', 'url': 'https://codechacha.com/ko/android-q-scoped-storage/', 'draft': 'false'}]}
[{'title': 'How to get storage size', 'url': 'https://codechacha.com/ko/get-free-and-total-size-of-volumes-in-android/', 'draft': 'false'}, {'title': 'Android Q, Scoped Storage', 'url': 'https://codechacha.com/ko/android-q-scoped-storage/', 'draft': 'false'}]
How to get storage size

3. 객체의 데이터를 JSON 형식으로 파일에 쓰기

파이썬 객체의 데이터를 JSON 형식의 문자열로 변환하여 파일에 저장할 수도 있습니다. json.dump(object, outfile) 는 object 객체를 JSON으로 변환하여 outfile 파일에 저장하는 함수입니다.

import json

data = {}
data['posts'] = []
data['posts'].append({
"title": "How to get storage size",
"url": "https://codechacha.com/ko/get-free-and-total-size-of-volumes-in-android/",
"draft": "false"
})
data['posts'].append({
"title": "Android Q, Scoped Storage",
"url": "https://codechacha.com/ko/android-q-scoped-storage/",
"draft": "false"
})

file_path = "./sample2.json"
with open(file_path, 'w') as outfile:
json.dump(data, outfile)

저장된 파일을 열어보면, 아래와 같이 JSON 문자열로 저장된 것을 확인할 수 있습니다.

{"posts": [{"title": "How to get storage size", "url": "https://codechacha.com/ko/get-free-and-total-size-of-volumes-in-android/", "draft": "false"}, {"title": "Android Q, Scoped Storage", "url": "https://codechacha.com/ko/android-q-scoped-storage/", "draft": "false"}]}

4. 객체의 데이터를 JSON 형식의 문자열로 변환

json.dumps(object)는 object 객체를 JSON 형식의 문자열로 변환하고 리턴합니다.

import json

data = {}
data['posts'] = []
data['posts'].append({
"title": "How to get storage size",
"url": "https://codechacha.com/ko/get-free-and-total-size-of-volumes-in-android/",
"draft": "false"
})
data['posts'].append({
"title": "Android Q, Scoped Storage",
"url": "https://codechacha.com/ko/android-q-scoped-storage/",
"draft": "false"
})

json_string = json.dumps(data)
print(json_string)

Output:

{"posts": [{"title": "How to get storage size", "url": "https://codechacha.com/ko/get-free-and-total-size-of-volumes-in-android/", "draft": "false"}, {"title": "Android Q, Scoped Storage", "url": "https://codechacha.com/ko/android-q-scoped-storage/", "draft": "false"}]}

4.1 JSON 문자열을 보기 좋게(Pretty) 출력

만약 보기 좋게 출력하고 싶다면, json.dumps(data, indent=2) 처럼 indent를 인자로 전달하면 indent가 적용됩니다.

import json

data = {}
data['posts'] = []
data['posts'].append({
"title": "How to get storage size",
"url": "https://codechacha.com/ko/get-free-and-total-size-of-volumes-in-android/",
"draft": "false"
})
data['posts'].append({
"title": "Android Q, Scoped Storage",
"url": "https://codechacha.com/ko/android-q-scoped-storage/",
"draft": "false"
})

json_string = json.dumps(data, indent=2)
print(json_string)

Output:

{
"posts": [
{
"title": "How to get storage size",
"url": "https://codechacha.com/ko/get-free-and-total-size-of-volumes-in-android/",
"draft": "false"
},
{
"title": "Android Q, Scoped Storage",
"url": "https://codechacha.com/ko/android-q-scoped-storage/",
"draft": "false"
}
]
}