Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

Zorba blog

파이선 / Python 으로 JSON 데이터 읽고 쓰기 (Read and Write) 본문

카테고리 없음

파이선 / Python 으로 JSON 데이터 읽고 쓰기 (Read and Write)

Zorba blog 2022. 3. 17. 14:20

파이썬을 사용하여 데이터를 불러오다보면 파일 형식이 json인 경우가 있습니다. 보통 csv 타입을 주로 불러와서 사용하였기에 json 파일은 저에겐 생소한 확장자명 이었는데요. 이번에 json 파일이 무엇인지 그리고 json파일을 읽고, 쓰기 위해서는 어떻게 해야하는지 알아보겠습니다.


JSON 이란.

더보기

JSON(JavaScript Object Notation)은 속성-값 쌍 또는 "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이다. 비동기 브라우저/서버 통신을 위해, 넓게는  XML 을 대체하는 주요 데이터 포맷이다. 특히, 인터넷에서 자료를 주고 받을 때 그 자료를 표현하는 방법으로 알려져 있다. 자료의 종류에 큰 제한은 없으며, 특히 컴퓨터 프로그램의 변수값을 표현하는 데 적합하다.

 

본래는 자바스크립트 언어로부터 파생되어 자바스크립트의 구문 형식을 따르지만 언어 독립형 데이터 포맷이다. 즉, 프로그래밍 언어나 플랫폼에 독립적이므로, 구문 분석 및 JSON 데이터 생성을 위한 코드는 C, C++, C#, 자바, 자바스크립트, 펄, 파이썬 등 수많은 프로그래밍 언어에서 쉽게 이용할 수 있다.

 

출처 : 위키백과

자바스크립트 언어로부터 파생된 데이터이지만 다양한 프로그래밍 언어에서 사용되는 타입이 파일 형식이네요.

 

JSON 파일 예시.

아래는 AI허브에서 다운받은 JSON 형식의 영상 요약 데이터입니다.

더보기

{'filename': '1034fe522e315229fad5e0fdf4af935b63a9090f99f00692959901ce3b5743b6-유튜브 영상물(2~5분) 장면별 중요도 태그-100176-20201126222631-001-001',
 'category': '비영리/사회활동',
 'length': 123.667,
 'quality': '720p',
 'license': 'Youtube',
 'ad_start': '-',
 'ad_end': '-',
 'three_secs': [0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41],

 'path': '093.비디오 요약 영상 데이터/01.데이터/7.비디오 요약 영상 데이터(100% 이상, 구문적 정확성 검증용)/2~5분',
 'annots': [{'annotator_id': '5916668646163854336',    'highlight': [14, 23],   'represent': [23]},
  {'annotator_id': '6359559137395038208',   'highlight': [5, 25],   'represent': [25]},
  {'annotator_id': '1516118545899654912',   'highlight': [1, 25],   'represent': [1]},
  {'annotator_id': '3310769171506859008',   'highlight': [15, 28],   'represent': [15]},
  {'annotator_id': '3799481466110034944',   'highlight': [5, 38],   'represent': [38]},
  {'annotator_id': '8707170359339634688',   'highlight': [7, 24],   'represent': [24]},
  {'annotator_id': '5975720589520904192',   'highlight': [2, 38],   'represent': [2]},
  {'annotator_id': '4710561558322899968',   'highlight': [2, 8],   'represent': [2]},
  {'annotator_id': '2531399924418199040',   'highlight': [0, 14],   'represent': [0]},
  {'annotator_id': '1430604566038234112',   'highlight': [1, 35],   'represent': [1]}]}

보시는 것과 같이 Dict 형식으로 되어있으며, 파일 안에는 string, 숫자, list, dict 까지 포함될 수 있습니다. 또한 위 데이터에는 없지만 Dict 타입의 특성상 array와 Boolean 형식까지 내용으로 포함될 수 있습니다.

 

JSON - Python 데이터 타입

아래 Python - JSON 간 변환 표를 보시면 Python에서 JSON으로 저장하는 경우 그리고 반대인 경우 타입이 어떻게 변환되는지 확인할 수 있습니다. 특이점은 Python의 list, tuple 경우 JSON으로 변환할 때 array타입으로 전환되고 이를 다시 Python으로 불러올 때는 list 타입으로 전환된다는 것 입니다. (tuple형식으로 복원이 안된다는 점.)

Python -> JSON JSON -> Python
dict object object dict
list,tuple array array list
str string string str
int,long,float number number(int) int
number(real) float
True true true True
False false false False
None null null None

JSON 모듈

파이썬에서 JSON 파일을 읽고, 쓰기 위해서 먼저 json 모듈이 필요합니다.

import json

JSON 파일 쓰기

파이썬에서 JSON 파일로 쓰기 위해서는 dump와 dumps 함수를 사용합니다.

용도에 따라 두 함수의 쓰임새가 다르니 아래를 참고해주세요.

 

만약 아래와 같은 dict 형태의 자료를 만들었다고 했을 때, 이를 json 포맷 데이터로 만들어보겠습니다.

dict1 = {
   '이름': '김남산',
   '나이': 19, 
   "특기": ["축구", "농구"],
   "가족관계": {"아버지": "김갑수", "어머니": "이수리"},
   "결혼 여부": False
}

 

1. json.dump() : json 포맷 데이터를 디스크에 쓰기.

with open으로 저장하고자하는 파일의 이름을 입력하고, 파일을 "w" (write) 쓰기모드로 열어놓습니다. 그리고 json.dump() 함수를 사용하여 위에서 만들어놓은 dict1 자료를 써주시면 됩니다.

import json

file_path = "C:/Users/sec/Downloads/"

with open(file_path + "dict1_ex.json", "w") as json_file:
    json.dump(dict1, json_file)

실행하시면 위 dict1 데이터가 file_path 경로에 JSON형태로 저장되신 것을 확인하실 수 있습니다.

 

2. json.dumps() : json 포맷 데이터를 메모리에 만들기, 문자열로 변환.

파이썬 객체를 json 포맷으로 만들어서 python에서 작업하려면 dumps() 함수를 사용합니다.

dict1_string = json.dumps(dict1)
print(dict1_string)

{"\uc774\ub984": "\uae40\ub0a8\uc0b0", "\ub098\uc774": 19, "\ud2b9\uae30": ["\ucd95\uad6c", "\ub18d\uad6c"], "\uac00\uc871\uad00\uacc4": {"\uc544\ubc84\uc9c0": "\uae40\uac11\uc218", "\uc5b4\uba38\ub2c8": "\uc774\uc218\ub9ac"}, "\uacb0\ud63c \uc5ec\ubd80": false}

실행하시면 위와같이 dict1 자료가 문자열로 저장된 것을 보실 수 있습니다. 그런데 한글이 깨지는 문제가 발생하는데요. dump, dumps 함수는 기본적으로 데이터를 아스키 형태로 저장하기 때문이빈다. 따라서 유니코드 문자열을 아스키 형태로 저장하다보니 위와같이 깨진것처럼 보이게 됩니다. 

 

이러한 상황을 방지하기 위해 ensure_ascii=False 옵션을 사용하시면 됩니다. 이 옵션은 아스키형태로 저장하지 않겠다는 것을 의미합니다.

dict1_string = json.dumps(dict1, ensure_ascii=False)
print(dict1_string)

{"이름": "김남산", "나이": 19, "특기": ["축구", "농구"], "가족관계": {"아버지": "김갑수", "어머니": "이수리"}, "결혼 여부": false}

옵션을 추가했더니 한글로 잘 출력됩니다. 그런데 print 출력물이 제가 입력한 것과는 달리 한줄로 출력됩니다. 이때는 indent 들여쓰기 옵션을 추가해주시면 보기좋게 정렬된 출력물을 보실 수 있습니다.

dict1_string = json.dumps(dict1, ensure_ascii=False, indent=2)
print(dict1_string)

{
  "이름": "김남산",
  "나이": 19,
  "특기": [
    "축구",
    "농구"
  ],
  "가족관계": {
    "아버지": "김갑수",
    "어머니": "이수리"
  },
  "결혼 여부": false
}

 

JSON 파일 읽기

파이썬에서 JSON 파일을 읽기위해서는 load와 loads 함수를 사용합니다.

 

1. json.load() : 디스크에 있는 json 포맷 데이터를 Python 객체로 읽어오기.

위에서 dump로 만들어놓은 dict1_ex.json 파일을 load 함수를 활용하여 불러와보겠습니다.

import json
file_path = "C:/Users/sec/Downloads/"

with open(file_path+"dict1_ex.json") as f:
    data = json.load(f)

data

{'이름': '김남산',
 '나이': 19,
 '특기': ['축구', '농구'],
 '가족관계': {'아버지': '김갑수', '어머니': '이수리'},
 '결혼 여부': False}

 

2. json.loads() : 메모리에 있는 json 포맷 데이터를 Python 객체로 읽어오기.

위 dumps 함수에서 dict1을  json 포맷인 dict1_string으로 저장했는데요. 이를 다시 Python 객체로 읽어오겠습니다. 

먼저 기존에 dict1_string을 출력하면 아래와 같이 json 형태로 출력됩니다.

dict1_string

'{\n  "가족관계": {\n    "아버지": "김갑수",\n    "어머니": "이수리"\n  },\n  "결혼 여부": false,\n  "나이": 19,\n  "이름": "김남산",\n  "특기": [\n    "축구",\n    "농구"\n  ]\n}'

위 json 형태의 데이터를 loads() 함수를 사용하여 Python 객체로 읽어보겠습니다.

import json

python_dict1 = json.loads(dict1_string)

python_dict1

{'가족관계': {'아버지': '김갑수', '어머니': '이수리'},
 '결혼 여부': False,
 '나이': 19,
 '이름': '김남산',
 '특기': ['축구', '농구']}

이상으로 json파일 읽기, 쓰기 설명을 마칩니다.

혹시 잘못된 점이 있다면 댓글 부탁드립니다.

감사합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

Comments