1. 程式人生 > >python中使用pickle進行序列化

python中使用pickle進行序列化

  python的pickle模組實現了基本的資料序列和反序列化。通過pickle模組的序列化操作我們能夠將程式中執行的物件資訊儲存到檔案中去,永久儲存;通過pickle模組的反序列化操作,我們能夠從檔案中建立上一次程式儲存的物件。

  基本介面:

  pickle.dump(obj, file, [,protocol])
  註解:將物件obj儲存到檔案file中去。
     protocol為序列化使用的協議版本,0:ASCII協議,所序列化的物件使用可列印的ASCII碼錶示;1:老式的二進位制協議;2:2.3版本引入的新二進位制協議,較以前的更高效。其中協議0和1相容老版本的python。protocol預設值為0。
     file:物件儲存到的類檔案物件。file必須有write()介面, file可以是一個以'w'方式開啟的檔案或者一個StringIO物件或者其他任何實現write()介面的物件。如果protocol>=1,檔案物件需要是二進位制模式開啟的。

  pickle.load(file)
  註解:從file中讀取一個字串,並將它重構為原來的python物件。
  file:類檔案物件,有read()和readline()介面。

  A Simple Code

=============================

#使用pickle模組將資料物件儲存到檔案
import pickle
data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}
selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()

#在此處我們在向檔案中寫入兩次的dump

#是否這兩次的寫入會被覆蓋

#答案是否定的,資料不會被覆蓋

#但是在讀出資料時需要兩次load

#分別調出兩次不同的dump

==========================================

#使用pickle模組從檔案中重構python物件
import pprint, pickle
pkl_file = open('data.pkl', 'rb')
data1 = pickle.load(pkl_file)
pprint.pprint(data1)

data2 = pickle.load(pkl_file)
pprint.pprint(data2)

pkl_file.close()

=============================

 pickle模組中常用的方法有:

1. pickle.dump(obj, file, protocol=None,)

必填引數obj表示將要封裝的物件

必填引數file表示obj要寫入的檔案物件,file必須以二進位制可寫模式開啟,即“wb”

可選引數protocol表示告知pickler使用的協議,支援的協議有0,1,2,3,預設的協議是新增在Python 3中的協議3, 其他的協議詳情見參考文件

2. pickle.load(file,*,fix_imports=True, encoding="ASCII", errors="strict")

必填引數file必須以二進位制可讀模式開啟,即“rb”,其他都為可選引數

3. pickle.dumps(obj):以位元組物件形式返回封裝的物件,不需要寫入檔案中

4. pickle.loads(bytes_object): 從位元組物件中讀取被封裝的物件,並返回

pickle模組可能出現三種異常:

1. PickleError:封裝和拆封時出現的異常類,繼承自Exception

2. PicklingError: 遇到不可封裝的物件時出現的異常,繼承自PickleError

3. UnPicklingError: 拆封物件過程中出現的異常,繼承自PickleError

pickle 是十分有用的一種序列化工具,使我們可以將資料進行儲存到硬碟空間之中

在需要使用時可以將資料再調入到記憶體當中。

在此需要注意的是多次的dump 需要對應的load

並且在使用多個元素的儲存時,建議使用陣列,或者list,元祖等的形式

方便操作。

=======================================

#-*-coding:utf-8 -*-
import pickle
data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}
data2 = {'aa': [1, 2.0, 3, 4+6j],
         'bb': ('string', u'Unicode string'),
         'cc': None}
pkfile=open("data.txt",'ab')
pickle.dump(data1,pkfile)
pickle.dump(data2,pkfile)
pkfile.close()
pkfile2=open("data.txt",'rb')
pkf=pickle.load(pkfile2)
pkf1=pickle.load(pkfile2)
print(pkf)
print(pkf1)
=============================

相關推薦

python使用pickle進行序列

  python的pickle模組實現了基本的資料序列和反序列化。通過pickle模組的序列化操作我們能夠將程式中執行的物件資訊儲存到檔案中去,永久儲存;通過pickle模組的反序列化操作,我們能夠從檔案中建立上一次程式儲存的物件。   基本介面:   pickle.

python學習第四天,列表生產式,匿名函數,生成器,內置函數,叠代器,裝飾器,json和pickle序列和反序列

數據 其他 imp 函數名 fun pro serializa and cal 列表生成式,生產器 #列表生成式,可以是代碼更復雜 a = [i for i in range(10)] #這裏的i,可以使用函數來裝飾 print(a) #生產器:就是數據在調用的時候才有

【轉】Python之數據序列(json、pickle、shelve)

大數 保密 不兼容 air shelf pickle 優點 訪問問題 josn 【轉】Python之數據序列化(json、pickle、shelve) 本節內容 前言 json模塊 pickle模塊 shelve模塊 總結 一、前言 1. 現

如何對Python的類物件進行序列處理(Object of type 'BookCollection' is not JSON serializable)

  Python內建的json模組提供了非常完善的Python物件到JSON格式的轉換。 json.dumps()         將Python中的物件轉換為JSON中的字串物件json.loads()   &

在Unity3D使用ScriptableObject進行序列

ScriptableObject型別經常用於儲存一些Unity3D本身不可以打包的一些object,比如字串,一些類物件等。用這個型別的子型別,則可以用BuildPipeline打包成assetbundle包供後續使用,非常方便。這樣除了playerpref和c#檔案讀取外,另外的一種存取一些資料

在Java進行序列和反序列

物件序列化的目標是將物件儲存在磁碟中,或者允許在網路中直接傳輸物件。     物件序列化允許把記憶體中的Java物件轉換成平臺無關的二進位制流,從而允許把這種二進位制流持久儲存在磁碟上或者通過網路將這種二進位制流傳輸到另外一個網路節點。     其他程式一旦

python入門之json與pickle資料序列

前提例項:   將一個字典存放在檔案裡 #存入資料info = {   'name':'chy',   'age':18 } f = open("test.txt","w") f.write(str(info)) f.close()   #讀取資料f = open("test

c#對object進行序列和反序列

有時候我們需要對一些資料進行二進位制序列化以達到儲存或傳輸的目的,這裡記錄一下對object的序列化和反序列化操作。 首先引入名稱空間: using System.IO; using System.Runtime.Serialization.Formatters.Bina

在eclipse使用protobuf-dt外掛進行序列時遇到的問題

      使用protobuf-dt外掛比在命令列使用命令方便,但是這個外掛的下載地址要翻牆,速度也不理想,所以我在資源裡上傳了一份,下載地址為:protobuf-dt   ,這是一個zip包,安裝方式以eclipse-4.4-luna-sr2為例,在eclipse選單欄點

.NETJSON資料進行序列和反序列

可以使用DataContractJsonSerializer類將型別例項序列化為JSON字串,並將JSON字串反序列化為型別例項。 DataContractJsonSerializer在System.Runtime.Serialization.Json名稱空間下,.NET F

pythonpickle使用,用於list、tuple、dict、set特殊的形式進行讀寫

自動 如果 python log char pycharm 二進制 pychar tom #特殊文件的讀寫,List tuple dict setimport pickle #數據持久性模塊myList=[1,2,3,4,5,"tom is a good boy"]path

c# 利用 CookieContainer 對 Cookie 進行序列和反序列校驗

pre code ads domain sga pdb spa ner main private void Form1_Load(object sender, EventArgs e) { var cookieStr = @"

Python之數據序列(json、pickle、shelve)

編碼 att 傳輸 特殊 tro lose 進制 style 類型 什麽是序列化 什麽是序列化,把程序中的對象或者變量,從內存中轉換為可存儲或可傳輸的過程稱為序列化。在 Python 中,這個過程稱為 pickling,在其他語言中也被稱為 serialization,m

在C#使用Json.Net進行序列和反序列及定製

  序列化(Serialize)是將物件轉換成位元組流,並將其用於儲存或傳輸的過程,主要用途是儲存物件的狀態,以便在需要時重新建立該物件;反序列化(Deserialize)則是將上面的位元組流轉換為相應物件的過程;在.Net陣營中,Json.Net是由官方推薦的高效能開源序列化/反序列化工具,其官方網站:ht

Tensorflow進行POS詞性標註NER實體識別 - 構建LSTM網絡進行序列標註

labels rop tac val when optimize 添加 implement verbose http://blog.csdn.net/rockingdingo/article/details/55653279 Github下載完整代碼 https://gi

ASP.NET JSON 的序列和反序列

urn 序列 del nbsp parseint 代碼 href end user JSON是專門為瀏覽器中的網頁上運行的JavaScript代碼而設計的一種數據格式。在網站應用中使用JSON的場景越來越多,本文介紹ASP.NET中JSON的序列化和反序列化,主要對JSON

C#怎樣實現序列和反序列

image .com 合並 小白 str mat get new ons 我們想要將數據進行持久化的操作的話,也就是將數據寫入到文件中,我們在C#中可以通過IO流來操作,同時也可以通過序列化來操作,本人是比較推薦使用序列化操作的 因為我們如果想要將一個對象持久化到文件中

ASP.NETJSON的序列和反序列

沒有 helper mic lar width pty on() dmi 包括 JSON是專門為瀏覽器中的網頁上運行的JavaScript代碼而設計的一種數據格式。在網站應用中使用JSON的場景越來越多,本文介紹ASP.NET中JSON的序列化和反序列化,主要對JSON的

關於在DjangoJson無法序列datetime的解決辦法

ngs spec `` keys 定義 列表 ror 內置 cat      我們在網頁設計時經常會在前端和後臺進行交互,前端回傳的方法可以時redirect一個地址加上顯式的參數,第二個辦法就是使用Ajax結構。那麽在傳到view函數中進行處理後是需要通過Json格式進行

python3 的Json序列、反序列 和 字符編碼的問題解決

ron bsp port imp 入參 oos elf asc 反序列化 python3在通過Json往文件裏寫內容時中文字符被轉成unicode編碼 import json class file_open(object): f = open(‘c