一、用途 我們需要將記憶體中的數據進行序列化,即寫入文件中時,寫入的類型只能是字元串或者二進位類型。但是如果我們想要將複雜一些的數據類型,如:列表、字典或者函數之類的同樣進行序列化,我們就要用到 json或者pickle。 二、json序列化 1、dumps序列化和loads反序列化 dumps把數據 ...
一、用途
我們需要將記憶體中的數據進行序列化,即寫入文件中時,寫入的類型只能是字元串或者二進位類型。但是如果我們想要將複雜一些的數據類型,如:列表、字典或者函數之類的同樣進行序列化,我們就要用到 json或者pickle。
二、json序列化
1、dumps序列化和loads反序列化
dumps把數據類型轉換成字元串
import json info = { 'name': 'The Count of Monte Cristo', 'type': 'Movie' } data = json.dumps(info) print(data) print(type(data)) # 輸出 {"name": "The Count of Monte Cristo", "type": "Movie"} <class 'str'>
loads把字元串轉換成數據類型
import json get_info = json.loads(data) print(get_info['name']) print(get_info) print(type(get_info)) #輸出 The Count of Monte Cristo {'name': 'The Count of Monte Cristo', 'type': 'Movie'} <class 'dict'>
2.dump序列化和load反序列化
dump把數據類型轉換成字元串並存儲在文件中
import json info = { 'name': 'The Count of Monte Cristo', 'type': 'Movie' } with open("test.txt", "w", encoding="utf-8") as f: json.dump(info, f) # 第一個參數是記憶體中的數據對象,第二個參數是文件句柄 #寫入文件中的內容 {"name": "The Count of Monte Cristo", "type": "Movie"}
load把文件打開從字元串轉換成數據類型
import json with open("test.txt", "r", encoding="utf-8") as f: data_from_file = json.load(f) print(data_from_file['name']) print(data_from_file) print(type(data_from_file)) #輸出 The Count of Monte Cristo {'name': 'The Count of Monte Cristo', 'type': 'Movie'} <class 'dict'>
3.json序列化一個函數
import json def test(name): print("hello,{}".format(name)) info = { 'name': 'The Count of Monte Cristo', 'type': 'Movie', 'func': test } data = json.dumps(info) #輸出 File "G:/python/untitled/study6/json&pickle模塊.py", line 22, in <module> data = json.dumps(info) File "G:\python\install\lib\json\__init__.py", line 230, in dumps return _default_encoder.encode(obj) File "G:\python\install\lib\json\encoder.py", line 198, in encode chunks = self.iterencode(o, _one_shot=True) File "G:\python\install\lib\json\encoder.py", line 256, in iterencode return _iterencode(o, 0) File "G:\python\install\lib\json\encoder.py", line 179, in default raise TypeError(repr(o) + " is not JSON serializable") TypeError: <function test at 0x0000021B13C57F28> is not JSON serializable
1、json只能處理簡單的數據類型,例如:字典、列表、字元串等,不能處理函數等複雜的數據類型。
2、json是所有語言通用的,所有語言都支持json,如果我們需要python跟其他語言進行數據交互,那麼就用json格式
三、pickle序列化
pickle的用法和上面的相同,但是pickle序列化後的數據類型是二進位的,並且pickle只能在python中是使用。pickle序列化的是位元組,而json序列化的是字元。
1.dumps && loads
import pickle def test(name): print("hello,{}".format(name)) info = { 'name': 'The Count of Monte Cristo', 'type': 'Movie', 'func': test } data = pickle.dumps(info) print(data) print(type(data)) #輸出 b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x19\x00\x00\x00The Count of Monte Cristoq\x02X\x04\x00\x00\x00typeq\x03X\x05\x00\x00\x00Movieq\x04X\x04\x00\x00\x00funcq\x05c__main__\ntest\nq\x06u.' <class 'bytes'>
import pickle get_data = pickle.loads(data) get_data['func']('cat') print(get_data) #輸出 hello,cat {'name': 'The Count of Monte Cristo', 'type': 'Movie', 'func': <function test at 0x00000235350A7F28>}
2. dump && load
import pickle def test(name): print("hello,{}".format(name)) info = { 'name': 'The Count of Monte Cristo', 'type': 'Movie', 'func': test } with open('test.txt', 'wb') as f: pickle.dump(info, f) # 寫入test.txt文件中的內容 �}q (X typeqX MovieqX funcqc__main__ test qX nameqX The Count of Monte Cristoqu.
import pickle with open('test.txt', 'rb') as f: get_data = pickle.load(f) print(get_data) # 輸出 {'name': 'The Count of Monte Cristo', 'func': <function test at 0x000001BA2AB4D510>, 'type': 'Movie'}
總結:
- json值支持簡單的數據類型,pickle支持所有的數據類型。
- pickle只能支持python本身的序列化和反序列化,不能用作和其他語言做數據交互,而json可以。
- pickle序列化的是整個的數據對象,所以反序列化函數時,函數體中的邏輯變了,是跟著心的函數體走的。