序列化模塊

序列化:是指將本來的字典,列表的內容轉換成一個字符串的過程python

序列化的過程:把其餘數據類型轉化成字符串,bytes的過程json

序列化的目的:ide

1.以某種儲存形式使自定義對象持久化
2.將對象從一個地方傳遞到另外一個地方
3.使程序更具維護性

B(8XC6YU6KK]CL{K4EEP03K

json

json模塊包含四個功能:dumps,loads,dump,loadui

json在全部的語言之間都通用,及json序列化的數據在python上序列化了那麼在Java等語言中也可反序列化,可是json也有侷限,就是它能處理的數據類型很是有限,spa

必須是字符串,列表,字典和數字,且字典中的key值只能是字符串3d

序列化與反序列化

dumps 與 loadscode

dic = {'key': 'value', 'key2': 'value2'}
ret = json.dumps(dic)  # 序列化
print(dic, type(dic))
print(ret, type(ret))
運行結果:
{'key': 'value', 'key2': 'value2'} <class 'dict'>
{"key": "value", "key2": "value2"} <class 'str'>
#注意,json轉換完的字符串類型的字典中的字符串是由""表示的


res = json.loads(ret)  # 反序列化
print(res, type(res))
運行結果:
{'key': 'value', 'key2': 'value2'} <class 'dict'>
#注意,要用json的loads功能處理的字符串類型的字典中的字符串必須由""表示
dumps與loads

dumps與loads存在的問題對象

問題一:序列化再反序列化後會將字典中的int變爲strblog

dic = {1: 'value', 2: 'value2'}
ret = json.dumps(dic)  # 序列化
print(dic, type(dic))
print(ret, type(ret))

res = json.loads(ret)  # 反序列化
print(res, type(res))
運行結果:
{1: 'value', 2: 'value2'} <class 'dict'>
{"1": "value", "2": "value2"} <class 'str'>
{'1': 'value', '2': 'value2'} <class 'dict'>

問題二:序列化再反序列化後會將字典中的元組變爲列表ip

dic = {1: [1, 2, 3], 2: (4, 5, 'aa')}
ret = json.dumps(dic)  # 序列化
print(dic, type(dic))
print(ret, type(ret))

res = json.loads(ret)  # 反序列化
print(res, type(res))
運行結果:
{1: [1, 2, 3], 2: (4, 5, 'aa')} <class 'dict'>
{"1": [1, 2, 3], "2": [4, 5, "aa"]} <class 'str'>
{'1': [1, 2, 3], '2': [4, 5, 'aa']} <class 'dict'>

問題三:不能夠序列化集合

s = {1, 2, 'aaa'}
json.dumps(s)

問題四:序列化的字典中不可用str之外的類型做爲字典的key

json.dumps({(1, 2, 3): 123})
TypeError: keys must be a string

dump 與 load 用來直接與文件進行操做

dic = {'key1': 'value1', 'key2': 'value2'}
with open('json_file', 'a') as f:
    json.dump(dic, f)

with open('json_file', 'r') as f:
    dic = json.load(f)
print(dic.keys())
運行結果:
dict_keys(['key1', 'key2'])
# 需注意的是能夠屢次dump,可是屢次dump後的load會報錯
dump與load

那麼若是連續的存取操做就須要以下處理:

dic = {'key1': 'value1', 'key2': 'value2'}
with open('json_file', 'a') as f:
    str_dic = json.dumps(dic)
    f.write(str_dic+'\n')
    str_dic = json.dumps(dic)
    f.write(str_dic + '\n')
    str_dic = json.dumps(dic)
    f.write(str_dic + '\n')

with open('json_file', 'r') as f:
    for line in f:
        dic = json.loads(line.strip())
        print(dic.keys())
運行結果:
dict_keys(['key1', 'key2'])
dict_keys(['key1', 'key2'])
dict_keys(['key1', 'key2'])
連續的dump與load處理

pickle

pickle進行的序列化支持python的幾乎全部的數據類型

pickle模塊一樣包含四個功能:dumps,loads,dump,load

dic = {(1, 2, 3): {'a', 'b'}, 1: 'abc'}
ret = pickle.dumps(dic)
print(ret)
運行結果:
b'\x80\x03}q\x00(K\x01K\x02K\x03\x87q\x01cbuiltins\nset\nq\x02]q\x03(X\x01\x00\x00\x00bq\x04X\x01\x00\x00\x00aq\x05e\x85q\x06Rq\x07K\x01X\x03\x00\x00\x00abcq\x08u.'
# pickle.dumps的結果只能是字節

與json不一樣pickle.dump和pickle.load能夠進行屢次

dic = {(1, 2, 3): {'a', 'b'}, 1: 'abc'}
dic1 = {(1, 2, 3): {'a', 'b'}, 2: 'abc'}
dic2 = {(1, 2, 3): {'a', 'b'}, 3: 'abc'}
dic3 = {(1, 2, 3): {'a', 'b'}, 4: 'abc'}
with open('pickle_file', 'wb') as f:
    pickle.dump(dic, f)
    pickle.dump(dic1, f)
    pickle.dump(dic2, f)
    pickle.dump(dic3, f)

with open('pickle_file', 'rb') as f:
    ret = pickle.load(f)
    print(ret, type(ret))
    ret = pickle.load(f)
    print(ret, type(ret))
    ret = pickle.load(f)
    print(ret, type(ret))
    ret = pickle.load(f)
    print(ret, type(ret))
運行結果:
{(1, 2, 3): {'a', 'b'}, 1: 'abc'} <class 'dict'>
{(1, 2, 3): {'a', 'b'}, 2: 'abc'} <class 'dict'>
{(1, 2, 3): {'a', 'b'}, 3: 'abc'} <class 'dict'>
{(1, 2, 3): {'a', 'b'}, 4: 'abc'} <class 'dict'>
pickle

當load的次數超過dump時會進行範圍的報錯,能夠用try--except解決:

with open('pickle_file', 'rb') as f:
    while True:
        try:
            ret = pickle.load(f)
            print(ret, type(ret))
        except EOFError:
            break
相關文章
相關標籤/搜索