Pythonの序列化と反前列化を簡単に分析する。


プログレッシブは、オブジェクトの状態情報を記憶または伝送可能な形式に変換するプロセスである。プログレッシブ中に、オブジェクトは、その現在の状態(メモリの存在)を一時的または耐久性の記憶領域(ハードディスク)に書き込む。以降、記憶領域からオブジェクトの状態を読み取ったり、逆順序にしたりすることで、そのオブジェクトを再作成することができます。
オブジェクトのプログレッシブ化とアンチプログレッシブ化には、pythonの2つの方法があります。jsonとpickle。
jsonは文字列とpythonデータタイプの間で変換され、pickleはpython特有のタイプとpythonのデータタイプの間で変換されます。pickleはpython特有のものです。
1、JSONプロローグ:Json.dumps()

info = {
  "name":"tj",
  "age":22
}
import json
print(info)
print(type(info))
print(json.dumps(info))
print(type(json.dumps(info)))

f = open("test.txt","w")
# f.write(info)  # TypeError: write() argument must be str, not dict
f.write(json.dumps(info)) #        f.write(json.dumps(info))     json.dump(info, f)
f.close()

>>>
{'name': 'tj', 'age': 22}
<class 'dict'>
{"name": "tj", "age": 22}
<class 'str'>
2、JSONアンチプロローグ:Json.loads()

f = open("test.txt","r")
# print(f.read()["age"]) #TypeError: string indices must be integers
data = json.loads(f.read()) # data = json.loads(f.read())     data = json.load(f)
print(data["age"])
f.close()

>>>
22
以下のような場合はJsonでは処理できません。

import json
def hello(name):
  print("hello,",name)
info = {
  "name":"tj",
  "age":22,
  "func":hello
}
f = open("test2.txt","w")
f.write(json.dumps(info)) #TypeError: Object of type function is not JSON serializable
f.close()
だから、jsonは文字列とpythonデータタイプの間で変換します。
3、pickle序列化:pickle.dumps()

import pickle
def hello(name):
  print("hello,",name)
info = {
  "name":"tj",
  "age":22,
  "func":hello
}

print(pickle.dumps(info)) #  pickle            ,     wb        
f = open("test2.txt","wb")
f.write(pickle.dumps(info)) #     pickle.dump(info,f)
f.close()

>>>
b'\x80\x04\x957\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x04alex\x94\x8c\x03age\x94K\x16\x8c\x04func\x94\x8c\x08__main__\x94\x8c\x05hello\x94\x93\x94u.'
関数helloに対しては、メモリアドレスではなく、全体のデータオブジェクトをプロビジョニングします。
4、pickle逆序列化:pickle.loads()

f = open("test2.txt","rb")
data = pickle.loads(f.read()) #    data = pickle.load(f)
print(data)
print(data["name"])
print(data["func"])

>>>
{'name': 'tj', 'age': 22, 'func': <function hello at 0x00000179EF69C040>}
tj
<function hello at 0x00000179EF69C040>
5、マルチプロローグと反プロローグ
1)Json

import json
info = {
  "name":"tj",
  "age":22
}

f = open("test3.txt","w")
f.write(json.dumps(info))
info['age'] = 21
f.write(json.dumps(info))
f.close()
# 
>>>
      test3    
test3.txt: {"name": "tj", "age": 22}{"name": "tj", "age": 21}

f = open("test3.txt","r")
#   ,py3  ,  dumps         ,py2  dumps          ,           
data = json.loads(f.read()) # json.decoder.JSONDecodeError
f.close()
print(data)
2)pickle

import pickle

info = {
  "name":"tj",
  "age":22
}

f = open("test2.txt","wb")
f.write(pickle.dumps(info)) #     pickle.dump(info,f)
info["sex"] = " "
f.write(pickle.dumps(info)) #     pickle.dump(info,f)
f.close()

>>>
      test2.txt    
test2.txt: ��    }�(�nametjageKu.��%    }�(�nametjageK�sex u.

f = open("test2.txt","rb")
data = pickle.loads(f.read()) #          
# data = pickle.loads(f.read()) #        :EOFError: Ran out of input
print(data)
print(data["age"])
# print(data["sex"]) # KeyError: 'sex'
王さん:何度も順番に並べられないんですか?私が修正したデータは逐次的にファイルに書き込む必要があります。どうすればいいですか?
あなた:もちろん何度も順番に並べられます。データを複数の書類に書いたらいいじゃないですか?
以上はPythonプロローグと反プロローグの詳細です。Pythonプロローグと反プロローグに関する詳細については、他の関連記事に注目してください。