国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 序列化Python對象的方法

序列化Python對象的方法

2020-08-01 23:37David Beazley Python

這篇文章主要介紹了序列化Python對象的方法,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下

問題

你需要將一個Python對象序列化為一個字節流,以便將它保存到一個文件、存儲到數據庫或者通過網絡傳輸它。

解決方案

對于序列化最普遍的做法就是使用 pickle 模塊。為了將一個對象保存到一個文件中,可以這樣做:

?
1
2
3
4
5
import pickle
 
data = ... # Some Python object
f = open('somefile', 'wb')
pickle.dump(data, f)

為了將一個對象轉儲為一個字符串,可以使用 pickle.dumps()

?
1
s = pickle.dumps(data)

為了從字節流中恢復一個對象,使用 pickle.load() pickle.loads() 函數。比如:

?
1
2
3
4
5
6
# Restore from a file
f = open('somefile', 'rb')
data = pickle.load(f)
 
# Restore from a string
data = pickle.loads(s)

討論

對于大多數應用程序來講,dump() load() 函數的使用就是你有效使用 pickle 模塊所需的全部了。 它可適用于絕大部分Python數據類型和用戶自定義類的對象實例。 如果你碰到某個庫可以讓你在數據庫中保存/恢復Python對象或者是通過網絡傳輸對象的話, 那么很有可能這個庫的底層就使用了 pickle 模塊。

pickle 是一種Python特有的自描述的數據編碼。 通過自描述,被序列化后的數據包含每個對象開始和結束以及它的類型信息。 因此,你無需擔心對象記錄的定義,它總是能工作。 舉個例子,如果要處理多個對象,你可以這樣做:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> import pickle
>>> f = open('somedata', 'wb')
>>> pickle.dump([1, 2, 3, 4], f)
>>> pickle.dump('hello', f)
>>> pickle.dump({'Apple', 'Pear', 'Banana'}, f)
>>> f.close()
>>> f = open('somedata', 'rb')
>>> pickle.load(f)
[1, 2, 3, 4]
>>> pickle.load(f)
'hello'
>>> pickle.load(f)
{'Apple', 'Pear', 'Banana'}
>>>

你還能序列化函數,類,還有接口,但是結果數據僅僅將它們的名稱編碼成對應的代碼對象。例如:

?
1
2
3
4
5
>>> import math
>>> import pickle.
>>> pickle.dumps(math.cos)
b'\x80\x03cmath\ncos\nq\x00.'
>>>

當數據反序列化回來的時候,會先假定所有的源數據時可用的。 模塊、類和函數會自動按需導入進來。對于Python數據被不同機器上的解析器所共享的應用程序而言, 數據的保存可能會有問題,因為所有的機器都必須訪問同一個源代碼。

千萬不要對不信任的數據使用pickle.load()。
pickle在加載時有一個副作用就是它會自動加載相應模塊并構造實例對象。
但是某個壞人如果知道pickle的工作原理,
他就可以創建一個惡意的數據導致Python執行隨意指定的系統命令。
因此,一定要保證pickle只在相互之間可以認證對方的解析器的內部使用。

有些類型的對象是不能被序列化的。這些通常是那些依賴外部系統狀態的對象, 比如打開的文件,網絡連接,線程,進程,棧幀等等。 用戶自定義類可以通過提供 __getstate__() __setstate__() 方法來繞過這些限制。 如果定義了這兩個方法,pickle.dump() 就會調用 __getstate__() 獲取序列化的對象。 類似的,__setstate__() 在反序列化時被調用。為了演示這個工作原理, 下面是一個在內部定義了一個線程但仍然可以序列化和反序列化的類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# countdown.py
import time
import threading
 
class Countdown:
  def __init__(self, n):
    self.n = n
    self.thr = threading.Thread(target=self.run)
    self.thr.daemon = True
    self.thr.start()
 
  def run(self):
    while self.n > 0:
      print('T-minus', self.n)
      self.n -= 1
      time.sleep(5)
 
  def __getstate__(self):
    return self.n
 
  def __setstate__(self, n):
    self.__init__(n)

試著運行下面的序列化試驗代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
>>> import countdown
>>> c = countdown.Countdown(30)
>>> T-minus 30
T-minus 29
T-minus 28
...
 
>>> # After a few moments
>>> f = open('cstate.p', 'wb')
>>> import pickle
>>> pickle.dump(c, f)
>>> f.close()

然后退出Python解析器并重啟后再試驗下:

?
1
2
3
4
5
6
>>> f = open('cstate.p', 'rb')
>>> pickle.load(f)
countdown.Countdown object at 0x10069e2d0>
T-minus 19
T-minus 18
...

你可以看到線程又奇跡般的重生了,從你第一次序列化它的地方又恢復過來。

pickle 對于大型的數據結構比如使用 arraynumpy 模塊創建的二進制數組效率并不是一個高效的編碼方式。 如果你需要移動大量的數組數據,你最好是先在一個文件中將其保存為數組數據塊或使用更高級的標準編碼方式如HDF5 (需要第三方庫的支持)。

由于 pickle 是Python特有的并且附著在源碼上,所有如果需要長期存儲數據的時候不應該選用它。 例如,如果源碼變動了,你所有的存儲數據可能會被破壞并且變得不可讀取。 坦白來講,對于在數據庫和存檔文件中存儲數據時,你最好使用更加標準的數據編碼格式如XML,CSV或JSON。 這些編碼格式更標準,可以被不同的語言支持,并且也能很好的適應源碼變更。

最后一點要注意的是 pickle 有大量的配置選項和一些棘手的問題。 對于最常見的使用場景,你不需要去擔心這個,但是如果你要在一個重要的程序中使用pickle去做序列化的話, 最好去查閱一下 官方文檔

以上就是序列化Python對象的方法的詳細內容,更多關于序列化Python對象的資料請關注服務器之家其它相關文章!

原文鏈接:https://python3-cookbook.readthedocs.io/zh_CN/latest/c05/p21_serializing_python_objects.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 成年免费视频 | 羞羞网站在线 | 日本乱码视频 | 国产成人综合一区二区三区 | 亚洲精选国产 | 日韩精品免费一区二区夜夜嗨 | 婷婷久久久 | 毛片av在线播放 | 免费观看污视频 | 日韩一区二区在线播放 | 欧美国产日韩一区二区三区 | 99r精品在线 | 久草 在线 | 欧美日韩国产精品一区二区 | av77| 亚洲福利在线播放 | www.一区| 一区二区三区 在线 | 国产日韩欧美三级 | 亚洲精品一 | 在线播放亚洲 | 免费福利网站 | 国产成人免费视频网站高清观看视频 | 欧美日韩一区二区在线观看 | 精品伊人久久 | 免费在线看a | 欧美精品国产精品 | 亚洲精品不卡 | 日韩在线免费视频 | 久久99精品久久久 | 国产精品永久免费视频 | 亚洲精品日本 | 欧美日韩一区二区三区不卡视频 | av久久| 中文字幕一二三区 | 亚洲精品一区二区网址 | 欧美日韩一区二区在线观看 | 国产精品美女久久久 | 免费成年人视频在线观看 | 久久久久久久久国产 | 国产精品成av人在线视午夜片 |