Python基础数据存储学习笔记

pickle是标准库中的一个模块,在Python 2中还有一个cpickle,两者的区别就是后者更快。所以,下面操作中,不管是用 import pickle ,还是用 import cpickle as pickle ,在功能上都是一样的。

而在Python 3中,你只需要 import pickle 即可,因为它已经在Python 3中具备了Python 2中的cpickle同样的性能。

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

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

>>> import pickle
>>> d = {}
>>> integers = range(9999)
>>> d["i"] = integers        #下面将这个字典类型的对象存入文件

>>> 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)    #Python 3: print("{0:d}, {1:d}, {2:.2f}".format (s1, s2, (s2+0.0)/s1*100))
68903, 29774, 43.21%
反序列化对象

将数据保存入文件,还有另外一个目标,就是要读出来,也称之为反序列化。

    >>> integers = pickle.load(open("22901.dat", "rb"))
    >>> print integers    #Python 3: 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        #这是Python 2的引入方式,如果是Python 3,直接使用import pickle
    >>> import StringIO                 #标准库中的一个模块,跟file功能类似,只不过是在内存中操作“文件”
   
    >>> class Book(object):             #自定义一种类型
    ...     def __init__(self,name):
    ...         self.name = name
    ...     def my_book(self):
    ...         print "my book is: ", self.name        #Python 3: print("my book is: ", self.name)
    ...
   
# 存数据

>>> file = StringIO.StringIO()
>>> pickle.dump(pybook, file, 1)
   
# 取数据

>>> file.seek(0)       #找到对应类型 
>>> pybook2 = pickle.load(file)
>>> pybook2.my_book()
my book is:  <from beginner to master>
>>> file.close()
shelve

由于数据的复杂性, pickle 只能完成一部分工作,在另外更复杂的情况下,它就稍显麻烦了。于是,又有了 shelve 。

# 写操作

>>> import shelve
>>> s = shelve.open("22901.db")
>>> s["name"] = "www.itdiffer.com"
>>> s["lang"] = "python"
>>> s["pages"] = 1000
>>> s["contents"] = {"first":"base knowledge","second":"day day up"}
>>> s.close()
 
# 读操作
   
>>> s = shelve.open("22901.db")
>>> name = s["name"]
>>> print name        #Python 3: print(name)
www.itdiffer.com
>>> contents = s["contents"]
>>> print contents        #Python 3: print(contents)
{'second': 'day day up', 'first': 'base knowledge'}

# for循环读

>>> for k in s:
...     print k, s[k]
...
contents {'second': 'day day up', 'first': 'base knowledge'}
lang python
pages 1000
name www.itdiffer.com
所建立的对象被变量 s 所引用,就如同字典一样,可称之为类字典对象。所以,可以如同操作字典那样来操作它。

但是,要小心坑:

    >>> f = shelve.open("22901.db")
    >>> f["author"]
    ['qiwsir']
    >>> f["author"].append("Hetz")    #试图增加一个
    >>> f["author"]                   #坑就在这里
    ['qiwsir']
    >>> f.close()

当试图修改一个已有键的值时没有报错,但是并没有修改成功。要填平这个坑,需要这样做:
   
    >>> f = shelve.open("22901.db", writeback=True)    #多一个参数True
    >>> f["author"].append("Hetz")
    >>> f["author"]                   #没有坑了
    ['qiwsir', 'Hetz']
    >>> f.close()

还用`for`循环一下:

    >>> f = shelve.open("22901.db")
    >>> for k,v in f.items():
    ...     print k,": ",v        #Python 3: print(k,": ",v)
    ...
    contents :  {'second': 'day day up', 'first': 'base knowledge'}
    lang :  python
    pages :  1000
    author :  ['qiwsir', 'Hetz']
    name :  www.itdiffer.com

时间: 2024-10-26 04:44:32

Python基础数据存储学习笔记的相关文章

Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍_python

1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 代码如下: ed_user = User('ed', 'Ed Jones', 'edspassword')session.add(ed_user) 上面两段代码执行完后对象持久化了么?你或许会兴冲冲的跑去数据库里查看,结果却失望而归--数据库里什么都没有.为什么呢?因为SQLAlchemy采取的是

Python ORM框架SQLAlchemy学习笔记之数据查询实例_python

前期我们做了充足的准备工作,现在该是关键内容之一查询了,当然前面的文章中或多或少的穿插了些有关查询的东西,比如一个查询(Query)对象就是通过Session会话的query()方法获取的,需要注意的是这个方法的参数数目是可变的,也就是说我们可以传入任意多的参数数目,参数的类型可以是任意的类组合或者是类的名称,接下来我们的例子就说明了这一点,我们让Query对象加载了User实例. 复制代码 代码如下: >>> for instance in session.query(User).or

Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例_python

最近正好在寻求一种Python的数据库ORM (Object Relational Mapper),SQLAlchemy (项目主页)这个开源项目进入了我的视线,本来想尝试着使用Django的ORM模块的,无奈Django的模块联系比较紧密,没能单独分拆下来,一定程度上说明Django自成体系的生态系统在给我们带来快速便捷的开发环境的同时牺牲了组装的灵活性. 初次学习,也没实质感觉到SQLAlchemy的好处,不过看其介绍的很多大公司均采用该项目,而且其支持的数据库还是蛮丰富的,所以我觉得花点时

Java语法基础之运算符学习笔记分享_java

一.运算符 运算符包括下面几种: 算术运算符赋值运算符比较运算符逻辑运算符位运算符三目运算符 最不常用的是位运算符,但也是最接近计算机底层的. 1.算术运算符 (1)+的几种用法:加法.正数.字符串连接符 (2)除法的时候要注意一个问题:整数相除,只能得到整数.要想得到小数,可以将数据自身*1.0,即将数据自身先转换为浮点型. 2.赋值运算符 符号 = += -= *= /= %= 注:=为基本的赋值运算符,其他的为扩展的赋值运算符 面试题: (1)short s=1, s = s+1; (2)

Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍_python

1. 创建映射类的实例(Instance) 前面介绍了如何将数据库实体表映射到Python类上,下面我们可以创建这个类的一个实例(Instance),我们还是以前一篇文章的User类为例,让我们创建User对象: 复制代码 代码如下: >>> ed_user = User('ed', 'Ed Jones', 'edspassword')>>> ed_user.name'ed'>>> ed_user.password'edspassword'>&g

python字符串格式化之学习笔记

在python中格式化输出字符串使用的是%运算符,通用的形式为 •格式标记字符串 % 要输出的值组 其中,左边部分的"格式标记字符串"可以完全和c中的一致.右边的'值组'如果有两个及以上的值则需要用小括号括起来,中间用短号隔开.重点来看左边的部分.左边部分的最简单形式为: •%cdoe 其中的code有多种,不过由于在python中,所有东西都可以转换成string类型,因此,如果没有什么特殊需求完全可以全部使用'%s'来标记.比如: •'%s %s %s' % (1, 2.3, ['

sql server 2005数据存储过程学习笔记

sql server 2005 存储过程语法 CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] [ { @parameter [ type_schema_name. ] data_type } sql server 2005 存储过程 语法 CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]     [ { @par

python的xml.dom学习笔记

首先说一下,由于这篇文章主要是自己随性学习写的,所以读者看起来可能很乱,呵呵.可以给大家稍微推荐一篇:http://www.cnblogs.com/xuxm2007/archive/2011/01/16/1936610.html 稍微清晰一点 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

[hadoop+spark+python]大数据实战随手笔记

1.提交任务 指令(我配置了spark-submit的环境变量) spark-submit --class org.apache.spark.examples.SparkPi --master spark://192.168.12.233:7077 --executor-memory 10G --total-executor-cores 10 fielname 逐条解释如下: (1)–class org.apache.spark.examples.SparkPi 设置运行的环境,java或者ya