Python으로 JSON파일 읽기

JSON은 JavaScript Object Notation을 줄인 것으로, 보통 제이슨으로 읽는다. 일반적으로 클라이언트가 서버에서 가져오는 데이터는 이 형식이고, 현재 표준 형식으로 많이 쓰이고 있다. 원류는 자바스크립트지만 현재는 언어 독립적인 개별 포맷. 그러니까 누가 제이슨 파일 주세요 하면 JSON파일 달라는거지 제이슨씨 파일 주세요가 아니다 남의 파일을 왜 달라고 해

키-값 쌍으로 이루어진 데이터를 텍스트 형태로 기록해둔 것이라 휴먼 가독성은 좋다. 


오늘의 도우미

{
	"Water": {
		"molecular weight": "18.016",
		"molecular formula": "H2O"
	},
	"Ethanol": {
		"molecular weight": "46.07",
		"molecular formula": "C2H5OH"
	},
	"Glucose": {
		"molecular weight": "180.156",
		"molecular formula": "C6H12O6"
	},
	"Sucrose": {
		"molecular weight": "342.3",
		"molecular formula": "C12H22O11"
	}
}

이래뵈도 수제다… 아 그리고 얘도 하려면 모듈 필요하다. 뭐 깔 필요는 없고

import json

이것만 한 줄 맨 위에 붙여주자.

JSON파일 읽기

with open('/home/koreanraichu/test.json') as f:
    json_data = json.load(f)
print(json.dumps(json_data))

그냥 이렇게 쓰면 알아서 불러는 온다.

{"Water": {"molecular weight": "18.016", "molecular formula": "H2O"}, "Ethanol": {"molecular weight": "46.07", "molecular formula": "C2H5OH"}, "Glucose": {"molecular weight": "180.156", "molecular formula": "C6H12O6"}, "Sucrose": {"molecular weight": "342.3", "molecular formula": "C12H22O11"}}

근데 형식에서 큰 기대는 하지 마시고…

JSON파일에서 특정 부분만 볼 수 있나요?

일단 결론부터 말하자면 된다.

{"Water": {"molecular weight": "18.016", "molecular formula": "H2O"}

이거 어디서 많이 봤다… Python은 JSON을 딕셔너리 형식으로 가져오는데, 딕셔너리 형식은 키-밸류로 이루어져 있고 키값으로 픽할 수가 있다. 그럼 얘도? 네. 그겁니다.

print(json_data['Water'])
print(json_data['Water']['molecular formula'])

그냥 이렇게 픽하면 된다. (편-안) 뿐만 아니라 일반적인 딕셔너리처럼 정렬도 된다.

JSON파일 수정하기

{"Water": {"molecular weight": "18.016", "molecular formula": "H2O"}, "Ethanol": {"molecular weight": "46.07", "molecular formula": "C2H5OH"}, "Glucose": {"molecular weight": "180.156", "molecular formula": "C6H12O6"}, "Sucrose": {"molecular weight": "342.3", "molecular formula": "C12H22O11"}, "Methanol": {"molecular weight": "", "molecular formula": ""}}

여기에 새로 메탄올에 대한 정보를 추가했는데, 문제가 하나 있다. 메탄올의 분자량과 분자식이 빠졌다. 어? 이거 그럼 어떻게 수정해요? 파일단에서 건드려야 하나요? ㄴㄴ 파이썬으로 고칩시다.

json_data['Methanol']['molecular weight'] = '32.04'
json_data['Methanol']['molecular formula'] = 'CH3OH'

위에서 딕셔너리 변환이 된다고 했는데, 딕셔너리는 키 픽하고 그 키에 맞는 밸류를 수정하는 것도 된다. 그래서 분자량과 분자식에 해당하는 키를 픽한다음 밸류를 수정해주고

with open ('/home/koreanraichu/test.json','w', encoding='utf-8') as s:
    json.dump(json_data,s)

이렇게만 하면 들여쓰기가 가출한다.

with open ('/home/koreanraichu/test.json','w', encoding='utf-8') as s:
    json.dump(json_data,s,indent = '\t')

indent = \t를 주자.

JSON파일 쓰기

기존 JSON파일을 읽고 수정해봤으니 이제 새로 써보자. 아니 에디터 끄고.

cellphone = dict()
cellphone['Samsung'] = "Galaxy Z flip"
cellphone['Apple'] = "iPhone"
tabletpc = dict()
tabletpc['Samsung'] = 'Galaxy tab'
tabletpc['Apple'] = 'iPad'

핸드폰과 태블릿PC에 대한 딕셔너리를 생성한다. (cellphone=핸드폰 영어로 이거 맞음)

mobile_device = dict()
mobile_device['Cellphone'] = cellphone
mobile_device['Tablet PC'] = tabletpc

그리고 두 딕셔너리를 하나로 묶을 수 있는 큰 딕셔너리(모바일 기기)를 하나 만든다.

with open ('/home/koreanraichu/test2.json','w', encoding='utf-8') as s:
    json.dump(mobile_device,s,indent = '\t')

그리고 큰 딕셔너리를 그대로 쓰면 된다.