Python json & pickle & shelve模塊
阿新 • • 發佈:2017-12-31
flatten data 簡單 border png write fun pytho web頁面
註意點
json & pickle
之前我們學習過用eval內置方法可以將一個字符串轉成python對象,不過,eval方法是有局限性的,對於普通的數據類型,json.loads和eval都能用,但遇到特殊類型的時候,eval就不管用了,所以eval的重點還是通常用來執行一個字符串表達式,並返回表達式的值。
1 2 3 4 |
import json
x = "[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內置的數據類型對應如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#----------------------------序列化
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 json
f = open ( ‘序列化對象‘ )
data = json.loads(f.read()) # 等價於data=json.load(f)
|
pickle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
##----------------------------序列化
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 pickle
f = open ( ‘序列化對象_pickle‘ , ‘rb‘ )
data = pickle.loads(f.read()) # 等價於data=pickle.load(f)
print (data[ ‘age‘ ])
|
Pickle的問題和所有其他編程語言特有的序列化問題一樣,就是它只能用於Python,並且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的數據,不能成功地反序列化也沒關系。
shelve模塊
shelve模塊比pickle模塊簡單,只有一個open函數,返回類似字典的對象,可讀可寫;key必須為字符串,而值可以是python所支持的數據類型
1 2 3 4 5 6 7 8 9 10 11 12 |
import shelve
f = shelve. open (r ‘shelve.txt‘ )
# f[‘stu1_info‘]={‘name‘:‘alex‘,‘age‘:‘18‘}
# f[‘stu2_info‘]={‘name‘:‘alvin‘,‘age‘:‘20‘}
# f[‘school_info‘]={‘website‘:‘oldboyedu.com‘,‘city‘:‘beijing‘}
#
#
# f.close()
print (f.get( ‘stu_info‘ )[ ‘age‘ ])
|
Python json & pickle & shelve模塊