1. 程式人生 > >week5:模組之json、pickle、dump和load方法、shelve、xml

week5:模組之json、pickle、dump和load方法、shelve、xml

一、什麼是序列化?

我們把物件(變數)從記憶體中變成可儲存或傳輸的過程稱之為序列化。在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

六、XML模組(**)