>  기사  >  백엔드 개발  >  Python 직렬화를 위한 JSON 및 피클에 대한 자세한 설명

Python 직렬화를 위한 JSON 및 피클에 대한 자세한 설명

高洛峰
高洛峰원래의
2016-10-29 10:17:041408검색

JSON 모듈

JSON(JavaScript Object Notation)은 경량 데이터 교환 형식입니다. ECMAScript의 하위 집합을 기반으로 합니다. JSON은 완전히 언어 독립적인 텍스트 형식을 사용하지만 C 언어 계열(C, C++, Java, JavaScript, Perl, Python 등 포함)과 유사한 규칙도 사용합니다. 이러한 속성은 JSON을 이상적인 데이터 교환 언어로 만듭니다. 사람이 읽고 쓰기가 쉽고 기계가 구문 분석하고 생성하기도 쉽습니다(일반적으로 네트워크 전송 속도를 높이는 데 사용됨).
JSON은 Python에서 각각 list와 dict로 구성됩니다.

1. Python 형식 데이터와 JSON 데이터 형식을 서로 변환합니다.

Python 직렬화를 위한 JSON 및 피클에 대한 자세한 설명

pthon JSON의 str 형식은 unicode 형식으로 변환하고, None은 형식으로 변환합니다. null, dict는 객체에 대응

2. 데이터 인코딩 및 디코딩

1. 단순형 데이터 인코딩 및 디코딩

소위 단순형은 Python 형식을 의미합니다. 위의 표에 나옵니다.

dumps: 객체 직렬화

#coding:utf-8
import json

# 简单编码===========================================
print json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
# ["foo", {"bar": ["baz", null, 1.0, 2]}]

#字典排序
print json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
# {"a": 0, "b": 0, "c": 0}

#自定义分隔符
print json.dumps([1,2,3,{'4': 5, '6': 7}], sort_keys=True, separators=(',',':'))
# [1,2,3,{"4":5,"6":7}]
print json.dumps([1,2,3,{'4': 5, '6': 7}], sort_keys=True, separators=('/','-'))
# [1/2/3/{"4"-5/"6"-7}]

#增加缩进,增强可读性,但缩进空格会使数据变大
print json.dumps({'4': 5, '6': 7}, sort_keys=True,indent=2, separators=(',', ': '))
# {
#   "4": 5,
#   "6": 7
# }


# 另一个比较有用的dumps参数是skipkeys,默认为False。
# dumps方法存储dict对象时,key必须是str类型,如果出现了其他类型的话,那么会产生TypeError异常,如果开启该参数,设为True的话,会忽略这个key。
data = {'a':1,(1,2):123}
print json.dumps(data,skipkeys=True)
#{"a": 1}

dump: 객체 직렬화 후 파일에 저장

# 객체 직렬화 후 파일 저장 obj = [ ' foo', {'bar': ('baz', None, 1.0, 2)}]
with open(r"c:json.txt","w+") as f:
json.dump ( obj,f)

loads: 직렬화된 문자열을 역직렬화

import json

obj = ['foo', {'bar': ('baz', None, 1.0, 2)}]
a= json.dumps(obj)
print json.loads(a)
# [u'foo', {u'bar': [u'baz', None, 1.0, 2]}]

load: 파일에서 직렬화된 문자열을 읽고 역직렬화

open( r"c:json.txt","r") as f: print json.load(f)

3. 사용자 정의 복합 데이터 유형 인코딩 및 디코딩

예: 기본적으로 json에서 지원하지 않는 날짜/시간 객체 또는 사용자 정의 클래스 객체와 같은 데이터 유형이 발견되면 인코딩 및 디코딩 기능을 사용자 정의해야 합니다. 사용자 정의 코덱을 구현하는 방법에는 두 가지가 있습니다.

1. 방법 1: 인코딩 및 디코딩 기능 사용자 정의

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = "TKQ"
import datetime,json

dt = datetime.datetime.now()



def time2str(obj):
    #python to json
    if isinstance(obj, datetime.datetime):
        json_str = {"datetime":obj.strftime("%Y-%m-%d %X")}
        return json_str
    return obj

def str2time(json_obj):
    #json to python
    if "datetime" in json_obj:
        date_str,time_str = json_obj["datetime"].split(' ')
        date = [int(x) for x in date_str.split('-')]
        time = [int(x) for x in time_str.split(':')]
        dt = datetime.datetime(date[0],date[1], date[2], time[0],time[1], time[2])
        return dt
    return json_obj


a = json.dumps(dt,default=time2str)
print a
# {"datetime": "2016-10-27 17:38:31"}
print json.loads(a,object_hook=str2time)
# 2016-10-27 17:38:31

2. 방법 2: JSONEncoder 및 JSONDecoder 클래스를 상속하고 관련 메서드를 다시 작성합니다

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = "TKQ"
import datetime,json

dt = datetime.datetime.now()
dd = [dt,[1,2,3]]

class MyEncoder(json.JSONEncoder):
    def default(self,obj):
        #python to json
        if isinstance(obj, datetime.datetime):
            json_str = {"datetime":obj.strftime("%Y-%m-%d %X")}
            return json_str
        return obj

class MyDecoder(json.JSONDecoder):
    def __init__(self):
        json.JSONDecoder.__init__(self, object_hook=self.str2time)

    def str2time(self,json_obj):
        #json to python
        if "datetime" in json_obj:
            date_str,time_str = json_obj["datetime"].split(' ')
            date = [int(x) for x in date_str.split('-')]
            time = [int(x) for x in time_str.split(':')]
            dt = datetime.datetime(date[0],date[1], date[2], time[0],time[1], time[2])
            return dt
        return json_obj


# a = json.dumps(dt,default=time2str)
a =MyEncoder().encode(dd)
print a
# [{"datetime": "2016-10-27 18:14:54"}, [1, 2, 3]]
print MyDecoder().decode(a)
# [datetime.datetime(2016, 10, 27, 18, 14, 54), [1, 2, 3]]

pickle 모듈

Python의 pickle 모듈은 Python의 모든 데이터 직렬화 및 역직렬화를 구현합니다. 기본적으로 함수 사용법은 JSON 모듈과 크게 다르지 않으며, 메소드도 덤프/덤프, 로드/로드가 있다. cPickle은 상대적으로 빠른 C 컴파일 버전의 피클 모듈입니다.

JSON과 달리 피클은 여러 언어 간 데이터 전송에 사용되지 않습니다. Python 객체의 지속성 방법이나 Python 프로그램 간 객체 전송 방법으로만 사용되므로 모든 Python 데이터 유형을 지원합니다. .

pickle로 역직렬화된 객체는 deepcopy와 유사하게 원본 객체와 동등한 복사 객체입니다.

dumps/dump 직렬화

from datetime import date

try:
    import cPickle as pickle    #python 2
except ImportError as e:
    import pickle   #python 3


src_dic = {"date":date.today(),"oth":([1,"a"],None,True,False),}
det_str = pickle.dumps(src_dic)
print det_str
# (dp1
# S'date'
# p2
# cdatetime
# date
# p3
# (S'\x07\xe0\n\x1b'
# tRp4
# sS'oth'
# p5
# ((lp6
# I1
# aS'a'
# aNI01
# I00
# tp7
# s.
with open(r"c:\pickle.txt","w") as f:
    pickle.dump(src_dic,f)

loads/load deserialization

from datetime import date

try:
    import cPickle as pickle    #python 2
except ImportError as e:
    import pickle   #python 3


src_dic = {"date":date.today(),"oth":([1,"a"],None,True,False),}
det_str = pickle.dumps(src_dic)
with open(r"c:\pickle.txt","r") as f:
    print pickle.load(f)
# {'date': datetime.date(2016, 10, 27), 'oth': ([1, 'a'], None, True, False)}

JSON과 피클 모듈의 차이점

1. JSON만 기본입니다. 데이터 유형을 처리할 수 있습니다. 피클은 모든 Python 데이터 유형을 처리할 수 있습니다.

2. JSON은 다양한 언어 간의 문자 변환에 사용됩니다. Pickle은 Python 프로그램 개체의 지속성 또는 Python 프로그램 간 개체의 네트워크 전송에 사용되지만, Python 버전에 따라 직렬화에 차이가 있을 수 있습니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.