python 序列化之JSON與pickle詳解
JSON模組
JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。它是基於ECMAScript的一個子集。 JSON採用完全獨立於語言的文字格式,但也使用了類似C語言家族的習慣(包括C、C++、Java、JavaScript、Perl、Python等)。這些特性使JSON成為理想的資料交換語言。易於人閱讀和編寫,同時也易於機器解析和生成(一般用於提升網路傳輸速率)。
JSON在python中分別由list和dict組成。
一、python類型資料和JSON資料格式互相轉換
一、python類型資料與JSON資料格式互相轉換
一、python型別資料與JSON資料格式互相轉換
一、python型別資料與JSON資料格式互相轉換pthon 中str型別至JSON轉為unicodecode型,None轉為null,dict對應為
二、資料型別,None轉為null,dict對應類型資料編解碼
#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}
#將物件序列化並儲存到檔案obj = ['foo', {'bar': ('baz', None , 1.0, 2)}]
json.dump(obj,f)
loads: 㜀將序列化字串序列化將序列化字串化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]}]
三、自訂複雜資料型別編解碼
例如我們碰到物件datetime,或是自訂的類別物件等json預設不支援的資料型別時,我們就需要自訂編解碼函數。有兩種方法來實作自訂編解碼。
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、方法二:繼承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的picklekle序列化。基本上功能使用和JSON模組沒有太大差別,方法也同樣是dumps/dump和loads/load。 cPickle是pickle模組的C語言編譯版本相對速度較快。
與JSON不同的是pickle不是用於多種語言間的資料傳輸,它僅作為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)
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)}

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

VS Code可以在Windows 8上運行,但體驗可能不佳。首先確保系統已更新到最新補丁,然後下載與系統架構匹配的VS Code安裝包,按照提示安裝。安裝後,注意某些擴展程序可能與Windows 8不兼容,需要尋找替代擴展或在虛擬機中使用更新的Windows系統。安裝必要的擴展,檢查是否正常工作。儘管VS Code在Windows 8上可行,但建議升級到更新的Windows系統以獲得更好的開發體驗和安全保障。

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

VS Code 可用於編寫 Python,並提供許多功能,使其成為開發 Python 應用程序的理想工具。它允許用戶:安裝 Python 擴展,以獲得代碼補全、語法高亮和調試等功能。使用調試器逐步跟踪代碼,查找和修復錯誤。集成 Git,進行版本控制。使用代碼格式化工具,保持代碼一致性。使用 Linting 工具,提前發現潛在問題。

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。
