Python/Utils

파이썬 json 파일 읽고 파싱하기, load와 loads 함수 비교

jimmy_AI 2022. 2. 23. 20:39
반응형

Python json 가져오기, 정보 추출 방법

안녕하세요. 이번 글에서는 파이썬에서 json 파일을 읽고

정보를 파싱하는 방법에 대해서 간략하게 살펴보도록 하겠습니다.

또한, json의 load와 loads 함수의 차이에 대해서도 같이 다루어보겠습니다.

 

우선, 예시를 위하여 아래와 같은 간단한 json 파일이 group.json 이름으로 저장되어 있다고

가정해보도록 하겠습니다.

{
	"team_name": "jimmy-ai",
	"topic": "machine learning",
	"start_date": "2022-02-23",
	"member_list":
		{
			"group_a":
				[
					{ "id": "101", "name": "aaa" },
					{ "id": "102", "name": "bbb" },
					{ "id": "103", "name": "ccc" },
					{ "id": "104", "name": "ddd" }
				]
			,
			"group_b":
				[
					{ "id": "201", "name": "eee" },
					{ "id": "202", "name": "fff" },
					{ "id": "203", "name": "ggg" },
					{ "id": "204", "name": "hhh" }
				]
		}
}

 

 

json 파일 읽기 : load 함수

파이썬에서 json 파일을 읽는 방법은 json 모듈을 import한 뒤,

load 함수를 이용하면 딕셔너리 형태로 자료를 가져올 수 있습니다.

 

디렉토리와 파일 이름에 주의하시며, 아래의 코드로 json을 파이썬에서 불러올 수 있습니다.

import json

with open ("group.json", "r") as f:
    data = json.load(f)

위의 data 변수에 딕셔너리 형태로 json 내 정보들이 저장되어 있는 것을 확인할 수 있습니다.

 

만일, 인코딩 오류가 난다면, open 내에서 encoding 인자를 'utf-8', 'cp949', 'euc-kr'으로

지정해보신 뒤 시도해주시면 됩니다.

 

 

json 내 정보 파싱 예제

위에서 불러온 json 기반 딕셔너리에서 정보를 추출하는 방법은

기본적인 딕셔너리, 리스트의 인덱싱 방법을 생각해주시면 됩니다.

 

예를 들어, 위의 group.json 파일에서 id가 203인 객체의 name을 가져와보겠습니다.

 

내부 자료가 현재 딕셔너리인지 리스트인지를 따져 한 단계씩 안쪽으로

인덱싱을 진행해보겠습니다.

 

가장 바깥쪽 자료는 딕셔너리이므로, id가 포함된 가장 바깥 key인

member_list를 기준으로 value를 가져오도록 하겠습니다.

data['member_list']

###
{'group_a': [{'id': '101', 'name': 'aaa'},
  {'id': '102', 'name': 'bbb'},
  {'id': '103', 'name': 'ccc'},
  {'id': '104', 'name': 'ddd'}],
 'group_b': [{'id': '201', 'name': 'eee'},
  {'id': '202', 'name': 'fff'},
  {'id': '203', 'name': 'ggg'},
  {'id': '204', 'name': 'hhh'}]}
반응형

안쪽 자료도 여전히 딕셔너리인 것을 확인하고,

id = 203인 객체를 포함하는 그룹인 group_b key를 기준으로 파싱하겠습니다.

data['member_list']['group_b']

###
[{'id': '201', 'name': 'eee'},
 {'id': '202', 'name': 'fff'},
 {'id': '203', 'name': 'ggg'},
 {'id': '204', 'name': 'hhh'}]

현재 자료는 리스트 형으로, 이 중 3번째 인자가 id = 203을 포함하고 있기에

2번 인덱스를 기준으로 인덱싱을 진행하겠습니다.

data['member_list']['group_b'][2]
# {'id': '203', 'name': 'ggg'}

이제, 최종 딕셔너리에서 key를 name으로 지정하여 값을 가져오면 완료됩니다.

data['member_list']['group_b'][2]['name']
# ggg

 

 

load와 loads 함수의 차이 : 파일 vs 문자열

마지막으로, 혼동하기 쉬운 json의 load와 loads 함수의 용도를 비교해보겠습니다.

 

load와 loads의 차이는 load는 json 파일을 읽어들이는 반면,

loads는 json 형태의 문자열을 읽어들이는 함수입니다.

 

예를 들어, 아래처럼 json 파일이 아니라 문자열에서 정보를 가져오는 경우에는

load가 아닌 loads 함수를 사용해야 합니다.

json_str = '''
{
	"team_name": "jimmy-ai",
	"topic": "machine learning",
	"start_date": "2022-02-23",
	"member_list":
		{
			"group_a":
				[
					{ "id": "101", "name": "aaa" },
					{ "id": "102", "name": "bbb" },
					{ "id": "103", "name": "ccc" },
					{ "id": "104", "name": "ddd" }
				]
			,
			"group_b":
				[
					{ "id": "201", "name": "eee" },
					{ "id": "202", "name": "fff" },
					{ "id": "203", "name": "ggg" },
					{ "id": "204", "name": "hhh" }
				]
		}
}'''

# load가 아닌 loads 함수를 사용
data = json.loads(json_str)