標籤:imp att 版本 反序 -- web python height 等等
之前學習過用eval內建方法可以將一個字串轉成python對象,不過,eval方法是有局限性的,對於普通的資料類型,json.loads和eval都能用,但遇到特殊類型的時候,eval就不管用了,所以eval的重點還是通常用來執行一個字串運算式,並返回運算式的值。
import jsonx="[null,true,false,1]"print(eval(x))print(json.loads(x))
什麼是序列化?
我們把對象(變數)從記憶體中變成可儲存或傳輸的過程稱之為序列化,在Python中叫pickling,在其他語言中也被稱之為serialization,marshalling,flattening等等,都是一個意思。
序列化之後,就可以把序列化後的內容寫入磁碟,或者通過網路傳輸到別的機器上。
反過來,把變數內容從序列化的對象重新讀到記憶體裡稱之為還原序列化,即unpickling。
json
如果我們要在不同的程式設計語言之間傳遞對象,就必須把對象序列化為標準格式,比如XML,但更好的方法是序列化為JSON,因為JSON表示出來就是一個字串,可以被所有語言讀取,也可以方便地儲存到磁碟或者通過網路傳輸。JSON不僅是標準格式,並且比XML更快,而且可以直接在Web頁面中讀取,非常方便。
JSON表示的對象就是標準的JavaScript語言的對象,JSON和Python內建的資料類型對應如下:
#----------------------------序列化import json dic={‘name‘:‘alvin‘,‘age‘:23,‘sex‘:‘male‘}print(type(dic))#<class ‘dict‘> j=json.dumps(dic)print(type(j))#<class ‘str‘> f=open(‘序列化對象‘,‘w‘)f.write(j) #-------------------等價於json.dump(dic,f)f.close()#-----------------------------還原序列化<br>import jsonf=open(‘序列化對象‘)data=json.loads(f.read())# 等價於data=json.load(f)
import json#dct="{‘1‘:111}"#json 不認單引號#dct=str({"1":111})#報錯,因為產生的資料還是單引號:{‘one‘: 1}dct=‘{"1":"111"}‘print(json.loads(dct))#conclusion:# 無論資料是怎樣建立的,只要滿足json格式,就可以json.loads出來,不一定非要dumps的資料才能loads注意點
pickle
##----------------------------序列化import pickle dic={‘name‘:‘alvin‘,‘age‘:23,‘sex‘:‘male‘} print(type(dic))#<class ‘dict‘> j=pickle.dumps(dic)print(type(j))#<class ‘bytes‘> f=open(‘序列化對象_pickle‘,‘wb‘)#注意是w是寫入str,wb是寫入bytes,j是‘bytes‘f.write(j) #-------------------等價於pickle.dump(dic,f) f.close()#-------------------------還原序列化import picklef=open(‘序列化對象_pickle‘,‘rb‘) data=pickle.loads(f.read())# 等價於data=pickle.load(f) print(data[‘age‘])
Pickle的問題和所有其他程式設計語言特有的序列化問題一樣,就是它只能用於Python,並且可能不同版本的Python彼此都不相容,因此,只能用Pickle儲存那些不重要的資料,不能成功地還原序列化也沒關係。
json模組 & pickle模組