python封装函数、实现将任意的对象序列化到磁盘上_序列化(serialization)
序列化是指將"結構化數據"轉換成"可存儲格式"的過程,逆向轉換過程被稱為逆序列化。
比如在 Python 中,結構化數據對象 dict 并不能直接存儲到文件中:
a = {
"Type": "A",
"field1": "value1",
"field2": "value2",
"field3": "value3",
}
with open('./file.txt', 'w') as f:
f.write(a)
#> TypeError: write() argument must be str, not dict
但是我們可以通過序列化操作,將 dict 對象轉換為某種可存儲格式。比如可以通過序列化操作將 dict 對象轉換為字符串序列,從而實現對 dict 對象的存儲:
a = {
"Type": "A",
"field1": "value1",
"field2": "value2",
"field3": "value3",
}
print(repr(a)) # 可將repr()理解為一種序列化方法
#> {'Type': 'A', 'field1': 'value1', 'field2': 'value2', 'field3': 'value3'}
with open('./file.txt', 'w') as f:
f.write(repr(a)) # 序列化后的dict對象,可寫入文件
import ast
with open('./file.txt', 'r') as f:
b = ast.literal_eval(f.readline())
print(f'{type(b)}:')
#> :{'Type': 'A', 'field1': 'value1', 'field2': 'value2', 'field3': 'value3'}
在某些情況下,序列化的第二個目的是減少數據大小,從而減小對磁盤和帶寬的要求。
Flat vs. Nested data
在開始序列化數據之前,我們需要先了解一下序列化之后會得到何種格式的序列(扁平或嵌套),下面展示了這兩種風格的序列:
扁平(flat)風格,經序列化后的數據將位于一個物理行中:
{ "Type" : "A", "field1": "value1", "field2": "value2", "field3": "value3" }
嵌套(nested)風格,經序列化后的數據會分散在多個物理行中:
{"A":
{ "field1": "value1", "field2": "value2", "field3": "value3" } }
序列化格式
"結構化數據"經序列化后,會得到兩種序列化格式(serialization format):
文本序列化格式,如 JSON
二進制序列化格式,如 pickle
文本序列化格式
簡單文件(扁平數據)
repr()
repr() 函數以單個對象作為參數,并生成一個可被解釋器讀取的字符串表示形式。我們可利用 repr() 將對象轉換為可存儲的扁平風格字符串扁平風格:
a = {
"Type": "A",
"field1": "value1",
"field2": "value2",
"field3": "value3",
}
print(repr(a)) # 可打印序列化后的內容
#> {'Type': 'A', 'field1': 'value1', 'field2': 'value2', 'field3': 'value3'}
with open('./file.txt', 'w') as f:
f.write(repr(a)) # 可將序列化后的內容寫入文件
ast.literal_eval()
literal_eval() 方法可安全地解析 Python 數據類型表達式并求值,支持的數據類型有:字符串、數字、元組、列表、字典、布爾和None。
我們可以使用 literal_eval() 對簡單文件中的內容進行逆序列化,從而獲得 Python 對象:
import ast
with open('./file.txt', 'r') as f:
inp = ast.literal_eval(f.read())
print(f'{type(inp)}:{inp}')
#> :{'Type': 'A', 'field1': 'value1', 'field2': 'value2', 'field3': 'value3'}
CSV 文件 (扁平數據)
Python 中的 CSV 模塊實現了讀取和寫入CSV形式的表格數據的類。
讀取的簡單例子:
# 從文件中讀取CSV數據
import csv
with open('/tmp/file.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
寫入的簡單例子:
# 將CSV數據寫入文件
import csv
with open('/temp/file.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(iterable)
該模塊的內容、函數和例子可以在 Python 文檔中 查閱。
YAML (嵌套數據)
Python 中有許多第三方庫用來解析和讀取/寫入 YAML 文件,例子如下:
# 使用load方法從文件中讀取 YAML 內容
import yaml
with open('/tmp/file.yaml', 'r', newline='') as f:
try:
print(yaml.load(f))
except yaml.YAMLError as ymlexcp:
print(ymlexcp)
第三方庫的文檔可以在 PyYAML 文檔 中查閱。
JSON 文件 (嵌套數據)
Python 的 JSON 模塊可以用來讀取和寫入 JSON 模塊。示例如下:
讀取:
# 從文件中讀取 JSON 內容
import json
with open('/tmp/file.json', 'r') as f:
data = json.load(f)
寫入:
# 使用 dump 方法將 JSON 內容寫入文件
import json
with open('/tmp/file.json', 'w') as f:
json.dump(data, f, sort_keys=True)
XML (嵌套數據)
Python 中 XML 的解析可以使用 xml 庫。
示例:
# 從文件中讀取 XML 內容
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()
使用 xml.dom 和 xml.sax 包的更多文檔可以在 Python XML 庫文檔 中找到。
二進制序列化格式
NumPy Array (扁平數據)
Python 的 NumPy 數組可以將數據序列化成字節形式,或從字節形式的數據反序列化。
示例:
import NumPy as np
# 將 NumPy 數組轉換為字節形式
byte_output = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]).tobytes()
# 將字節形式轉換回 NumPy 數組
array_format = np.frombuffer(byte_output)
Pickle (扁平數據)
Python原生的數據序列化模塊稱為 Pickle 。
示例:
import pickle
# 示例字典
grades = { 'Alice': 89, 'Bob': 72, 'Charles': 87 }
# 使用 dumps 將對象轉換為序列化字符串
serial_grades = pickle.dumps( grades )
# 使用 loads 反序列化為對象
received_grades = pickle.loads( serial_grades )
Protobuf
如果您正在尋找支持多種語言的序列化模塊,那么 Google 的 Protobuf 庫就是一個選擇。
歡迎關注公眾號: import hello
總結
以上是生活随笔為你收集整理的python封装函数、实现将任意的对象序列化到磁盘上_序列化(serialization)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python enumerate用法_【
- 下一篇: resultset rs =pst.ex