非常教程

Python参考手册

数据持久性 | Data Persistence

shelve

源代码: Lib / shelve.py

“货架”是一个持久的,类似字典的对象。与“dbm”数据库的不同之处在于,货架上的值(不是关键字!)本质上可以是任意的Python对象 - pickle模块可以处理的任何东西。这包括大多数类实例,递归数据类型和包含大量共享子对象的对象。键是普通的字符串。

shelve.open(filename, flag='c', protocol=None, writeback=False)

打开一个持久字典。指定的文件名是底层数据库的基本文件名。作为副作用,可以将扩展名添加到文件名中,并且可以创建多个文件。默认情况下,打开底层数据库文件以进行读取和写入。可选的标志参数与标志参数的含义相同anydbm.open()

默认情况下,版本0酱菜用于序列化值。pickle协议的版本可以用协议参数指定。

在版本2.3中更改:添加了协议参数。

由于Python的语义,一个书架无法知道何时修改了可变的持久字典条目。默认情况下,修改后的对象在分配给货架时才写入(请参阅示例)。如果可选写回参数设置为True,访问的所有项目也缓存在内存中,并在写回sync()close(); 这可以更容易地修改持久性字典中的可变条目,但是,如果访问了很多条目,它可能会消耗大量的缓存内存,并且它可以使关闭操作非常缓慢,因为所有访问的条目都被写回(没有办法确定哪些访问条目是可变的,哪些实际上是变异的)。

与文件对象一样,应该明确关闭搁置对象以确保将持久性数据刷新到磁盘。

警告

由于该shelve模块由后台支持pickle,因此从不受信任的源加载架子是不安全的。像pickle一样,加载一个架子可以执行任意代码。

货架对象支持字典支持的大多数方法。这简化了从基于字典的脚本到需要持久存储的脚本的过渡。

注意,Python的3过渡的方法(viewkeys()viewvalues(),和viewitems())不被支持。

还支持另外两种方法:

Shelf.sync()

如果搁架已打开且写回设置为,则将高速缓存中的所有条目写回True。如果可行,还清空缓存并同步磁盘上的持久字典。这在货架关闭时自动调用close()

Shelf.close()

同步并关闭持久性字典对象。在一个封闭的架子上操作将失败,一个ValueError

1.限制

  • 其中的数据库包将被使用的选择(例如dbmgdbmbsddb)取决于哪个接口是可用的。因此直接使用打开数据库是不安全的dbm。数据库也(不幸)受限于dbm(如果使用的话) - 这意味着存储在数据库中的对象(腌制表示)应该相当小,并且在极少数情况下,重要的冲突可能会导致数据库拒绝更新。
  • shelve模块不支持对搁置对象的并发读取/写入访问。(多个同时读取访问是安全的。)当一个程序有一个可写入的架子时,其他程序不应该打开它来读取或写入。Unix文件锁定可以用来解决这个问题,但是这在Unix版本中是不同的,并且需要关于所使用的数据库实现的知识。

class shelve.Shelf(dict, protocol=None, writeback=False)

A subclass of UserDict.DictMixin which stores pickled values in the dict object.

默认情况下,版本0酱菜用于序列化值。pickle协议的版本可以用协议参数指定。请参阅pickle文档以了解有关咸菜协议的讨论。

在版本2.3中更改:添加了协议参数。

如果写回参数是True,对象将保存所有访问条目的缓存,并在同步和关闭时间将它们写回字典。这允许对可变条目进行自然操作,但可能消耗更多内存并使同步和关闭需要很长时间。

class shelve.BsdDbShelf(dict, protocol=None, writeback=False)

子类的Shelf暴露first()next()previous()last()set_location()是适用于哪些bsddb模块而不是在其他数据库模块。传递给构造函数的dict对象必须支持这些方法。这通常是通过调用一个完成的bsddb.hashopen()bsddb.btopen()bsddb.rnopen()。可选的协议写回参数与Shelf该类具有相同的解释。

class shelve.DbfilenameShelf(filename, flag='c', protocol=None, writeback=False)

它的一个子类Shelf接受一个文件名而不是一个类似dict的对象。底层文件将使用打开anydbm.open()。默认情况下,该文件将被创建并打开以供读取和写入。可选的标志参数与该open()功能具有相同的解释。可选的协议写回参数与Shelf该类具有相同的解释。

2.例子

总结界面(key是一个字符串,data是一个任意的对象):

import shelve

d = shelve.open(filename) # open -- file may get suffix added by low-level
                          # library

d[key] = data   # store data at key (overwrites old data if
                # using an existing key)
data = d[key]   # retrieve a COPY of data at key (raise KeyError if no
                # such key)
del d[key]      # delete data stored at key (raises KeyError
                # if no such key)
flag = d.has_key(key)   # true if the key exists
klist = d.keys() # a list of all existing keys (slow!)

# as d was opened WITHOUT writeback=True, beware:
d['xx'] = range(4)  # this works as expected, but...
d['xx'].append(5)   # *this doesn't!* -- d['xx'] is STILL range(4)!

# having opened d without writeback=True, you need to code carefully:
temp = d['xx']      # extracts the copy
temp.append(5)      # mutates the copy
d['xx'] = temp      # stores the copy right back, to persist it

# or, d=shelve.open(filename,writeback=True) would let you just code
# d['xx'].append(5) and have it work as expected, BUT it would also
# consume more memory and make the d.close() operation slower.

d.close()       # close it
Python

Python 是一种面向对象的解释型计算机程序设计语言,由荷兰人 Guido van Rossum 于1989年发明,第一个公开发行版发行于1991年。 Python 是纯粹的自由软件, 源代码和解释器 CPython 遵循 GPL 协议。Python 语法简洁清晰,特色之一是强制用空白符( white space )作为语句缩进。

主页 https://www.python.org/
源码 https://github.com/python/cpython
版本 2.7
发布版本 2.7.13

Python目录

1.内置常量 | Built-in Constants
2.内置例外 | Built-in Exceptions
3.内置函数 | Built-in Functions
4.内置类型 | Built-in Types
5.编译器 | Compiler
6.加密 | Cryptography
7.数据压缩 | Data Compression
8.数据持久性 | Data Persistence
9.数据类型 | Data Types
10.调试和分析 | Debugging & Profiling
11.开发工具 | Development Tools
12.文件和目录访问 | File & Directory Access
13.文件格式 | File Formats
14.构架 | Frameworks
15.输入 | Importing
16.输入/输出 | Input/ouput
17.国际化 | Internationalization
18.网络 | Internet
19.网络数据 | Internet Data
20.翻译 | Interpreters
21.语言 | Language
22.记录 | Logging
23.Mac OS
24.MS Windows
25.多媒体 | Multimedia
26.联网 | Networking
27.数字与数学 | Numeric & Mathematical
28.操作系统 | Operating System
29.可选操作系统 | Optional Operating System
30.限制执行 | Restricted Execution
31.运行 | Runtime
32.SGI IRIX
33.软件包装与分销 | Software Packaging & Distribution
34.字符串 | String
35.结构化标记 | Structured Markup
36.Tk
37.Unix
38.Python 简介
39.Python pass 语句
40.Python 循环嵌套
41.Python 运算符
42.Python log10() 函数
43.Python log() 函数
44.Python floor() 函数
45.Python fabs() 函数
46.Python exp() 函数
47.Python cmp() 函数
48.Python ceil() 函数
49.Python abs() 函数
50.Python Number(数字)
51.Python pow() 函数
52.Python modf() 函数
53.Python min() 函数
54.Python max() 函数
55.Python asin() 函数
56.Python acos() 函数
57.Python uniform() 函数
58.Python shuffle() 函数
59.Python seed() 函数
60.Python random() 函数
61.Python randrange() 函数
62.Python choice() 函数
63.Python sqrt() 函数
64.Python round() 函数
65.Python radians() 函数
66.Python degrees() 函数
67.Python tan() 函数
68.Python sin() 函数
69.Python hypot() 函数
70.Python cos() 函数
71.Python atan2() 函数
72.Python atan() 函数
73.Python 元组
74.Python 列表(List)
75.Python 字符串
76.Python 字典(Dictionary)
77.Python 日期和时间
78.Python 函数
79.Python 模块
80.Python capitalize()方法
81.Python center()方法
82.Python count() 方法
83.Python expandtabs()方法
84.Python endswith()方法
85.Python encode()方法
86.Python decode()方法
87.Python find()方法
88.Python index()方法
89.Python 异常处理
90.Python isspace()方法
91.Python isnumeric()方法
92.Python islower()方法
93.Python isdigit()方法
94.Python isalpha()方法
95.Python isalnum()方法
96.Python isupper()方法
97.Python istitle()方法
98.Python min()方法
99.Python max()方法
100.Python maketrans()方法