데이터 직렬화

../_images/33467946364_3e59bd376a_k_d.jpg

데이터 직렬화란?

데이터 직렬화는 구조화된 데이터를 원래 구조를 복원할 수 있는 형태로 공유하거나 저장할 수 있게 해주는 포맷으로 변환하는 과정입니다. 경우에 따라 데이터 직렬화의 부차적인 목적은 데이터 크기를 최소화하여 디스크 공간이나 대역폭 요구를 줄이는 것입니다.

평면(Flat) 데이터 vs. 중첩(Nested) 데이터

데이터를 직렬화하기 전에, 직렬화 과정에서 데이터를 어떻게 구조화할지 — 평면으로 할지 중첩으로 할지 — 를 파악하거나 결정하는 것이 중요합니다. 두 스타일의 차이는 아래 예시에서 볼 수 있습니다.

평면(Flat) 스타일:

{ "Type" : "A", "field1": "value1", "field2": "value2", "field3": "value3" }

중첩(Nested) 스타일:

{"A"
    { "field1": "value1", "field2": "value2", "field3": "value3" } }

두 스타일에 대한 더 자세한 내용은 Python 메일링 리스트, IETF 메일링 리스트, Stack Exchange 의 논의를 참고하세요.

텍스트 직렬화

단순한 파일(평면 데이터)

직렬화할 데이터가 파일에 있고 평면 데이터로 구성되어 있다면, 파이썬은 데이터를 직렬화하는 두 가지 방법을 제공합니다.

repr

파이썬의 repr 메소드는 객체 하나를 파라미터로 받아 입력을 출력 가능한 표현으로 반환합니다:

# input as flat text
a =  { "Type" : "A", "field1": "value1", "field2": "value2", "field3": "value3" }

# the same input can also be read from a file
a = open('/tmp/file.py', 'r')

# returns a printable representation of the input;
# the output can be written to a file as well
print(repr(a))

# write content to files using repr
with open('/tmp/file.py') as f:f.write(repr(a))

ast.literal_eval

literal_eval 메소드는 파이썬 데이터 타입에 대한 표현식을 안전하게 파싱하고 평가합니다. 지원하는 데이터 타입은 문자열, 숫자, 튜플, 리스트, 딕셔너리, 불린, None입니다.

with open('/tmp/file.py', 'r') as f: inp = ast.literal_eval(f.read())

CSV 파일(평면 데이터)

파이썬의 CSV 모듈은 CSV 포맷의 테이블 데이터를 읽고 쓰는 클래스를 구현합니다.

읽기 간단 예시:

# Reading CSV content from a file
import csv
with open('/tmp/file.csv', newline='') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

쓰기 간단 예시:

# Writing CSV content to a file
import csv
with open('/temp/file.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerows(iterable)

모듈의 내용, 함수, 예시는 파이썬 문서 에서 볼 수 있습니다.

YAML(중첩 데이터)

파이썬에서 YAML 파일 구조를 파싱하고 읽고 쓰는 서드파티 모듈이 많이 있습니다. 그 예시 중 하나가 아래에 있습니다.

# Reading YAML content from a file using the load method
import yaml
with open('/tmp/file.yaml', 'r', newline='') as f:
    try:
        print(yaml.load(f))
    except yaml.YAMLError as ymlexcp:
        print(ymlexcp)

서드파티 모듈에 대한 문서는 PyYAML 문서 에서 볼 수 있습니다.

JSON 파일(중첩 데이터)

파이썬의 JSON 모듈로 JSON 파일을 읽고 쓸 수 있습니다. 예시 코드는 아래와 같습니다.

읽기:

# Reading JSON content from a file
import json
with open('/tmp/file.json', 'r') as f:
    data = json.load(f)

쓰기:

# Writing JSON content to a file using the dump method
import json
with open('/tmp/file.json', 'w') as f:
    json.dump(data, f, sort_keys=True)

XML(중첩 데이터)

파이썬에서의 XML 파싱은 xml 패키지를 사용하여 가능합니다.

예시:

# reading XML content from a file
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()

xml.domxml.sax 패키지 사용에 대한 더 자세한 문서는 파이썬 XML 라이브러리 문서 에서 볼 수 있습니다.

바이너리

NumPy 배열(평면 데이터)

파이썬의 NumPy 배열은 데이터를 바이트 표현으로 직렬화하거나 바이트 표현으로부터 역직렬화하는 데 사용할 수 있습니다.

예시:

import NumPy as np

# Converting NumPy array to byte format
byte_output = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]).tobytes()

# Converting byte format back to NumPy array
array_format = np.frombuffer(byte_output)

Pickle(중첩 데이터)

파이썬의 기본 데이터 직렬화 모듈은 Pickle 이라고 합니다.

예시는 다음과 같습니다:

import pickle

#Here's an example dict
grades = { 'Alice': 89, 'Bob': 72, 'Charles': 87 }

#Use dumps to convert the object to a serialized string
serial_grades = pickle.dumps( grades )

#Use loads to de-serialize an object
received_grades = pickle.loads( serial_grades )

Protobuf

여러 언어에서 지원되는 직렬화 모듈을 찾고 있다면, Google의 Protobuf 라이브러리가 한 선택지입니다.