什么是數據序列化?
數據序列化是指將結構化數據轉換成允許以共享或存儲的格式,並能恢復成原始結構。 在某些情況下,數據序列化的第二個目的是減少數據大小,從而減小對磁盤和帶寬的要求。
Flat vs. Nested data
在開始序列化數據之前,確定或決定在數據序列化期間如何結構化數據(扁平或嵌套)是非常重要的。 以下示例中顯示了兩種風格的差異
扁平風格:
{ "Type" : "A","field1": "value1", "field2": "value2", "field3": "value3" }
嵌套風格:
{"A"
{ "field1": "value1", "field2": "value2", "field3": "value3" } }
序列化文本
簡單文件(扁平數據)
repr
Python 中的 repr 方法接收單個對象參數,返回輸入的可打印形式:
# 扁平文本作為輸入 a = { "Type" : "A", "field1": "value1", "field2": "value2", "field3": "value3" } # 相同的輸入可以讀取自文件 a = open('/tmp/file.py', 'r') # 返回輸入的可打印形式 # 輸出也能夠寫入文件 print(repr(a)) # 使用repr將內容寫入文件 with open('/tmp/file.py') as f:f.write(repr(a))
ast.literal_eval
literal_eval 方法安全地解析Python數據類型表達式並求值。其支持的數據類型有:字符串、數字、元組、列表、字典、布爾和None。
with open('/tmp/file.py', 'r') as f: inp = ast.literal_eval(f.read())
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)
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)
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()
二進制
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 )
