ホームページ  >  記事  >  バックエンド開発  >  インメモリデータのシリアル化の例

インメモリデータのシリアル化の例

零下一度
零下一度オリジナル
2017-07-23 10:07:431535ブラウズ

1. 目的

メモリ内のデータをシリアル化する必要があります。つまり、ファイルに書き込む場合、書き込まれる型は文字列型またはバイナリ型のみです。ただし、リスト、辞書、関数など、より複雑なデータ型をシリアル化したい場合は、json または pickle を使用する必要があります。

2. jsonシリアル化

1、シリアル化をダンプし、逆シリアル化をロードします

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 deserialization

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はすべての言語に共通であり、Pythonが他の言語とデータをやり取りする必要がある場合は、json形式を使用します

3. pickleシリアル化。

pickle 使い方は上記と同じですが、pickleでシリアル化されるデータ型はバイナリであり、pickleはPythonでのみ使用できます。

1.ダンプ&&ロード

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.ダンプ&&ロード

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。