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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

cpickle支持的python版本_Python序列化模块pickle和cPickle

發布時間:2023/12/2 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cpickle支持的python版本_Python序列化模块pickle和cPickle 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python的序列化是指把變量從內存中變為可以儲存/傳輸的數據/文件的過程. 在Python中叫pickling,在其他語言中也被稱之為serialization,marshalling,flattening等等,都是一個意思。序列化之后,就可以把序列化后的內容寫入磁盤,或者通過網絡傳輸到別的機器上。反過來,把變量內容從序列化的對象重新讀到內存里稱之為反序列化,即unpickling。

在Python中最基礎的實現序列化的兩個模塊是cPickle和pickle模塊, 功能基本一樣, 前者是C寫的更快, 后者是python寫的會慢點. 一般優先使用cPickle. 這里只介紹cPickle, 一般用其四個函數(dump、dumps、dump、loads)也就OK了, pickle包含了類和另外一些內容, 更多細節可以看官方手冊。一般引用時我們會做如下引用:

try:

import cPickle as pickle

except ImportError:

import pickle

一、導出數據 和 導入數據

1、導出數據

dump 導出數據(序列化)主要有兩個函數:

dump(data,file_handle[, protocol]) : 將數據序列化到文件.

dumps(data[, protocol]) : 將數據序列化成字符串.

protocol是數據流處理策略:

0: ascii串保存, 默認形式, 方便人讀取

1: 舊式兼容性較強2進制形式

2: 支持新式類的2進制模式,Python2.3開始引入.

2、導入數據

load 載入數據(反序列化)主要有兩個函數:

load(file) : 將序列化數據從文件讀入返回數據.

loads(string) : 將字符串的序列化數據讀入并返回數據.

二、示例

1、寫入文件及讀取

#!/usr/bin/env python

# coding=utf-8

# code from www.361way.com

try:

import cPickle as pickle

except:

import pickle

obj = {'a' : 'b', 'c' : 'd'}

obj2 = [0, 1, 1, 0, 1]

f = open('obj.pkl', 'wb')

pickle.dump(obj, f, protocol=2)

pickle.dump(obj2, f, protocol=2)

f.close()

f = open('obj.pkl', 'rb')

x1 = pickle.load(f)

x2 = pickle.load(f)

print x1,x2

f.close()

這里保存數據的時候,選用的是protocol 2,所以保存后的obj.pkl 打開會發現是亂碼 。這里需要注意的是pickle不能指定key信息,只能按順序一次次的load結果 。這點不像shelve模塊 。

2、寫入內存及讀寫

示例1中通過open將數據寫入二進制文件或讀取,通過StringIO模塊,也可以將數據在內存中進行寫入和讀取 ,示例如下:

try:

import cPickle as pickle

except:

import pickle

import pprint

from StringIO import StringIO

class SimpleObject(object):

def __init__(self, name):

self.name = name

l = list(name)

l.reverse()

self.name_backwards = ''.join(l)

return

data = []

data.append(SimpleObject('pickle'))

data.append(SimpleObject('cPickle'))

data.append(SimpleObject('last'))

# Simulate a file with StringIO

out_s = StringIO()

# Write to the stream

for o in data:

print 'WRITING: %s (%s)' % (o.name, o.name_backwards)

pickle.dump(o, out_s)

out_s.flush()

# Set up a read-able stream

in_s = StringIO(out_s.getvalue())

# Read the data

while True:

try:

o = pickle.load(in_s)

except EOFError:

break

else:

print 'READ: %s (%s)' % (o.name, o.name_backwards)

執行結果如下:

$ python pickle_stream.py

WRITING: pickle (elkcip)

WRITING: cPickle (elkciPc)

WRITING: last (tsal)

READ: pickle (elkcip)

READ: cPickle (elkciPc)

READ: last (tsal)

3、pickle對像元素操作

在成為pickle的對象后即為列表對象,由此可對list進行一系列的操作,如下是一個append的示例:

>>> pw = open('test1','wb')

>>> pw.write(pickle.dumps(['a','b']))

>>> pw.close()

>>> pr = open("test1","rb")

>>> prf = pickle.load(pr)

>>> print(prf)

['a', 'b']

>>> print(prf.append('c'))

None

>>> print(prf)

['a', 'b', 'c']

總結

以上是生活随笔為你收集整理的cpickle支持的python版本_Python序列化模块pickle和cPickle的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。