본문 바로가기

Python

Python - JSON & Pickle

이번에는 간단히 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이 훨씬 간단하고 눈으로 보기 편한 것을 알 수 있다.

네이버 부스트 캠프 ai tech 최성철 교수님 교안

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라고 한다.

https://kingpodo.tistory.com/8

그렇다면 결국 우리가 파이썬에서 json을 parsing한다는 말은 json으로 전달된 데이터 정보를 우리가 사용하기 위해서 일종의 분석을 거치는 것이라고 보면된다. 결국 위와 같은 json 형식의 데이터를 바로 현재의 런타임에서 사용할 수 없으니 parsing해서 사용하는 것이고, 실제로 파이썬에서 json을 사용할 때는 그냥 사용할 수 있을 것 같지만, 반드시 파이썬 객체로 바꿔주는 과정이 필요하며 이를 parser가 해주게 된다.

https://pythonexamples.org/python-read-json-file/

파이썬에서 이렇게 json을 다루기 위해서 json모듈을 제공한다. 그런데 위에서 봤다시피, json의 데이터 포맷이 파이썬의 dict type과 매우 유사하다. 실제로 둘은 호환이 가능하다. 따라서, 우리는 json을 dict type처럼 처리할 것이다.

JSON read

JSON파일의 구조 확인 >  load  > dict type처럼 처리

To convert Python JSON string to Dictionary, use json.loads() function. Note that only if the JSON content is a JSON Object, and when parsed using loads() function, we get Python Dictionary object.      < https://pythonexamples.org/python-json-to-dict/ >

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

You can convert any Python object to a JSON string and write JSON to File using json.dumps() function and file.write() function respectively.     < https://pythonexamples.org/python-write-json-to-file/ >

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(비직렬화)
데이터를 연속적인 형식으로 변환 후 다시 복원해서 사용할 수 있게 하는 것을 직렬화와 비직렬화라고 한다. 예를 들자면 직렬화는 파이썬의 객체를 일련의 데이터 형식으로 변환하는 것이고, 비직렬화는 이러한 변환된 데이터 형식을 다시 파이썬 상의 객체로 메모리상에 복원하는 것이다.

https://portswigger.net/web-security/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()

https://pythontic.com/modules/pickle/introduction

 

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

JSON이란 무엇인가?

 

JSON이란 무엇인가?

JSON (JavaScript Object Notation) JavaScript Object Notation라는 의미의 축약어로 데이터를 저장하거나 전송할 때 많이 사용되는 경량의 DATA 교환 형식 Javascript에서 객체를 만들 때 사용하는 표현식을 의미한

velog.io

https://na27.tistory.com/230

 

Parsing (파싱) 이란? Parser (파서) 란?

Parsing (파싱) 이란? Parser (파서) 란? Parsing 언어학에서 parsing은 구문 분석이라고도하며 문장을 그것을 이루고 있는 구성 성분으로 분해하고 그들 사이의 위계 관계를 분석하여 문장의 구조를 결정

na27.tistory.com

네이버 부스트 캠프 ai tech 최성철 교수님 교안

https://kingpodo.tistory.com/8

 

1. Parsing이란 무엇인가?

1. Parsing parsing은 구문 분석이라고 합니다. 문장이 이루고 있는 구성 성분을 분해하고 분해된 성분의 위계 관계를 분석하여 구조를 결정하는 것입니다. 즉 데이터를 분해 분석하여 원하는 형태로

kingpodo.tistory.com

https://www.educba.com/python-pickle-vs-json/

 

Python Pickle vs JSON | Guide to Top 7 Useful Differences

Guide to the difference between Python Pickle vs JSON. Here we also discuss python pickle vs json key differences with infographics and comparison table.

www.educba.com

https://www.tutorialspoint.com/python_data_persistence/python_data_persistence_pickle_module.htm

 

Python Data Persistence - Pickle Module

Python Data Persistence - Pickle Module Python’s terminology for serialization and deserialization is pickling and unpickling respectively. The pickle module in Python library, uses very Python specific data format. Hence, non-Python applications may not

www.tutorialspoint.com

http://pythonstudy.xyz/python/article/510-%EC%A7%81%EB%A0%AC%ED%99%94%EC%99%80-%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94

 

예제로 배우는 파이썬 프로그래밍 - 직렬화와 역직렬화

직렬화와 역직렬화 파이썬의 객체를 일련의 바이트들로 변환한 후 나중에 다시 파이썬 객체로 복원하게 할 수 있는데, 이렇게 파이썬 객체를 일련의 바이트들로 변환하는 것을 직렬화(Serializatio

pythonstudy.xyz

https://docs.python.org/3/library/pickle.html

 

pickle — Python object serialization — Python 3.10.2 documentation

pickle — Python object serialization Source code: Lib/pickle.py The pickle module implements binary protocols for serializing and de-serializing a Python object structure. “Pickling” is the process whereby a Python object hierarchy is converted into

docs.python.org

 

'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