将数据存入文件pickle,shelve

本文详细介绍了 Python 中的 Pickle 模块,包括如何使用该模块进行对象的序列化与反序列化,以及不同序列化方式对文件大小的影响。此外还展示了如何自定义数据类型并对其进行序列化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:http://docs.pythontab.com/learnpython/

# pickle
# import pickle/import cpickle as pickle

# 1
>>> import pickle
>>> integers = [1, 2, 3, 4, 5]
>>> f = open("22901.dat", "wb")
>>> pickle.dump(integers, f)
>>> f.close()

# €]q (KKKKKe.

'''
	pickle.dump(obj,file[,protocol])

	obj:序列化对象,上面的例子中是一个列表,它是基本类型,也可以序列化自己定义的类型。
	file:一般情况下是要写入的文件。更广泛地可以理解为为拥有write()方法的对象,并且能接受字符串为为参数,所以,它还可以是一个StringIO对象,或者其它自定义满足条件的对象。
	protocol:可选项。默认为False(或者说0),是以ASCII格式保存对象;如果设置为1或者True,则以压缩的二进制格式保存对象。
'''

# 2
import pickle
d = {}
integers = [x for x in range(9999)]
d['i'] = integers        #下面将这个dict格式的对象存入文件

f = open("22902.dat", "wb")
pickle.dump(d, f)           #文件中以ascii格式保存数据
f.close()

f = open("22903.dat", "wb")
pickle.dump(d, f, True)     #文件中以二进制格式保存数据
f.close()

import os
s1 = os.stat("22902.dat").st_size    #得到两个文件的大小
s2 = os.stat("22903.dat").st_size

print("%d, %d, %.2f%%" % (s1, s2, (s2+0.0)/s1*100))
# 二进制方式保存的文件比以ascii格式保存的文件小很多

# 反序列化(读取)
>>> integers = pickle.load(open("22901.dat", "rb"))
>>> print integers
[1, 2, 3, 4, 5]

>>> f = open("22903.dat", "rb")
>>> d = pickle.load(f)
>>> print d
{'i': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, ....   #省略后面的数字}
>>> f.close()

# 自己定义数据类型
>>> import cPickle as pickle        #cPickle更快
>>> import StringIO                 #标准库中的一个模块,跟file功能类似,只不过是在内存中操作“文件”

>>> class Book(object):             #自定义一种类型
...     def __init__(self,name):
...         self.name = name
...     def my_book(self):
...         print "my book is: ", self.name
...

>>> pybook = Book("<from beginner to master>")
>>> pybook.my_book()
my book is:  <from beginner to master>

>>> file = StringIO.StringIO()
>>> pickle.dump(pybook, file, 1)
>>> print file.getvalue()           #查看“文件”内容,注意下面不是乱码
ccopy_reg
_reconstructor
q(c__main__
Book
qc__builtin__
object
qNtRq}qUnameqU<from beginner to master>sb.

>>> pickle.dump(pybook, file)       #换一种方式,再看内容,可以比较一下
>>> print file.getvalue()           #视觉上,两者就有很大差异
ccopy_reg
_reconstructor
q(c__main__
Book
qc__builtin__
object
qNtRq}qUnameqU<from beginner to master>sb.ccopy_reg
_reconstructor
p1
(c__main__
Book
p2
c__builtin__
object
p3
NtRp4
(dp5
S'name'
p6
S'<from beginner to master>'
p7
sb.

# 如果要从文件中读出来
>>> file.seek(0)       #找到对应类型  
>>> pybook2 = pickle.load(file)
>>> pybook2.my_book()
my book is:  <from beginner to master>
>>> file.close()

json数据也是同理,两个方法。一个dump(),一个load()方法。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值