资讯专栏INFORMATION COLUMN

Python基础之(十一)数据存储

Songlcy / 2270人阅读

摘要:默认为或者说,是以格式保存对象如果设置为或者,则以压缩的二进制格式保存对象。但是,要小心坑试图增加一个坑就在这里当试图修改一个已有键的值时没有报错,但是并没有修改成功。要填平这个坑,需要这样做多一个参数没有坑了还用循环一下

pickle

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:  
>>> 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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38200.html

相关文章

  • PHP面试常考内容Memcache和Redis(2)

    摘要:继周一发布的面试常考内容之和后,这是第二篇,感谢你的支持和阅读。预告面试常考内容之和将于本周五更新。以上内容摘自程序员面试笔试宝典书籍,该书已在天猫京东当当等电商平台销售。 你好,是我琉忆。继周一(2019.2-18)发布的PHP面试常考内容之Memcache和Redis(1)后,这是第二篇,感谢你的支持和阅读。本周(2019.2-18至2-22)的文章内容点为以下几点,更新时间为每周...

    Eric 评论0 收藏0
  • PHP面试常考内容Memcache和Redis(2)

    摘要:继周一发布的面试常考内容之和后,这是第二篇,感谢你的支持和阅读。预告面试常考内容之和将于本周五更新。以上内容摘自程序员面试笔试宝典书籍,该书已在天猫京东当当等电商平台销售。 你好,是我琉忆。继周一(2019.2-18)发布的PHP面试常考内容之Memcache和Redis(1)后,这是第二篇,感谢你的支持和阅读。本周(2019.2-18至2-22)的文章内容点为以下几点,更新时间为每周...

    sewerganger 评论0 收藏0
  • Python爬虫学习路线

    摘要:以下这些项目,你拿来学习学习练练手。当你每个步骤都能做到很优秀的时候,你应该考虑如何组合这四个步骤,使你的爬虫达到效率最高,也就是所谓的爬虫策略问题,爬虫策略学习不是一朝一夕的事情,建议多看看一些比较优秀的爬虫的设计方案,比如说。 (一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量、数据结构、语法...

    liaoyg8023 评论0 收藏0
  • [系统安全] 三十五.Procmon工具基本用法及文件进程、注册表查看

    摘要:本文将分享软件基本用法及文件进程注册表查看,这是一款微软推荐的系统监视工具,功能非常强大可用来检测恶意软件。可以帮助使用者对系统中的任何文件注册表操作进行监视和记录,通过注册表和文件读写的变化,有效帮助诊断系统故障或发现恶意软件病毒及木马。 ...

    kk_miles 评论0 收藏0
  • Python 基础起步 (十一) 写在最后的话(附优秀资源汇总)

    摘要:总结不知不觉作为一个小白已经写完了最最基础的简单教程,如果你也和我一样从事金融行业,或者毫无编程基础的小白,希望我的教程可以帮到你,这是基础起步的最终篇,我希望能和大家简单介绍一下后续介绍以及很多帮助到我的优秀的平台。 总结 不知不觉作为一个小白已经写完了最最基础的Python简单教程,如果你也和我一样从事金融行业,或者毫无编程基础的小白,希望我的教程可以帮到你,这是Python基础起...

    mrcode 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<