日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python封装函数、实现将任意的对象序列化到磁盘上_序列化(serialization)

發(fā)布時間:2025/3/15 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python封装函数、实现将任意的对象序列化到磁盘上_序列化(serialization) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

序列化是指將"結(jié)構(gòu)化數(shù)據(jù)"轉(zhuǎn)換成"可存儲格式"的過程,逆向轉(zhuǎn)換過程被稱為逆序列化。

比如在 Python 中,結(jié)構(gòu)化數(shù)據(jù)對象 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 對象轉(zhuǎn)換為某種可存儲格式。比如可以通過序列化操作將 dict 對象轉(zhuǎn)換為字符串序列,從而實(shí)現(xiàn)對 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'}

在某些情況下,序列化的第二個目的是減少數(shù)據(jù)大小,從而減小對磁盤和帶寬的要求。

Flat vs. Nested data

在開始序列化數(shù)據(jù)之前,我們需要先了解一下序列化之后會得到何種格式的序列(扁平或嵌套),下面展示了這兩種風(fēng)格的序列:

扁平(flat)風(fēng)格,經(jīng)序列化后的數(shù)據(jù)將位于一個物理行中:

{ "Type" : "A", "field1": "value1", "field2": "value2", "field3": "value3" }

嵌套(nested)風(fēng)格,經(jīng)序列化后的數(shù)據(jù)會分散在多個物理行中:

{"A":

{ "field1": "value1", "field2": "value2", "field3": "value3" } }

序列化格式

"結(jié)構(gòu)化數(shù)據(jù)"經(jīng)序列化后,會得到兩種序列化格式(serialization format):

文本序列化格式,如 JSON

二進(jìn)制序列化格式,如 pickle

文本序列化格式

簡單文件(扁平數(shù)據(jù))

repr()

repr() 函數(shù)以單個對象作為參數(shù),并生成一個可被解釋器讀取的字符串表示形式。我們可利用 repr() 將對象轉(zhuǎn)換為可存儲的扁平風(fēng)格字符串扁平風(fēng)格:

a = {

"Type": "A",

"field1": "value1",

"field2": "value2",

"field3": "value3",

}

print(repr(a)) # 可打印序列化后的內(nèi)容

#> {'Type': 'A', 'field1': 'value1', 'field2': 'value2', 'field3': 'value3'}

with open('./file.txt', 'w') as f:

f.write(repr(a)) # 可將序列化后的內(nèi)容寫入文件

ast.literal_eval()

literal_eval() 方法可安全地解析 Python 數(shù)據(jù)類型表達(dá)式并求值,支持的數(shù)據(jù)類型有:字符串、數(shù)字、元組、列表、字典、布爾和None。

我們可以使用 literal_eval() 對簡單文件中的內(nèi)容進(jìn)行逆序列化,從而獲得 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 文件 (扁平數(shù)據(jù))

Python 中的 CSV 模塊實(shí)現(xiàn)了讀取和寫入CSV形式的表格數(shù)據(jù)的類。

讀取的簡單例子:

# 從文件中讀取CSV數(shù)據(jù)

import csv

with open('/tmp/file.csv', newline='') as f:

reader = csv.reader(f)

for row in reader:

print(row)

寫入的簡單例子:

# 將CSV數(shù)據(jù)寫入文件

import csv

with open('/temp/file.csv', 'w', newline='') as f:

writer = csv.writer(f)

writer.writerows(iterable)

該模塊的內(nèi)容、函數(shù)和例子可以在 Python 文檔中 查閱。

YAML (嵌套數(shù)據(jù))

Python 中有許多第三方庫用來解析和讀取/寫入 YAML 文件,例子如下:

# 使用load方法從文件中讀取 YAML 內(nèi)容

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 文件 (嵌套數(shù)據(jù))

Python 的 JSON 模塊可以用來讀取和寫入 JSON 模塊。示例如下:

讀取:

# 從文件中讀取 JSON 內(nèi)容

import json

with open('/tmp/file.json', 'r') as f:

data = json.load(f)

寫入:

# 使用 dump 方法將 JSON 內(nèi)容寫入文件

import json

with open('/tmp/file.json', 'w') as f:

json.dump(data, f, sort_keys=True)

XML (嵌套數(shù)據(jù))

Python 中 XML 的解析可以使用 xml 庫。

示例:

# 從文件中讀取 XML 內(nèi)容

import xml.etree.ElementTree as ET

tree = ET.parse('country_data.xml')

root = tree.getroot()

使用 xml.dom 和 xml.sax 包的更多文檔可以在 Python XML 庫文檔 中找到。

二進(jìn)制序列化格式

NumPy Array (扁平數(shù)據(jù))

Python 的 NumPy 數(shù)組可以將數(shù)據(jù)序列化成字節(jié)形式,或從字節(jié)形式的數(shù)據(jù)反序列化。

示例:

import NumPy as np

# 將 NumPy 數(shù)組轉(zhuǎn)換為字節(jié)形式

byte_output = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]).tobytes()

# 將字節(jié)形式轉(zhuǎn)換回 NumPy 數(shù)組

array_format = np.frombuffer(byte_output)

Pickle (扁平數(shù)據(jù))

Python原生的數(shù)據(jù)序列化模塊稱為 Pickle 。

示例:

import pickle

# 示例字典

grades = { 'Alice': 89, 'Bob': 72, 'Charles': 87 }

# 使用 dumps 將對象轉(zhuǎn)換為序列化字符串

serial_grades = pickle.dumps( grades )

# 使用 loads 反序列化為對象

received_grades = pickle.loads( serial_grades )

Protobuf

如果您正在尋找支持多種語言的序列化模塊,那么 Google 的 Protobuf 庫就是一個選擇。

歡迎關(guān)注公眾號: import hello

總結(jié)

以上是生活随笔為你收集整理的python封装函数、实现将任意的对象序列化到磁盘上_序列化(serialization)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。