6.3.7直列化モジュール(ピクルス、JSON、棚、XML)
ファイルの書き込み、データの送信は、我々はすべての文字列(バイトにエンコードすることができるように、文字列)の形式で書かれています。
ファイルを書き込むときは何(などの辞書、リスト、など)他のタイプについて何が好き?
我々は、操作を必要とし、この時間は、シリアライズと呼ばれます。
+それのシーケンスは何ですか?
(バイト型)に変換メモリデータ+(Unicode)の文字は、シリアル化と呼ばれます。
>ハードディスクやネットワーク伝送堆積するためのシリアル
+文字データがメモリに変換され、直列化復元と呼ばれます。
簡単に言えば、これは次のとおりです。シリアライズ:他のタイプのデータ- >文字型
のデシリアライズ:文字型- >他のデータ・タイプ
>文字の種類:STR、バイトまたはByteArrayの
- シリアライズすることができ、逆シリアル化のモジュールは、以下の2種類があります。
- 漬けます
JSON
両方のモジュールは、まったく同じ使用します
メソッドのeval()はまた、所望の効果を達成することができます。だから、どのような違いを作るのですか?
1. JSONモジュール(.jsonファイル)
直列化された文字列型
- JSONの特長
- 開いている再処理でファイルを開く必要があります
- 「W」、「R」と開いているファイルの他のタイプのためにと
- 直列化された文字列型
- .jsonとファイル拡張子
- JSONとピクルスの違い:
- JSONはデータの種類を識別することができます:STR、INT、タプル、リスト、辞書
- JSONクロスプラットフォーム
import json
json.dump(OBJ、FP、skipkeys、 ...)
OBJシリアライズされた文字列型、およびファイルオブジェクトfpのを書き込みます。Noneを返しますjson.dumps():プラットフォーム間でデータ伝送ネットワーク2及びインタラクティブデータ言語をこのメモリへのデータは、一般的に共存する文字列で使用されています
json.load(FP、CLS、...)は
、JSONシリアライズされたファイルオブジェクトFPを読んでデシリアライズ、デシリアライズされたデータを返します。json.loads():データのダンプを読み、そしてデシリアライズ
import json
data = {'name': 'Alex', 'age': 22, 'salary': [1, 2, 3]}
# d1 = json.dumps(data) # 把data序列化。 ->序列化后转为str类型
# d2 = json.loads(data) # 把data反序列化。 ->反序列化转成相应数据类型(字典,列表等)
with open('test.json','w') as f: # 一般json序列化的文件扩展名用.json
d1 = json.dump(data,f) # 把data序列化,并且写入文件对象f中。因为返回None,所以d1是None
with open('test.json','r') as f:
d2 = json.load(f) # 把文件对象f的数据反序列化,返回给d2
開発:対話的にデータの2種類があります:JSON、XMLのJSONの可読性は、データのサイズは、XMLに優れている
新しい環境JSONと、古いとXMLのAzure環境で
2. pickleモジュール(の.pklファイル)
バイトにシーケンスタイプ。
そうRBを使用するファイルを読み書き、バイトにシーケンスのタイプなので、なるようにWBと他のモデル:注意してください!
- ピクルスの特長
- 開いている再処理でファイルを開く必要があります
- 「WB」、「RB」と他の種類のファイルを開きます。
- 直列化されたバイトタイプ
- .pklとファイル拡張子
- ピクルスとJSON差:
ピクルスPythonのサポートすべてのデータ型(関数など、可能なものなど)
だから私たちはpickle化できるものの内容に関係なく、Pythonのファイルを使用します
ピクルスはpythonでのみを使用することができます
import pickle
pickle.dumpは(OBJ、ファイルは、プロトコルは、 ...)
バイトのOBJの種類、ファイルにシリアライズされ、何のファイルが作成されていない場合は、ファイルを書き込みます。Noneを返しますpickle.load(ファイル、...)は、
デシリアライズ、デシリアライズされたデータを返し、JSONシリアライズされたファイルオブジェクトFPを読みます.loads():データ・ダンプを読み取り、そしてデシリアライズ
import pickle
data = [1, 2, 3]
d1 = pickle.dumps(data) # 把data序列化。 ->序列化后转为bytes类型
d2 = pickle.loads(d1) # 把data反序列化。 ->反序列化转成相应数据类型
with open('test.pkl', 'wb') as f: # 一般pickle序列化的文件扩展名用.pkl
pickle.dump(data, f)
with open('test.json', 'rb') as f:
d = pickle.load(f)
print(type(d1))
print(type(d2))
print(d)
3.棚モジュール()
パッケージをpickle化するために棚上げ、繰り返しロードすることができ、ダンプ
- 違いと特徴:
- 漬けます
- ダンプ・ファイルに一度だけ(ダンプ数回簡単に混乱しているため)
- ファイルを開くには、開いた状態で()関数
- 棚上げします
- 複数回提出することができ、負荷をダンプ
- ファイルを開くために棚上げモジュール.Open()メソッドで
- 同様のデータ構造の辞書
- データは、辞書を処理するために類似の方法によって直接処理することができます
- 漬けます
シリアル化:
import shelve
f = shelve.open('shelve_test') # 打开(没有就创建)文件。会创建多个文件。可以跟open一样用with
list1 = ['a','b','c','d']
dict1 = {'key1':'abcd','key2':'1234'}
f['li1'] = list1 # 持久化列表 --> 就是写入序列化文件中,并且有个名字是'li1'
f['d1'] = dict1 # 持久化字典 --> 就是写入序列化文件中,并且有个名字是'd1'
f.close() # 关闭保存
デシリアライズ:
import shelve
with shelve.open('shelve_test') as f:
print(f['li1']) # 直接调用li1的数据
print(f['d1']) # 直接调用d1的数据
# shelve打开的文件对象构造类似字典,可以使用字典的方法:
print('get li1:', f.get('li1')) # 有get()方法
i = f.items() # 有items()方法。 注意:这个i指向f.items()的内存地址,f.items()的值变化,i也会随之变化
print(id(i))
print(i) # 返回值是shelve对象类型,不能直接使用
print(list(i)) # 所以需要list()转换一下才可以看到内容
f['li2'] = ['aaaa','bbbb'] # 可以追加新的数据
print(list(i))
f.pop('li2') # 可以删除
print(list(i))
f['li1'] = [2, 3, 4, 5] # 可以直接修改某个数据的整个内容
print(list(i))
f['li1'][1] = 'b' # 但是不能改其中的一部分内容(字典可以)
print(list(i)) # 结果并没有改变
print(id(i))
4. XMLモジュール(.xmlファイル)
役割とJSONは、JSONシリアライズモジュールの登場前には非常に一般的です。建設や辞書も似ています。<>でデータを定義します。
XMLドキュメントのコンテンツを読みます
# 读取数据 import xml.etree.ElementTree as ET tree = ET.parse('test.xml') # 打开xml文件,返回xml对象 root = tree.getroot() # 取数据最上级key # print(dir(root)) # 可以显示数据的keys print(root.tag) # 遍历文档 for child in root: print(child.tag, child.attrib) for i in child: print(i.tag, i.attrib) # 只遍历year节点 for node in root.iter('year'): print(node.tag, node.text)
変更、およびXML文書の内容を削除します。
# 修改数据 import xml.etree.ElementTree as ET tree = ET.parse('test.xml') root = tree.getroot() # 取数据最上级key # 修改 for node in root.iter('year'): new_year = int(node.text) + 1 # 取数据并计算 node.text = str(new_year) # 把值转成str并赋值给原来的内容 node.set('update', 'yes') # 设置属性和值 tree.write('test.xml') # 内容写入文件
# 删除数据 import xml.etree.ElementTree as ET tree = ET.parse('test.xml') root = tree.getroot() # 取数据最上级key # 删除node for country in root.findall('country'): rank = int(country.find('rank').text) if rank > 50: root.remove(country) tree.write('output.xml') # 结果写到一个新文件里
xmlファイルを作成し
、Pythonの`` `
#は、XMLファイルの作成
ETとしてインポートxml.etree.ElementTreeをルート= ET.Element(「名前リスト」)#は、名前リスト(ルート)という名前のルートを作成します。
NAME1 = ET.SubElement:(ルート、「名前」、ATTRIB = {「登録」「YES」})#1 名」ルート『ノード属性集合{』登録『上のデータの』名称『:』はい}
年齢= ET.SubElement(NAME1、 '年齢'、Attribに= { '確認': 'NO'})#名'年齢'チェック'ノード属性にNAME1データは{に設定されています'。 'NO'}
セックス= ET.SubElement(NAME1、 '性別')#名'性別'ノードにデータNAME1
sex.text = '33'位の性別値を'33'NAME2 = ET.SubElement:(ルート、「名前」、ATTRIB = {「登録」「NO」})#1 名「登録ルート」{設定されたノードの属性「「上のデータの」名称」: 'はい}
年齢= ET.SubElement(NAME2、 『年齢』)#名『年齢』ノードNAME2上のデータの
age.text = 『19』値#年齢19 『』ら= ET.ElementTree(ルート)#生成ドキュメントオブジェクト
et.write( 'のtest.xml'、エンコード= 'UTF-8'、xml_declaration = TRUE)#1 xml_declarationは、 ステートメントのバージョン番号を増加させることはありませんET.dump(ルート)
`` `