이번에는 간단히 JSON이 뭔지에 대한 overview를 살펴보면서, 파이썬에서 어떻게 json파일을 읽고 쓸 수 있는지 정도를 간단히 다루고 Pickle에 대해서도 동일하게 다뤄보겠습니다. 그리고 마지막으로 이 두개를 비교하면서 마치도록 하겠습니다. 그럼 시작하겠습니다 :)
JSON
데이터를 저장하거나, 전송할 때 많이 사용되는 경량의 데이터 교환형식이다. 정확한 의미는 javascript에서 객체를 만들 때 사용하는 표현식이다. 이러한 JSON 표현식은 사람과 기계 모두가 이해하기 쉬우며, 용량이 작기 때문에, 최근에는 JSON이 XML을 대체해서 데이터 전송등에 많이 사용한다.
즉, JSON은 데이터 포맷일 뿐, 어떠한 통신방법도 프로그래밍 문법도 아닌
단순히 데이터를 표시하는 표현방법일 뿐이다.
이러한 json은 아래와 같은 특징을 가진다. 여기서 주목할 부분은 하단의 2개의 특징으로 XML이나 JSON같은 경우 일종의 데이터 형식이고 개발자간의 데이터 통신을 효율적이게 하기 위한 것이다. 따라서, 특정 언어에 종속되지 않으며, 경량이라는 점이 아주 매력적이다.
- Server와 Client 간의 교류에서 일반적으로 많이 사용된다.
- JavaScript의 문법과 굉장히 유사하지만 텍스트 형식일 뿐이다.
- 다른 프로그래밍 언어를 이용해서도 쉽게 만들 수 있다.
- 특정 언어에 종속되지 않으며, 대부분의 프로그래밍 언어에서 JSON 포맷의 데이터를 핸들링 할 수 있는 라이브러리를 제공한다.
XML vs JSON
XML :데이터 값 양쪽으로 태그가 있다.(HTML을 근본으로 했기에 태그라는 것이 없을 수가 없는데, 그 태그를 줄인다 해도 최소한 표현하려면 양쪽에 몇글자씩이 있어야 한다.)
JSON : 태그로 표현하기 보다는 중괄호({}) 같은 형식으로 하고, 값을 ','로 나열하기에 그 표현이 간단하다.
아래와 같이 두 형식을 직접 비교해보면, JSON이 훨씬 간단하고 눈으로 보기 편한 것을 알 수 있다.
JSON 문법과 형식
JavaScript 객체와 마찬가지로, Key, Value 쌍이 존재할 수 있으며, key값이나 문자열은 항상 " "
를 이용해서 표기해야한다. 중첩시켜서 사용도 가능하며, 객체나 배열 등의 표기를 사용할 수 있다.
{
"employees": [
{
"name": "Surim",
"lastName": "Son"
},
{
"name": "Someone",
"lastName": "Huh"
},
{
"name": "Someone else",
"lastName": "Kim"
}
]
}
더 자세히 살펴보자.
1. Key-Value 형식의 쌍
여러가지 언어들에서 object 등으로 실현되었다.
{
"firstName": "Kwon",
"lastName": "YoungJae",
"email": "kyoje11@gmail.com"
}
2. 값들의 순서화된 리스트 형식
- 여러가지 언어들에서 배열(Array) 등으로 실현되었다.
- [value1, value2, ...]
{
"firstName": "Kwon",
"lastName": "YoungJae",
"email": "kyoje11@gmail.com",
"hobby": ["puzzles","swimming"]
}
JSON in Python
그렇다면 파이썬에서는 json을 어떻게 사용할까? 즉 어떻게 parsing하고 저장할까? 잠깐, 그런데 parsing이란 뭘까? 어디서 많이 들어보기는 했는데, json을 다룬다면 정확히 알고 있는 것이 좋다. 간단히 먼저 설명하겠다.
Parsing
Parsing을 Wiki를 참고하면 "구문 분석"이다. 컴퓨터 과학에서 한정되는 말이 아니라, 언어학 등 다른 분야에서 통용되는 말로 각 분야마다 조금씩의 차이를 가진다. 그렇다면 우리에게 이 parsing이란 뭘까? 자연어, 컴퓨터 언어, 데이터 구조의 문자열을 분석하는 것이다. 결국 앞서 우리가 봤던 XML, JSON등의 일종의 데이터 포맷으로 전달되는 데이터를 현재 나의 런타임에서 사용하기 위해서 특정한 처리과정인 구문 분석을 거쳐서 내가 원하는 형태로 가공하여 사용하는 것이다. 이 때 이러한 parsing을 해주는 프로그램을 parser라고 한다.
그렇다면 결국 우리가 파이썬에서 json을 parsing한다는 말은 json으로 전달된 데이터 정보를 우리가 사용하기 위해서 일종의 분석을 거치는 것이라고 보면된다. 결국 위와 같은 json 형식의 데이터를 바로 현재의 런타임에서 사용할 수 없으니 parsing해서 사용하는 것이고, 실제로 파이썬에서 json을 사용할 때는 그냥 사용할 수 있을 것 같지만, 반드시 파이썬 객체로 바꿔주는 과정이 필요하며 이를 parser가 해주게 된다.
파이썬에서 이렇게 json을 다루기 위해서 json
모듈을 제공한다. 그런데 위에서 봤다시피, json의 데이터 포맷이 파이썬의 dict type과 매우 유사하다. 실제로 둘은 호환이 가능하다. 따라서, 우리는 json을 dict type처럼 처리할 것이다.
JSON read
JSON파일의 구조 확인 > load > dict type처럼 처리
import json
with open("json_ex.json", "r", encoding="utf8") as f:
contents = f.read()
json_data = json.loads(contents)
print(json_data)
JSON 또한 일종의 데이터 포맷형식이고, 파일이기 때문에 앞서 File Handling을 했던 것 처럼 처리할 수 있다. 이 떄 load()
혹은 loads()
를 통해 json 객체를 읽어올 수 있다. ( 데이터가 메모리에 있는지 디스크에 있는지에 따라서 다르게 처리해야 한다고 한다. 일단 해보고 안되면 바꿔서 해보는 것이 합리적일 것 같다.)
JSON Write
Dict type으로 data save -> json 모듈로 write
import json
dict_data = { 'Name': 'Zara', 'Age' : 7}
with open('data.json', 'w' ) as f:
json.dump(dict_data, f)
파이썬에서 JSON형식으로 보내고 싶은 데이터는 dict type으로 저장한후 이렇게 빈 json파일을 만든 후 dump( data, json )
를 통해 적어줄 수 있다.
Serialization
지금까지는 다양한 언어간 환경간에서 데이터를 전송하고 사용하기 위한 데이터 포맷인 json에 대해서 살펴봤다. 이러한 json은 text file 형식으로 앞서 봤듯 open을 사용하여 handling된다. 즉 text serealizaiton 텍스트 직렬화 방식을 사용하는 것이다. 그렇다면 직렬화란 무엇일까? 간단히 살펴보도록하자.
Serialization(직렬화) , Deserialization(비직렬화)
데이터를 연속적인 형식으로 변환 후 다시 복원해서 사용할 수 있게 하는 것을 직렬화와 비직렬화라고 한다. 예를 들자면 직렬화는 파이썬의 객체를 일련의 데이터 형식으로 변환하는 것이고, 비직렬화는 이러한 변환된 데이터 형식을 다시 파이썬 상의 객체로 메모리상에 복원하는 것이다.
그래서 우리가 앞서 살펴본 json 모듈은 JSON 파일 형식을 직렬화및 역직렬화를 하게 해주는 모듈이었던 것이다. 또한, json은 text file이기에 텍스트 에디터를 통해서 우리가 읽을 수 있는 것이다.
Pickle
그런데 이러한 json을 통해서 파이썬의 모든 데이터 혹은 객체들을 전달할 수는 없다. 즉, json은 파이썬의 객체들 중 일부만 전달가능하다. 사실 생각해보면 당연하다. 다른 언어 혹은 다른 환경으로 전달해서 사용하려하는데 오로지 파이썬에 맞춰진 일부 객체들을 전달하는 것은 안될 일이다. 그렇다면 오로지 파이썬에서 사용하는 많은 객체들에 대해서 종속적인 데이터 형식을 만들고 싶다면 어떻게 해야할까?
이 때 사용하는 것이 pickle이다. 이 pickle의 경우 json과는 다르게 binary file로 binary serialization을 통해서 만들어진다. 그래서 파이썬에서 pickel을 통한 serialization과 deserialization을 pickling과 unpickling이라고 한다. 결국 이 pickle은 파이썬 종속적인 Data Format 인 것이다. 따라서 파이썬이 아닌 어플리케이션들에서는 pickle 형식의 데이터를 deserialization할 수 없는 것이다.
예시를 통해 확인해보자.
import pickle
test = [1,2,3,4,5]
f = open("list.pickle","wb" )
pickle.dump(test, f)
f.close()
이렇게 json과 마찬가지로 dump method를 통해서 pickle을 저장할 수 있게 된다. load또한 마찬가지로 할 수 있게 된다.
import pickle
f = open("list.pickle", "rb")
test_pickle = pickle.load(f)
f.close()
JSON VS Pickle
이렇게 json과 pickle에 대해 알아봤는데 두 format을 명확히 비교해줄 수 있는 테이블이 있으면 좋을 것 같아서 정리해봤다.
JSON | Pickle | |
language dependency |
자바스크립트로부터 유래된 것으로 다양한 언어에서 사용되고, 언어에 독립적이게 사용가능한 데이터 형식이다. |
C에 의해서 쓰여진 모듈로, 다른 언어들에서 지원되지 않고, 파이썬에 종속적인 데이터 형식이다. |
serialization format | text serialization format | binary serialization format |
type of data | 특정 데이터 타입들에서만 사용가능하다. ( 제한적이다.) |
파이썬의 임의의 객체에 대해서 사용가능하다. 즉 클래스나 함수 객체에 대해서도 사용가능한 것이다. |
fast | lightweight format | relativelty highweight format( not really) |
security | more secure | insecure and vulnerable |
json이 무엇이고, parsing이란 무엇이고, serialization은 무엇이고, pickle은 무엇인지 그리고 python에서 어떻게 처리하는지 등에 대해서 알아봤t습니다. 어떤 분야에 있던 데이터를 다루는 것은 중요해졌고, 이러한 데이터를 최근에는 이렇게 json이나 yaml같은 포맷을 통해 많이 주고받기 때문에 이들을 아는 것은 매우 중요합니다. 또한, pickle또한 파이썬에서 많이 사용되는 것이기에 꼭 알아뒀으면 합니다. 결과적으로는 전체적인 Data와 File에 대한 format의 overview를 느낄 수 있었으면 좋겠습니다.
Reference
네이버 부스트 캠프 ai tech 최성철 교수님 교안
https://kingpodo.tistory.com/8
https://www.educba.com/python-pickle-vs-json/
https://www.tutorialspoint.com/python_data_persistence/python_data_persistence_pickle_module.htm
https://docs.python.org/3/library/pickle.html
'Python' 카테고리의 다른 글
[Typing] Literal, tensortype ( torch typing ) (0) | 2023.03.18 |
---|---|
Python - configparser & argparser (0) | 2022.02.17 |
Python - Exception Handling (0) | 2022.02.16 |
Python - File Handling & With Statement (0) | 2022.02.16 |
Python - Module & Project (0) | 2022.02.15 |