Python--シーケンス化と逆シーケンス化
17505 ワード
シーケンス化は、オブジェクトのステータス情報を格納または転送可能な形式に変換するプロセスである.シーケンス化の間、オブジェクトは現在の状態(メモリが存在する)を一時的または永続的なストレージ領域(ハードディスク)に書き込みます.その後、オブジェクトの状態をストレージ領域から読み出したり逆シーケンス化したりすることで、オブジェクトを再作成できます.
オブジェクトのシーケンス化と逆シーケンス化を実現するにはpythonに2つの方法があります:jsonとpickle.
ここでjsonは文字列とpythonデータ型間の変換に用いられ、pickleはpython特有のタイプとpythonのデータ型間の変換に用いられ、pickleはpython特有である.
1、JSONシーケンス化:json.dumps()
2、JSON逆シーケンス化:json.loads()
注意:以下の場合jsonは処理できません
したがって、jsonは文字列とpythonデータ型間の変換に使用されます.
3、pickleシーケンス化:pickle.dumps()
4、pickle逆シーケンス化:pickle.loads()
5、複数回のシーケンス化と逆シーケンス化
1)json
2)pickle
王さん:何度もシーケンス化できないのではないでしょうか.では、私が修正したデータをシーケンス化してファイルに書き込む必要があります.どうすればいいですか?
あなた:もちろん何度もシーケンス化して、シーケンス化したデータを複数のファイルに書けばいいんじゃないですか.
オブジェクトのシーケンス化と逆シーケンス化を実現するには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'
王さん:何度もシーケンス化できないのではないでしょうか.では、私が修正したデータをシーケンス化してファイルに書き込む必要があります.どうすればいいですか?
あなた:もちろん何度もシーケンス化して、シーケンス化したデータを複数のファイルに書けばいいんじゃないですか.