首頁  >  文章  >  後端開發  >  記憶體中資料序列化實例

記憶體中資料序列化實例

零下一度
零下一度原創
2017-07-23 10:07:431535瀏覽

一、用途

  我們需要將記憶體中的資料進行序列化,也就是寫入檔案時,寫入的型別只能是字串或二進位型別。但是如果我們想要將複雜一些的資料類型,如:列表、字典或函數之類的同樣進行序列化,我們就要用到 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 &#39;str&#39;>

loads把字串轉換成資料型別 

import json

get_info = json.loads(data)
print(get_info[&#39;name&#39;])
print(get_info)
print(type(get_info))

#输出
The Count of Monte Cristo
{&#39;name&#39;: &#39;The Count of Monte Cristo&#39;, &#39;type&#39;: &#39;Movie&#39;}
<class &#39;dict&#39;> 

2.dump序列化與load反序列化

dump把數據類型轉換成字串並儲存在檔案中

import json

info = {
    &#39;name&#39;: &#39;The Count of Monte Cristo&#39;,
    &#39;type&#39;: &#39;Movie&#39;
}

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[&#39;name&#39;])
print(data_from_file)
print(type(data_from_file))

#输出
The Count of Monte Cristo
{&#39;name&#39;: &#39;The Count of Monte Cristo&#39;, &#39;type&#39;: &#39;Movie&#39;}
<class &#39;dict&#39;>

  

3.json序列化一個函數

import json

def test(name):
    print("hello,{}".format(name))

info = {
    &#39;name&#39;: &#39;The Count of Monte Cristo&#39;,
    &#39;type&#39;: &#39;Movie&#39;,
    &#39;func&#39;: 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中是使用。

1.dumps && loads

import pickle


def test(name):
    print("hello,{}".format(name))

info = {
    &#39;name&#39;: &#39;The Count of Monte Cristo&#39;,
    &#39;type&#39;: &#39;Movie&#39;,
    &#39;func&#39;: test
}

data = pickle.dumps(info)
print(data)
print(type(data))

#输出
b&#39;\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.&#39;

<class &#39;bytes&#39;>

 

import pickle

get_data = pickle.loads(data)
get_data[&#39;func&#39;](&#39;cat&#39;)
print(get_data)

#输出
hello,cat
{&#39;name&#39;: &#39;The Count of Monte Cristo&#39;, &#39;type&#39;: &#39;Movie&#39;, &#39;func&#39;: <function test at 0x00000235350A7F28>}

      
  • #2. dump && load

  • import pickle
    
    
    def test(name):
        print("hello,{}".format(name))
    
    info = {
        &#39;name&#39;: &#39;The Count of Monte Cristo&#39;,
        &#39;type&#39;: &#39;Movie&#39;,
        &#39;func&#39;: test
    }
    
    with open(&#39;test.txt&#39;, &#39;wb&#39;) 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(&#39;test.txt&#39;, &#39;rb&#39;) as f:
        get_data = pickle.load(f)
    print(get_data)
    
    # 输出
    
    {&#39;name&#39;: &#39;The Count of Monte Cristo&#39;, &#39;func&#39;: <function test at 0x000001BA2AB4D510>, &#39;type&#39;: &#39;Movie&#39;}
  • #  

############################################################################### json值支援簡單的資料類型,pickle支援所有的資料類型。 ############pickle只能支援python本身的序列化和反序列化,不能用作和其他語言做資料交互,而json可以。 ############pickle序列化的是整個的資料對象,所以反序列化函數時,函數體中的邏輯變了,是跟著心的函數體走的。 ############ ####

以上是記憶體中資料序列化實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn