json&pickle序列化

1、簡述

咱們在寫入文件中的數據,只能是字符串,可是若是要想把內存的數據對象存到硬盤上去怎麼辦吶?下面就來講說序列化:json & picklepython

2、json序列化

一、dumps序列化和loads反序列化json

dumps()序列化函數

import  json   #導入json模塊
 
info = {
    'name':"seven",
    "age":32
}
 
with open("test.txt","w") as f:  #以普通模式寫入
    data = json.dumps(info) #把內存對象轉爲字符串
    f.write(data)   #寫到文件中
 
#text.txt文件中的內容
{"name": "seven", "age": 32}

loads()反序列化spa

import json
 
with open("test.txt","r") as f:  #以普通模式讀
    data = json.loads(f.read())   #用loads反序列化
 
print(data.get("age"))
 
#輸出
32

二、dump序列化和load反序列化code

dump()序列化對象

import  json
 
info = {
    'name':"seven",
    "age":32
}
 
with open("test.txt","w") as f:   #文件以寫的方式打開
    json.dump(info,f)    #第1個參數是內存的數據對象 ,第2個參數是文件句柄
 
#text.txt文件中的內容
{"name": "seven", "age": 32}

load()反序列化blog

import json
 
with open("test.txt","r") as f:   #以讀的方式打開文件
    data = json.load(f)  #輸入文件對象
 
print(data["age"])
 
#輸出
32

三、序列化函數內存

import  json
 
def sayhi(name):  #函數
    print("name:",name)
 
info = {
    'name':"seven",
    "age":32,
    "func":sayhi    #引用sayhi函數名
}
 
with open("test.txt","w") as f:
    json.dump(info,f)   #序列化info數據對象
 
#輸出
 File "D:\Python\Python35\lib\json\encoder.py", line 403, in _iterencode_dict
    yield from chunks
  File "D:\Python\Python35\lib\json\encoder.py", line 436, in _iterencode
    o = _default(o)
  File "D:\Python\Python35\lib\json\encoder.py", line 179, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <function sayhi at 0x00000000006DD510> is not JSON serializable  #不支持json序列化

小結:字符串

  1. dumps和loads是成對使用的,dump和load是成對使用的。
  2. dumps和loads因爲序列化的是內容,因此後面要加s,可是dump和load序列化的內容是對象,因此單數。
  3. json只能處理簡單的數據類型,例如:字典、列表、字符串等,不能處理函數等複雜的數據類型。
  4. json是全部語言通用的,全部語言都支持json,若是咱們須要python跟其餘語言進行數據交互,那麼就用json格式。

2、pickle序列化

一、dumps序列化和loads反序列化get

dumps()序列化

import pickle
 
info = {
    'name':"seven",
    "age":32,
}
 
with open("test.txt","wb") as f:   #以二進制的形式寫入
    data = pickle.dumps(info)   #序列化成字符串
    f.write(data)   #寫入test.txt 文件中
 
#輸出到test.txt文件中的內容
�}q (X   ageqKX   nameqX
   sevenqu.

loads()反序列化

import pickle
 
with open("test.txt","rb") as f: #以二進制的模式讀
    data = pickle.loads(f.read())   #反序列化操做
 
print(data.get("age"))
 
#輸出
32

二、dump序列化和load反序列化

dump()序列化

import pickle
 
info = {
    'name':"seven",
    "age":32,
}
 
with open("test.txt","wb") as f:
    pickle.dump(info,f)  #序列化
 
#輸出
�}q (X   ageqKX   nameqX
   sevenqu.

load()反序列化

import pickle
 
with open("test.txt","rb") as f:
    data = pickle.load(f)  #反序列化成內存對象
 
print(data.get("age"))
 
#輸出
32

從上面的結果觀察,json和pickle好像也沒什麼區別?可是別忘了,咱們說,json只能序列化簡單的數據類型,而pickle能夠序列化python中全部的數據類型,包括函數、類等,下面咱們就來看看,如何序列化函數的。還有就是,pickle序列化的是字節,而json序列化的是字符,這個要注意一下。

三、序列化函數

①序列化

import pickle
 
def sayhi(name):   #函數
    print("hello:",name)
 
info = {
    'name':"seven",
    "age":32,
    "func":sayhi    #"func"對應的值sayhi,是函數名
}
 
with open("test.txt","wb") as f:
    data = pickle.dumps(info)
    f.write(data)
 
#輸出test.txt
�}q (X   funcqc__main__
sayhi
qX   ageqKX   nameqX
   seven.

②反序列化

import pickle
 
def sayhi(name):   #在反序列化中必須寫上此函數,否則會報錯,由於在加載的時候,函數沒有加載到內存
    print("hello:",name)
 
with open("test.txt","rb") as f:
    data = pickle.loads(f.read())
 
print(data.get("age"))
 
data.get("func")("seven")  #執行函數sayhi
 
#輸出
32
hello: seven   #輸出的函數體中的邏輯也是能夠變的,這邊我就不作演示了

小結:

  1. json值支持簡單的數據類型,pickle支持全部的數據類型。
  2. pickle只能支持python自己的序列化和反序列化,不能用做和其餘語言作數據交互,而json能夠。
  3. pickle序列化的是整個的數據對象,因此反序列化函數時,函數體中的邏輯變了,是跟着新的函數體走的。
  4. pickle和json在3.0中只能dump一次和load一次,在2.7裏面能夠dump屢次,load屢次,anyway,之後只記住,只須要dump一次,load一次就能夠了。
相關文章
相關標籤/搜索