Python--シーケンス化と逆シーケンス化

17505 ワード

シーケンス化は、オブジェクトのステータス情報を格納または転送可能な形式に変換するプロセスである.シーケンス化の間、オブジェクトは現在の状態(メモリが存在する)を一時的または永続的なストレージ領域(ハードディスク)に書き込みます.その後、オブジェクトの状態をストレージ領域から読み出したり逆シーケンス化したりすることで、オブジェクトを再作成できます.
オブジェクトのシーケンス化と逆シーケンス化を実現するにはpythonに2つの方法があります:jsonとpickle.
ここでjsonは文字列とpythonデータ型間の変換に用いられ、pickleはpython特有のタイプとpythonのデータ型間の変換に用いられ、pickleはpython特有である.
1、JSONシーケンス化:json.dumps()
 1 info = {
 2     "name":"tj",
 3     "age":22
 4 }
 5 import  json
 6 print(info)
 7 print(type(info))
 8 print(json.dumps(info))
 9 print(type(json.dumps(info)))
10 
11 f = open("test.txt","w")
12 # f.write(info)   # TypeError: write() argument must be str, not dict
13 f.write(json.dumps(info)) #        f.write(json.dumps(info))     json.dump(info, f)
14 f.close()
15 
16 >>>
17 {'name': 'tj', 'age': 22}
18 <class 'dict'>
19 {"name": "tj", "age": 22}
20 <class 'str'>

2、JSON逆シーケンス化:json.loads()
1 f = open("test.txt","r")
2 # print(f.read()["age"])  #TypeError: string indices must be integers
3 data = json.loads(f.read())  # data = json.loads(f.read())     data = json.load(f)
4 print(data["age"])
5 f.close()
6 
7 >>>
8 22

注意:以下の場合jsonは処理できません
 1 import  json
 2 def hello(name):
 3     print("hello,",name)
 4 info = {
 5     "name":"tj",
 6     "age":22,
 7     "func":hello
 8 }
 9 f = open("test2.txt","w")
10 f.write(json.dumps(info)) #TypeError: Object of type function is not JSON serializable
11 f.close()

したがって、jsonは文字列とpythonデータ型間の変換に使用されます.
3、pickleシーケンス化:pickle.dumps()
 1 import  pickle
 2 def hello(name):
 3     print("hello,",name)
 4 info = {
 5     "name":"tj",
 6     "age":22,
 7     "func":hello
 8 }
 9 
10 print(pickle.dumps(info)) #  pickle            ,     wb        
11 f = open("test2.txt","wb")
12 f.write(pickle.dumps(info)) #     pickle.dump(info,f)
13 f.close()
14 
15 >>>
16 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': }
tj

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: ��       }�(�name tj age u.��%       }�(�name tj age �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'

王さん:何度もシーケンス化できないのではないでしょうか.では、私が修正したデータをシーケンス化してファイルに書き込む必要があります.どうすればいいですか?
あなた:もちろん何度もシーケンス化して、シーケンス化したデータを複数のファイルに書けばいいんじゃないですか.