標籤:ble 小結 位元組 get 行資料 內容 seve logs 載入
一、簡述
我們在寫入檔案中的資料,只能是字串,但是如果要想把記憶體的資料對象存到硬碟上去怎麼辦呐?下面就來說說序列化:json & pickle
二、json序列化
1、dumps序列化和loads還原序列化
dumps()序列化
import json #匯入json模組 info = { ‘name‘:"seven", "age":32} with open("test.txt","w") as f: #以普通模式寫入 data = json.dumps(info) #把記憶體對象轉為字串 f.write(data) #寫到檔案中 #text.txt檔案中的內容{"name": "seven", "age": 32}
loads()還原序列化
import json with open("test.txt","r") as f: #以普通模式讀 data = json.loads(f.read()) #用loads還原序列化 print(data.get("age")) #輸出32
2、dump序列化和load還原序列化
dump()序列化
import json info = { ‘name‘:"seven", "age":32} with open("test.txt","w") as f: #檔案以寫的方式開啟 json.dump(info,f) #第1個參數是記憶體的資料對象 ,第2個參數是檔案控制代碼 #text.txt檔案中的內容{"name": "seven", "age": 32}
load()還原序列化
import json with open("test.txt","r") as f: #以讀的方式開啟檔案 data = json.load(f) #輸入檔案對象 print(data["age"]) #輸出32
3、序列化函數
import json def sayhi(name): #函數 print("name:",name) info = { ‘name‘:"seven", "age":32, "func":sayhi #引用sayhi函數名} with open("test.txt","w") as f: json.dump(info,f) #序列化info資料對象 #輸出 File "D:\Python\Python35\lib\json\encoder.py", line 403, in _iterencode_dict yield from chunks File "D:\Python\Python35\lib\json\encoder.py", line 436, in _iterencode o = _default(o) File "D:\Python\Python35\lib\json\encoder.py", line 179, in default raise TypeError(repr(o) + " is not JSON serializable")TypeError: <function sayhi at 0x00000000006DD510> is not JSON serializable #不支援json序列化
小結:
- dumps和loads是成對使用的,dump和load是成對使用的。
- dumps和loads由於序列化的是內容,所以後面要加s,但是dump和load序列化的內容是對象,所以單數。
- json只能處理簡單的資料類型,例如:字典、列表、字串等,不能處理函數等複雜的資料類型。
- json是所有語言通用的,所有語言都支援json,如果我們需要python跟其他語言進行資料互動,那麼就用json格式。
二、pickle序列化
1、dumps序列化和loads還原序列化
dumps()序列化
import pickle info = { ‘name‘:"seven", "age":32,} with open("test.txt","wb") as f: #以二進位的形式寫入 data = pickle.dumps(info) #序列化成字串 f.write(data) #寫入test.txt 檔案中 #輸出到test.txt檔案中的內容?}q (X ageqKX nameqX sevenqu.
loads()還原序列化
import pickle with open("test.txt","rb") as f: #以二進位的模式讀 data = pickle.loads(f.read()) #還原序列化操作 print(data.get("age")) #輸出32
2、dump序列化和load還原序列化
dump()序列化
import pickle info = { ‘name‘:"seven", "age":32,} with open("test.txt","wb") as f: pickle.dump(info,f) #序列化 #輸出?}q (X ageqKX nameqX sevenqu.
load()還原序列化
import pickle with open("test.txt","rb") as f: data = pickle.load(f) #還原序列化成記憶體對象 print(data.get("age")) #輸出32
從上面的結果觀察,json和pickle好像也沒什麼區別?但是別忘了,我們說,json只能序列化簡單的資料類型,而pickle可以序列化python中所有的資料類型,包括函數、類等,下面我們就來看看,如何序列化函數的。還有就是,pickle序列化的是位元組,而json序列化的是字元,這個要注意一下。
3、序列化函數
①序列化
import pickle def sayhi(name): #函數 print("hello:",name) info = { ‘name‘:"seven", "age":32, "func":sayhi #"func"對應的值sayhi,是函數名} with open("test.txt","wb") as f: data = pickle.dumps(info) f.write(data) #輸出test.txt?}q (X funcqc__main__sayhiqX ageqKX nameqX seven.
②還原序列化
import pickle def sayhi(name): #在還原序列化中必須寫上此函數,不然會報錯,因為在載入的時候,函數沒有載入到記憶體 print("hello:",name) with open("test.txt","rb") as f: data = pickle.loads(f.read()) print(data.get("age")) data.get("func")("seven") #執行函數sayhi #輸出32hello: seven #輸出的函數體中的邏輯也是可以變的,這邊我就不做示範了
小結:
- json值支援簡單的資料類型,pickle支援所有的資料類型。
- pickle只能支援python本身的序列化和還原序列化,不能用作和其他語言做資料互動,而json可以。
- pickle序列化的是整個的資料對象,所以還原序列化函數時,函數體中的邏輯變了,是跟著新的函數體走的。
- pickle和json在3.0中只能dump一次和load一次,在2.7裡面可以dump多次,load多次,anyway,以後只記住,只需要dump一次,load一次就可以了。
json&pickle序列化