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