在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 數(shù)據(jù)存儲(chǔ)
附錄
進(jìn)程通信
操作系統(tǒng)
迭代器
模塊
描述符
裝飾器
第三部分 擴(kuò)展庫(kù)
內(nèi)置類型
數(shù)據(jù)存儲(chǔ)
數(shù)據(jù)類型
基本環(huán)境
文件與目錄
異常
程序框架
數(shù)學(xué)運(yùn)算
函數(shù)
元類
字符串
表達(dá)式

數(shù)據(jù)存儲(chǔ)

serialization

marshal

Python 專用的序列化算法,PyCodeObject 就是用該算法序列化后保存到 pyc 二進(jìn)制文件。與具體的機(jī)器架構(gòu)無(wú)關(guān),但可能隨 Python 版本發(fā)生變化。通常不建議用來(lái)存儲(chǔ)自定義數(shù)據(jù)。

支持:None, bool, int, long, float, complex, str, unicode, tuple, list, set, frozenset, dict,code objects, StopIteration。容器元素必須是所支持類型,不能是遞歸引用。

>>> from marshal import dump, load, dumps, loads

>>> s = dumps(range(10))
>>> s
'[\n\x00\x00\x00i\x00\...\x00\x00'

>>> loads(s)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

保存序列化結(jié)果到文件。

>>> with file("test.dat", "w") as f:
...     dump(range(10), f)

>>> with file("test.dat", "r") as f:
...     print load(f)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

pickle

應(yīng)該用 cPickle 代替 pickle,按官方文檔的說(shuō)法有千倍的提升,且可相互替換。支持用戶自定義類型,支持三種協(xié)議版本:

  • 0: 使用可顯示的 ASCII 字符編碼,便于閱讀和手工編輯。(默認(rèn))
  • 1: 兼容早期 Python 版本的二進(jìn)制格式。
  • 2: 最有效的二進(jìn)制編碼格式。
>>> import pickle, cPickle

>>> s = "Hello, World"
>>> d = cPickle.dumps(s, 2)
>>> d
'\x80\x02U\rHello, Worldq\x01.'

>>> cPickle.loads(d)
'Hello, World'

>>> pickle.loads(d)   # 和 pickle 格式完全相同。
'Hello, World'

同樣有讀寫文件的 dump、load 函數(shù)??纯粗С值臄?shù)據(jù)類型:

  • None, True, False
  • int, long, float, complex
  • str, unicode
  • tuple, list, set, and dict (元素必須是支持類型)
  • function (模塊級(jí)別的函數(shù))
  • classe (模塊級(jí)別的自定義類,非嵌套)
  • instance (有 dict 屬性,或者實(shí)現(xiàn) pickle protocol 協(xié)議)

看看對(duì)自定義類型的測(cè)試。

>>> class Data(object):
...     def __init__(self, x, y):
...         print "__init__"
...         self._x = x
...         self._y = y

>>> d = Data(100, 200)
__init__

>>> s = cPickle.dumps(d, 2)

>>> d2 = cPickle.loads(s)  # 反序列化并沒(méi)有調(diào)用 __init__
>>> d2.__dict__
{'_x': 100, '_y': 200}

利用 pickle protocol 可以控制序列化的細(xì)節(jié)。比如下面例子中,我們不像保留 _y 字段。

>>> class Data(object):
...     def __init__(self, x, y):
...         self._x = x
...         self._y = y
...
...     def __getstate__(self):
...         d = self.__dict__.copy()
...         del d["_y"]
...     return d
...
...     def __setstate__(self, state):
...         self.__dict__.update(state)

>>> d = Data(10, 20)

>>> s = cPickle.dumps(d, 2)

>>> d2 = cPickle.loads(s)
>>> d2.__dict__
{'_x': 10}

shevle

將對(duì)象 pickle 序列化,然后保存到 anydbm 格式文件。anydbm 是個(gè) KV 結(jié)構(gòu)的數(shù)據(jù)庫(kù),可以保存多個(gè)序列化的對(duì)象。當(dāng)然也可以選擇使用 dbm、gdbm、bdb。

  • flag: r 讀, w 寫, c 讀寫, n 新建、讀寫。
  • protocol: pickle 版本。
  • writeback: 允許將變更的對(duì)象同步到數(shù)據(jù)庫(kù)。(還是顯式修改保存比較好)
>>> import shelve
>>> from contextlib import closing

>>> with closing(shelve.open("test", protocol = 2)) as f:
... f["a"] = dict(name = "Tom", age = 34, sex = "male")
... f["b"] = (1, ["a", 3], "abcdefg")

>>> !xxd -g 1 -l 100 test.db
0000000: 00 06 15 61 00 00 00 02 00 00 04 d2 00 00 10 00 ...a............
0000010: 00 00 00 0c 00 00 01 00 00 00 01 00 00 00 00 08 ................
0000050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0000060: 00 00 00 00 ....

>>> with closing(shelve.open("test", protocol = 2)) as f:
...     print f["a"]
...     print f["b"]
...     print ["c"]

{'age': 34, 'name': 'Tom', 'sex': 'male'}
(1, ['a', 3], 'abcdefg')
['c']
上一篇:描述符下一篇:程序框架