在Python中marshal對象序列化的相關(guān)知識(shí)
有時(shí)候,要把內(nèi)存中的一個(gè)對象持久化保存到磁盤上,或者序列化成二進(jìn)制流通過網(wǎng)絡(luò)發(fā)送到遠(yuǎn)程主機(jī)上。Python中有很多模塊提供了序列化與反序列化的功能,如:marshal, pickle, cPickle等等。今天就講講marshal模塊。
- 注意: marshal并不是一個(gè)通用的模塊,在某些時(shí)候它是一個(gè)不被推薦使用的模塊,因?yàn)槭褂胢arshal序列化的二進(jìn)制數(shù)據(jù)格式還沒有文檔化,在不同版本的Python中,marshal的實(shí)現(xiàn)可能不一樣。也就是說,用python2.5序列為一個(gè)對象,用python2.6的程序反序列化所得到的對象,可能與原來的對象是不一樣的。但這個(gè)模塊存在的意義,正如Python手冊中所說:The marshal module exists mainly to support reading and writing the “pseudo-compiled” code for Python modules of .pyc files.
下面是marshal模塊中定義的一些與序列化/反序列化有關(guān)的函數(shù):
marshal.dump(value, file[, version])
將值寫入到一個(gè)打開的輸出流里。參數(shù)value表示待序列化的值。file表示打開的輸出流。如:以”wb”模式打開的文件,sys.stdout或者os.popen。對于一些不支持序列類的類型,dump方法將拋出ValueError異常。要特別說明一下,并不是所有類型的對象都可以使用marshal模塊來序列化/反序列化的。在python2.6中,支持的類型包括:None, integers, long integers, floating point numbers, strings, Unicode objects, tuple, list, set, dict, 和 code objects。對于tuple, list, set, dict等集合對象,其中的元素必須也是上述類型之一。
marshal.load(file)
執(zhí)行與marshal.dump相反的操作,將二進(jìn)制數(shù)據(jù)反序列為Python對象。下面是一個(gè)例子,演示這兩個(gè)方法的使用:
# coding=gbk
import marshal , sys , os
lst = [ 1 , ( 2 , " string " ) , { " key " : " Value " } ]
# 序列化到文件中
fle = open ( os . path . join ( os . getcwd ( ) , ' fle . txt ' ) , ' wb ' )
marshal . dump ( lst , fle )
fle . close ( )
# 反序列化
fle1 = open ( os . path . join ( os . getcwd ( ) , ' fle . txt ' ) , ' rb ' )
lst1 = marshal . load ( fle1 )
fle1 . close ( )
# 打印結(jié)果
print lst
print lst1
# ---- 結(jié)果 ----
# [1, (2, 'string'), {'key': 'Value'}]
# [1, (2, 'string'), {'key': 'Value'}]
marshal.dumps(value[, version)
該方法與上面講的marshal.dump()功能類似,只是它返回的是序列化之后的二進(jìn)制流,而不是將這些數(shù)據(jù)直接寫入到文件中。
marsahl.load(string)
將二進(jìn)制流反序列化為對象。下面的一段代碼,演示這兩個(gè)方法的使用:
import marshal , sys , os
lst = [ 1 , ( 2 , " string " ) , { " key " : " Value " } ]
byt1 = marshal . dumps ( lst )
lst1 = marshal . loads ( byt1 )
# 打印結(jié)果
print lst
print lst1
# —- 結(jié)果 —-
# [1, (2, 'string'), {'key': 'Value'}]
# [1, (2, 'string'), {'key': 'Value'}]
更多關(guān)于marshal的內(nèi)容,請參考Python手冊。
相關(guān)文章
基于Python輕松實(shí)現(xiàn)PDF轉(zhuǎn)圖片
PDF文件是我們在日常工作和學(xué)習(xí)中常用的文檔格式之一,但你知道嗎,你可以將PDF文件轉(zhuǎn)換為圖像,讓文檔變得更加生動(dòng)有趣,下面我們就來看看具體的實(shí)現(xiàn)方法吧2023-08-08
Python查看多臺(tái)服務(wù)器進(jìn)程的腳本分享
這篇文章主要介紹了Python查看多臺(tái)服務(wù)器進(jìn)程的腳本分享,需要的朋友可以參考下2014-06-06
推薦值得學(xué)習(xí)的12款python-web開發(fā)框架
這篇文章主要介紹了值得學(xué)習(xí)的12款python-web開發(fā)框架,幫助大家更好的理解和學(xué)習(xí)Python web開發(fā),感興趣的朋友可以了解下2020-08-08
python新式類和經(jīng)典類的區(qū)別實(shí)例分析
這篇文章主要介紹了python新式類和經(jīng)典類的區(qū)別,結(jié)合實(shí)例形式分析了python新式類和經(jīng)典類的功能、區(qū)別與使用方法,需要的朋友可以參考下2020-03-03
Python3+OpenCV實(shí)現(xiàn)簡單交通標(biāo)志識(shí)別流程分析
這篇文章主要介紹了Python3+OpenCV實(shí)現(xiàn)簡單交通標(biāo)志識(shí)別,主要思路是解析XML文檔,根據(jù)<name>標(biāo)簽進(jìn)行分類,如果是直行、右轉(zhuǎn)、左轉(zhuǎn)、停止就把它從原圖中裁剪下來并重命名,感謝的朋友跟隨小編一起看看示例代碼2021-12-12
Pandas?DataFrame添加一行數(shù)據(jù)的幾種方法
在處理數(shù)據(jù)分析和數(shù)據(jù)科學(xué)項(xiàng)目時(shí),經(jīng)常會(huì)使用到Python中的pandas庫來進(jìn)行數(shù)據(jù)操作和分析,其中DataFrame是pandas庫中最重要的數(shù)據(jù)結(jié)構(gòu)之一,這篇文章主要給大家介紹了關(guān)于Pandas?DataFrame添加一行數(shù)據(jù)的幾種方法,需要的朋友可以參考下2024-08-08

