week5:模組之json、pickle、dump和load方法、shelve、xml
阿新 • • 發佈:2018-11-10
一、什麼是序列化?
我們把物件(變數)從記憶體中變成可儲存或傳輸的過程稱之為序列化。在python中叫picking。
序列化之後,就可以把序列化的內容寫入磁碟,或者通過網路傳輸到別的機器上。
反過來,把變數內容從序列化的物件重新讀到記憶體裡稱之為反序列化。即unpicking
二、json模組
如果要在不同的語言之間傳遞物件,需要把物件序列化為標準格式。json表示出來就是一個字串,可以被所有的語言讀取,也可以方便的儲存到磁碟或者通過網路傳輸。XML
json表示的物件就是就是標準的javascript語言的物件。json和python內建的資料型別對應如下:
import json dic = {'name': 'alex', 'age': '18'} data = json.dumps(dic) f = open('JSON_text', 'w') f.write(data) f.close()
輸出結果:{"age": "18", "name": "alex"}
import json
f = open('JSON_text', 'r')
data = f.read()
data = json.loads(data)
print(data['name'])
輸出結果:name
三、pickle模組
json支援字典,列表,但不支援函式和類。而pickle支援更多的型別(如函式和類),可以序列化一個函式
import pickle def foo(): print('ok') data = pickle.dumps(foo) f = open('PICKLE_text', 'wb')#寫成BYTES型別 f.write(data) f.close()
輸出結果:
import pickle f = open('PICKLE_text', 'rb') data = f.read() data = pickle.loads(data) data() ########################### Traceback (most recent call last): File "C:/Users/asus/PycharmProjects/fullstack/week4/day2/bin.py", line 82, in <module> data = pickle.loads(data) AttributeError: Can't get attribute 'foo' on <module '__main__' from 'C:/Users/asus/PycharmProjects/fullstack/week4/day2/bin.py'>
沒有輸出結果,改進如下:
import pickle
def foo():
print('ok')
f = open('PICKLE_text', 'rb')
data = f.read()
data = pickle.loads(data)
data() ###ok
四、dump load方法
dump:
import json
dic = {'name': 'alex', 'age': '18'}
f = open('JSON_text', 'w')
json.dump(dic,f) ## data = json.dumps(dic) f.write(data)
f.close()
load:
import json
f = open('JSON_text', 'r')
#data = f.read()
#data = json.loads(data)
data = json.load(f)
print(data['name'])
五、shelve模組(***)
shelve模組比pickle模組簡單,只有一個open函式,可讀可寫。key必須為字串,而值可以是python所支援的資料型別。
import shelve
f = shelve.open('SHELVE_text')
f['info'] = {'name': 'alex', 'age': '18'}
以以下3種方式進行儲存,然後進行取出
import shelve
f = shelve.open('SHELVE_text')
#
# f['info'] = {'name': 'alex', 'age': '18'}
data = f.get('info')
print(data)
輸出結果:{'age': '18', 'name': 'alex'}
r在正則表示式裡 是為了保持原生字串
字典補充:
d = {'name': 'alex', 'age': '18'}
print(d.get('name')) #alex
print(d.get('sex')) ##None
print(d.get('sex', 'male')) ##male