序列化:是指將本來的字典,列表的內容轉換成一個字符串的過程python
序列化的過程:把其餘數據類型轉化成字符串,bytes的過程json
序列化的目的:ide
1.以某種儲存形式使自定義對象持久化 2.將對象從一個地方傳遞到另外一個地方 3.使程序更具維護性
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存在的問題對象
問題一:序列化再反序列化後會將字典中的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會報錯
那麼若是連續的存取操做就須要以下處理:
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'])
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'>
當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