“Python/docs/3.9/library/dbm”的版本间差异
(autoload) |
小 (Page commit) |
||
第1行: | 第1行: | ||
+ | {{DISPLAYTITLE:dbm — Unix “数据库”的接口 — Python 文档}} | ||
<div id="module-dbm" class="section"> | <div id="module-dbm" class="section"> | ||
<span id="dbm-interfaces-to-unix-databases"></span> | <span id="dbm-interfaces-to-unix-databases"></span> | ||
− | = | + | = dbm — Unix“数据库”的接口 = |
− | ''' | + | '''源代码:''' [[#id1|<span id="id2" class="problematic">:source:`Lib/dbm/__init__.py`</span>]] |
− | |||
− | |||
− | |||
− | |||
− | |||
− | ; ''exception'' < | + | ----- |
− | : | + | |
+ | [[#module-dbm|dbm]] 是 DBM 数据库变体的通用接口 - [[#module-dbm.gnu|dbm.gnu]] 或 [[#module-dbm.ndbm|dbm.ndbm]]。 如果没有安装这些模块,将使用模块 [[#module-dbm.dumb|dbm.dumb]] 中缓慢但简单的实现。 Oracle Berkeley DB 有一个 [https://www.jcea.es/programacion/pybsddb.htm 第三方接口] 。 | ||
+ | |||
+ | ; ''<span class="pre">exception</span>'' <span class="sig-prename descclassname"><span class="pre">dbm.</span></span><span class="sig-name descname"><span class="pre">error</span></span> | ||
+ | : 包含每个受支持模块可以引发的异常的元组,唯一的异常也命名为 [[#dbm.error|dbm.error]] 作为第一项——后者在 [[#dbm.error|dbm.error]] 时使用被提出。 | ||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">dbm.</span></span><span class="sig-name descname"><span class="pre">whichdb</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">filename</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>此函数试图猜测可用的几个简单数据库模块中的哪一个——[[#module-dbm.gnu|dbm.gnu]]、[[#module-dbm.ndbm|dbm.ndbm]] 或 [[#module-dbm.dumb|dbm.dumb]]——应该用于打开一个给定的文件。</p> |
− | + | <p>返回以下值之一: <code>None</code> 如果文件因为不可读或不存在而无法打开; 如果无法猜测文件的格式,则为空字符串 (<code>''</code>); 或包含所需模块名称的字符串,例如 <code>'dbm.ndbm'</code> 或 <code>'dbm.gnu'</code>。</p></dd></dl> | |
− | |||
− | <p> | ||
− | |||
− | |||
− | |||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">dbm.</span></span><span class="sig-name descname"><span class="pre">open</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">file</span></span>'', ''<span class="n"><span class="pre">flag</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'r'</span></span>'', ''<span class="n"><span class="pre">mode</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0o666</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>打开数据库文件''file'',返回一个对应的对象。</p> |
− | <p> | + | <p>如果数据库文件已经存在,则使用[[#dbm.whichdb|whichdb()]]函数来确定其类型并使用相应的模块; 如果它不存在,则使用上面列出的第一个可以导入的模块。</p> |
− | + | <p>可选的 ''flag'' 参数可以是:</p> | |
− | |||
− | <p> | ||
{| | {| | ||
− | !width="17%"| <p> | + | !width="17%"| <p>价值</p> |
− | !width="83%"| <p> | + | !width="83%"| <p>意义</p> |
|- | |- | ||
| <p><code>'r'</code></p> | | <p><code>'r'</code></p> | ||
− | | <p> | + | | <p>以只读方式打开现有数据库(默认)</p> |
− | |||
|- | |- | ||
| <p><code>'w'</code></p> | | <p><code>'w'</code></p> | ||
− | | <p> | + | | <p>打开现有数据库进行读写</p> |
− | |||
|- | |- | ||
| <p><code>'c'</code></p> | | <p><code>'c'</code></p> | ||
− | | <p> | + | | <p>打开数据库进行读写,如果不存在则创建</p> |
− | |||
|- | |- | ||
| <p><code>'n'</code></p> | | <p><code>'n'</code></p> | ||
− | | <p> | + | | <p>总是创建一个新的、空的数据库,以读写方式打开</p> |
− | |||
|} | |} | ||
− | <p> | + | <p>可选的 ''mode'' 参数是文件的 Unix 模式,仅在必须创建数据库时使用。 它默认为八进制 <code>0o666</code>(并将被流行的 umask 修改)。</p></dd></dl> |
− | |||
− | |||
− | + | [[#dbm.open|open()]] 返回的对象支持与字典相同的基本功能; 可以存储、检索和删除键及其对应的值,并且可以使用 [[../../reference/expressions#in|in]] 运算符和 <code>keys()</code> 方法,以及 <code>get()</code> 和 [ X267X]。 | |
− | |||
− | |||
− | |||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <span class="versionmodified changed">在 3.2 | + | <span class="versionmodified changed">在 3.2 版更改:</span><code>get()</code> 和 <code>setdefault()</code> 现在可用于所有数据库模块。 |
第70行: | 第54行: | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <span class="versionmodified changed"> | + | <span class="versionmodified changed"> 3.8 版更改: </span> 从只读数据库中删除密钥会引发数据库模块特定错误,而不是 [[../exceptions#KeyError|KeyError]]。 |
− | |||
</div> | </div> | ||
− | + | 键和值始终存储为字节。 这意味着当使用字符串时,它们在存储之前被隐式转换为默认编码。 | |
− | |||
− | |||
− | + | 这些对象还支持在 [[../../reference/compound_stmts#with|with]] 语句中使用,完成后会自动关闭它们。 | |
− | |||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <span class="versionmodified changed">在 3.4 | + | <span class="versionmodified changed"> 在 3.4 版更改: </span> 为 [[#dbm.open|open()]] 返回的对象添加了对上下文管理协议的本机支持。 |
− | |||
</div> | </div> | ||
− | + | 下面的例子记录了一些主机名和一个对应的标题,然后打印出数据库的内容: | |
− | |||
<div class="highlight-python3 notranslate"> | <div class="highlight-python3 notranslate"> | ||
第96行: | 第74行: | ||
<div class="highlight"> | <div class="highlight"> | ||
− | < | + | <syntaxhighlight lang="python3">import dbm |
# Open database, creating it if necessary. | # Open database, creating it if necessary. | ||
第118行: | 第96行: | ||
db['www.yahoo.com'] = 4 | db['www.yahoo.com'] = 4 | ||
− | # db is automatically closed when leaving the with statement.</ | + | # db is automatically closed when leaving the with statement.</syntaxhighlight> |
</div> | </div> | ||
第125行: | 第103行: | ||
<div class="admonition seealso"> | <div class="admonition seealso"> | ||
− | + | 也可以看看 | |
− | ; | + | ; 模块 [[../shelve#module-shelve|搁架]] |
− | : | + | : 存储非字符串数据的持久性模块。 |
</div> | </div> | ||
− | + | 以下各节介绍了各个子模块。 | |
<div id="module-dbm.gnu" class="section"> | <div id="module-dbm.gnu" class="section"> | ||
<span id="dbm-gnu-gnu-s-reinterpretation-of-dbm"></span> | <span id="dbm-gnu-gnu-s-reinterpretation-of-dbm"></span> | ||
− | == [[# | + | == dbm.gnu — GNU 对 dbm 的重新解释 == |
+ | |||
+ | '''源代码:''' [[#id3|<span id="id4" class="problematic">:source:`Lib/dbm/gnu.py`</span>]] | ||
+ | |||
− | + | ----- | |
− | + | 该模块与 [[#module-dbm|dbm]] 模块非常相似,但使用 GNU 库 <code>gdbm</code> 来提供一些附加功能。 请注意 [[#module-dbm.gnu|dbm.gnu]] 和 [[#module-dbm.ndbm|dbm.ndbm]] 创建的文件格式不兼容。 | |
− | <code>gdbm</code> | ||
− | |||
− | + | [[#module-dbm.gnu|dbm.gnu]] 模块提供了一个到 GNU DBM 库的接口。 <code>dbm.gnu.gdbm</code> 对象的行为类似于映射(字典),除了键和值在存储之前总是转换为字节。 打印 <code>gdbm</code> 对象不会打印键和值,并且不支持 <code>items()</code> 和 <code>values()</code> 方法。 | |
− | <code>dbm.gnu.gdbm</code> | ||
− | |||
− | |||
− | |||
− | |||
− | ; ''exception'' < | + | ; ''<span class="pre">exception</span>'' <span class="sig-prename descclassname"><span class="pre">dbm.gnu.</span></span><span class="sig-name descname"><span class="pre">error</span></span> |
− | : | + | : 引发 [[#module-dbm.gnu|dbm.gnu]] 特定错误,例如 I/O 错误。 [[../exceptions#KeyError|KeyError]] 针对一般映射错误(例如指定不正确的密钥)引发。 |
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">dbm.gnu.</span></span><span class="sig-name descname"><span class="pre">open</span></span><span class="sig-paren">(</span>''<span class="pre">filename</span>''<span class="optional">[</span>, ''<span class="pre">flag</span>''<span class="optional">[</span>, ''<span class="pre">mode</span>''<span class="optional">]</span><span class="optional">]</span><span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>打开一个 <code>gdbm</code> 数据库并返回一个 <code>gdbm</code> 对象。 ''filename'' 参数是数据库文件的名称。</p> |
− | + | <p>可选的 ''flag'' 参数可以是:</p> | |
− | <p> | ||
{| | {| | ||
− | !width="17%"| <p> | + | !width="17%"| <p>价值</p> |
− | !width="83%"| <p> | + | !width="83%"| <p>意义</p> |
|- | |- | ||
| <p><code>'r'</code></p> | | <p><code>'r'</code></p> | ||
− | | <p> | + | | <p>以只读方式打开现有数据库(默认)</p> |
− | |||
|- | |- | ||
| <p><code>'w'</code></p> | | <p><code>'w'</code></p> | ||
− | | <p> | + | | <p>打开现有数据库进行读写</p> |
− | |||
|- | |- | ||
| <p><code>'c'</code></p> | | <p><code>'c'</code></p> | ||
− | | <p> | + | | <p>打开数据库进行读写,如果不存在则创建</p> |
− | |||
|- | |- | ||
| <p><code>'n'</code></p> | | <p><code>'n'</code></p> | ||
− | | <p> | + | | <p>总是创建一个新的、空的数据库,以读写方式打开</p> |
− | |||
|} | |} | ||
− | <p> | + | <p>可以将以下附加字符附加到标志以控制数据库的打开方式:</p> |
− | |||
{| | {| | ||
− | !width="17%"| <p> | + | !width="17%"| <p>价值</p> |
− | !width="83%"| <p> | + | !width="83%"| <p>意义</p> |
|- | |- | ||
| <p><code>'f'</code></p> | | <p><code>'f'</code></p> | ||
− | | <p> | + | | <p>以快速模式打开数据库。 对数据库的写入不会同步。</p> |
− | |||
|- | |- | ||
| <p><code>'s'</code></p> | | <p><code>'s'</code></p> | ||
− | | <p> | + | | <p>同步模式。 这将导致对数据库的更改立即写入文件。</p> |
− | |||
− | |||
|- | |- | ||
| <p><code>'u'</code></p> | | <p><code>'u'</code></p> | ||
− | | <p> | + | | <p>不要锁定数据库。</p> |
|} | |} | ||
− | <p> | + | <p>并非所有标志都对 <code>gdbm</code> 的所有版本都有效。 模块常量 <code>open_flags</code> 是一串支持的标志字符。 如果指定了无效标志,则会引发异常 [[#dbm.gnu.error|error]]。</p> |
− | <code>open_flags</code> | + | <p>可选的 ''mode'' 参数是文件的 Unix 模式,仅在必须创建数据库时使用。 默认为八进制 <code>0o666</code>。</p> |
− | [[#dbm.gnu.error| | + | <p>除了类似字典的方法,<code>gdbm</code> 对象还有以下方法:</p> |
− | <p> | ||
− | |||
− | <p> | ||
− | |||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">gdbm.</span></span><span class="sig-name descname"><span class="pre">firstkey</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>可以使用此方法和 [[#dbm.gnu.gdbm.nextkey|nextkey()]] 方法遍历数据库中的每个键。 遍历按 <code>gdbm</code> 的内部哈希值排序,不会按键值排序。 此方法返回起始密钥。</p></dd></dl> |
− | [[#dbm.gnu.gdbm.nextkey| | ||
− | |||
− | |||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">gdbm.</span></span><span class="sig-name descname"><span class="pre">nextkey</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">key</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>返回遍历中''key''后面的key。 以下代码打印数据库 <code>db</code> 中的每个键,而无需在内存中创建包含所有键的列表:</p> |
− | |||
− | |||
<div class="highlight-python3 notranslate"> | <div class="highlight-python3 notranslate"> | ||
<div class="highlight"> | <div class="highlight"> | ||
− | < | + | <syntaxhighlight lang="python3">k = db.firstkey() |
− | while k | + | while k is not None: |
print(k) | print(k) | ||
− | k = db.nextkey(k)</ | + | k = db.nextkey(k)</syntaxhighlight> |
</div> | </div> | ||
第233行: | 第189行: | ||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">gdbm.</span></span><span class="sig-name descname"><span class="pre">reorganize</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>如果您进行了大量删除并希望缩小 <code>gdbm</code> 文件使用的空间,则此例程将重新组织数据库。 <code>gdbm</code> 对象不会缩短数据库文件的长度,除非使用这种重组; 否则,删除的文件空间将被保留并在添加新的(键,值)对时重新使用。</p></dd></dl> |
− | |||
− | |||
− | |||
− | |||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">gdbm.</span></span><span class="sig-name descname"><span class="pre">sync</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>当以快速模式打开数据库时,此方法会强制将任何未写入的数据写入磁盘。</p></dd></dl> |
− | |||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">gdbm.</span></span><span class="sig-name descname"><span class="pre">close</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>关闭 <code>gdbm</code> 数据库。</p></dd></dl> |
</dd></dl> | </dd></dl> | ||
第255行: | 第206行: | ||
<span id="dbm-ndbm-interface-based-on-ndbm"></span> | <span id="dbm-ndbm-interface-based-on-ndbm"></span> | ||
− | == [[# | + | == dbm.ndbm — 基于 ndbm 的接口 == |
+ | |||
+ | '''源代码:''' [[#id5|<span id="id6" class="problematic">:source:`Lib/dbm/ndbm.py`</span>]] | ||
+ | |||
− | + | ----- | |
− | + | [[#module-dbm.ndbm|dbm.ndbm]] 模块提供了一个到 Unix“(n)dbm”库的接口。 Dbm 对象的行为类似于映射(字典),不同之处在于键和值始终存储为字节。 打印 <code>dbm</code> 对象不会打印键和值,并且不支持 <code>items()</code> 和 <code>values()</code> 方法。 | |
− | Dbm | ||
− | |||
− | |||
− | + | 该模块可以与“经典”ndbm 接口或 GNU GDBM 兼容接口一起使用。 在 Unix 上,'''configure''' 脚本将尝试定位适当的头文件以简化构建此模块。 | |
− | |||
− | |||
− | ; ''exception'' < | + | ; ''<span class="pre">exception</span>'' <span class="sig-prename descclassname"><span class="pre">dbm.ndbm.</span></span><span class="sig-name descname"><span class="pre">error</span></span> |
− | : | + | : 引发 [[#module-dbm.ndbm|dbm.ndbm]] 特定错误,例如 I/O 错误。 [[../exceptions#KeyError|KeyError]] 针对一般映射错误(例如指定不正确的密钥)引发。 |
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">dbm.ndbm.</span></span><span class="sig-name descname"><span class="pre">library</span></span> |
− | : | + | : 使用的 <code>ndbm</code> 实现库的名称。 |
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">dbm.ndbm.</span></span><span class="sig-name descname"><span class="pre">open</span></span><span class="sig-paren">(</span>''<span class="pre">filename</span>''<span class="optional">[</span>, ''<span class="pre">flag</span>''<span class="optional">[</span>, ''<span class="pre">mode</span>''<span class="optional">]</span><span class="optional">]</span><span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>打开一个 dbm 数据库并返回一个 <code>ndbm</code> 对象。 ''filename'' 参数是数据库文件的名称(没有 <code>.dir</code> 或 <code>.pag</code> 扩展名)。</p> |
− | + | <p>可选的 ''flag'' 参数必须是以下值之一:</p> | |
− | <p> | ||
{| | {| | ||
− | !width="17%"| <p> | + | !width="17%"| <p>价值</p> |
− | !width="83%"| <p> | + | !width="83%"| <p>意义</p> |
|- | |- | ||
| <p><code>'r'</code></p> | | <p><code>'r'</code></p> | ||
− | | <p> | + | | <p>以只读方式打开现有数据库(默认)</p> |
− | |||
|- | |- | ||
| <p><code>'w'</code></p> | | <p><code>'w'</code></p> | ||
− | | <p> | + | | <p>打开现有数据库进行读写</p> |
− | |||
|- | |- | ||
| <p><code>'c'</code></p> | | <p><code>'c'</code></p> | ||
− | | <p> | + | | <p>打开数据库进行读写,如果不存在则创建</p> |
− | |||
|- | |- | ||
| <p><code>'n'</code></p> | | <p><code>'n'</code></p> | ||
− | | <p> | + | | <p>总是创建一个新的、空的数据库,以读写方式打开</p> |
− | |||
|} | |} | ||
− | <p> | + | <p>可选的 ''mode'' 参数是文件的 Unix 模式,仅在必须创建数据库时使用。 它默认为八进制 <code>0o666</code>(并将被流行的 umask 修改)。</p> |
− | + | <p>除了类似字典的方法外,<code>ndbm</code> 对象还提供以下方法:</p> | |
− | |||
− | <p> | ||
− | |||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">ndbm.</span></span><span class="sig-name descname"><span class="pre">close</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>关闭 <code>ndbm</code> 数据库。</p></dd></dl> |
</dd></dl> | </dd></dl> | ||
第315行: | 第256行: | ||
<span id="dbm-dumb-portable-dbm-implementation"></span> | <span id="dbm-dumb-portable-dbm-implementation"></span> | ||
− | == | + | == dbm.dumb — 便携式 DBM 实现 == |
− | ''' | + | '''源代码:''' [[#id7|<span id="id8" class="problematic">:source:`Lib/dbm/dumb.py`</span>]] |
<div id="index-0" class="admonition note"> | <div id="index-0" class="admonition note"> | ||
− | + | 笔记 | |
− | + | 当更强大的模块不可用时,[[#module-dbm.dumb|dbm.dumb]] 模块旨在作为 [[#module-dbm|dbm]] 模块的最后手段。 [[#module-dbm.dumb|dbm.dumb]] 模块不是为了速度而编写的,并且不像其他数据库模块那样频繁使用。 | |
− | [[#module-dbm| | ||
− | |||
− | |||
</div> | </div> | ||
− | |||
− | |||
− | |||
− | |||
− | + | ----- | |
+ | |||
+ | [[#module-dbm.dumb|dbm.dumb]] 模块提供了一个完全用 Python 编写的类似字典的持久接口。 与 [[#module-dbm.gnu|dbm.gnu]] 等其他模块不同,不需要外部库。 与其他持久映射一样,键和值始终存储为字节。 | ||
− | ; ''exception'' < | + | 该模块定义了以下内容: |
− | : | + | |
+ | ; ''<span class="pre">exception</span>'' <span class="sig-prename descclassname"><span class="pre">dbm.dumb.</span></span><span class="sig-name descname"><span class="pre">error</span></span> | ||
+ | : 引发 [[#module-dbm.dumb|dbm.dumb]] 特定错误,例如 I/O 错误。 [[../exceptions#KeyError|KeyError]] 针对一般映射错误(例如指定不正确的密钥)引发。 | ||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">dbm.dumb.</span></span><span class="sig-name descname"><span class="pre">open</span></span><span class="sig-paren">(</span>''<span class="pre">filename</span>''<span class="optional">[</span>, ''<span class="pre">flag</span>''<span class="optional">[</span>, ''<span class="pre">mode</span>''<span class="optional">]</span><span class="optional">]</span><span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>打开一个<code>dumbdbm</code> 数据库并返回一个dumbdbm 对象。 ''filename'' 参数是数据库文件的基本名称(没有任何特定的扩展名)。 当创建一个dumbdbm 数据库时,会创建带有<code>.dat</code> 和<code>.dir</code> 扩展名的文件。</p> |
− | + | <p>可选的 ''flag'' 参数可以是:</p> | |
− | |||
− | |||
− | <p> | ||
{| | {| | ||
− | !width="17%"| <p> | + | !width="17%"| <p>价值</p> |
− | !width="83%"| <p> | + | !width="83%"| <p>意义</p> |
|- | |- | ||
| <p><code>'r'</code></p> | | <p><code>'r'</code></p> | ||
− | | <p> | + | | <p>以只读方式打开现有数据库(默认)</p> |
− | |||
|- | |- | ||
| <p><code>'w'</code></p> | | <p><code>'w'</code></p> | ||
− | | <p> | + | | <p>打开现有数据库进行读写</p> |
− | |||
|- | |- | ||
| <p><code>'c'</code></p> | | <p><code>'c'</code></p> | ||
− | | <p> | + | | <p>打开数据库进行读写,如果不存在则创建</p> |
− | |||
|- | |- | ||
| <p><code>'n'</code></p> | | <p><code>'n'</code></p> | ||
− | | <p> | + | | <p>总是创建一个新的、空的数据库,以读写方式打开</p> |
− | |||
|} | |} | ||
− | <p> | + | <p>可选的 ''mode'' 参数是文件的 Unix 模式,仅在必须创建数据库时使用。 它默认为八进制 <code>0o666</code>(并将被流行的 umask 修改)。</p> |
− | |||
− | |||
<div class="admonition warning"> | <div class="admonition warning"> | ||
<p>警告</p> | <p>警告</p> | ||
− | <p> | + | <p>由于 Python 的 AST 编译器中的堆栈深度限制,在加载具有足够大/复杂条目的数据库时,可能会导致 Python 解释器崩溃。</p> |
− | |||
− | Python | ||
</div> | </div> | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed">在 3.5 | + | <p><span class="versionmodified changed">在 3.5 版更改:</span>[[#dbm.dumb.open|open()]] 总是在标志具有值 <code>'n'</code> 时创建一个新数据库。</p> |
− | <code>'n'</code> | ||
</div> | </div> | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed">在 3.8 | + | <p><span class="versionmodified changed">在 3.8 版更改:</span>使用标志 <code>'r'</code> 打开的数据库现在是只读的。 如果数据库不存在,使用标志 <code>'r'</code> 和 <code>'w'</code> 打开不再创建数据库。</p> |
− | |||
− | |||
</div> | </div> | ||
− | <p> | + | <p>除了 [[../collections.abc#collections.abc|collections.abc.MutableMapping]] 类提供的方法之外,<code>dumbdbm</code> 对象还提供以下方法:</p> |
− | [[../collections.abc#collections.abc| | ||
− | |||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">dumbdbm.</span></span><span class="sig-name descname"><span class="pre">sync</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>同步磁盘目录和数据文件。 该方法由 <code>Shelve.sync()</code> 方法调用。</p></dd></dl> |
− | |||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">dumbdbm.</span></span><span class="sig-name descname"><span class="pre">close</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>关闭 <code>dumbdbm</code> 数据库。</p></dd></dl> |
</dd></dl> | </dd></dl> | ||
</div> | </div> | ||
+ | |||
+ | </div> | ||
+ | <div class="clearer"> | ||
+ | |||
+ | |||
</div> | </div> | ||
− | [[Category:Python 3.9 | + | [[Category:Python 3.9 文档]] |
2021年10月31日 (日) 04:51的最新版本
dbm — Unix“数据库”的接口
源代码: :source:`Lib/dbm/__init__.py`
dbm 是 DBM 数据库变体的通用接口 - dbm.gnu 或 dbm.ndbm。 如果没有安装这些模块,将使用模块 dbm.dumb 中缓慢但简单的实现。 Oracle Berkeley DB 有一个 第三方接口 。
- dbm.whichdb(filename)
此函数试图猜测可用的几个简单数据库模块中的哪一个——dbm.gnu、dbm.ndbm 或 dbm.dumb——应该用于打开一个给定的文件。
返回以下值之一:
None
如果文件因为不可读或不存在而无法打开; 如果无法猜测文件的格式,则为空字符串 (); 或包含所需模块名称的字符串,例如
'dbm.ndbm'
或'dbm.gnu'
。
- dbm.open(file, flag='r', mode=0o666)
打开数据库文件file,返回一个对应的对象。
如果数据库文件已经存在,则使用whichdb()函数来确定其类型并使用相应的模块; 如果它不存在,则使用上面列出的第一个可以导入的模块。
可选的 flag 参数可以是:
价值
意义
'r'
以只读方式打开现有数据库(默认)
'w'
打开现有数据库进行读写
'c'
打开数据库进行读写,如果不存在则创建
'n'
总是创建一个新的、空的数据库,以读写方式打开
可选的 mode 参数是文件的 Unix 模式,仅在必须创建数据库时使用。 它默认为八进制
0o666
(并将被流行的 umask 修改)。
open() 返回的对象支持与字典相同的基本功能; 可以存储、检索和删除键及其对应的值,并且可以使用 in 运算符和 keys()
方法,以及 get()
和 [ X267X]。
在 3.2 版更改:get()
和 setdefault()
现在可用于所有数据库模块。
3.8 版更改: 从只读数据库中删除密钥会引发数据库模块特定错误,而不是 KeyError。
键和值始终存储为字节。 这意味着当使用字符串时,它们在存储之前被隐式转换为默认编码。
这些对象还支持在 with 语句中使用,完成后会自动关闭它们。
在 3.4 版更改: 为 open() 返回的对象添加了对上下文管理协议的本机支持。
下面的例子记录了一些主机名和一个对应的标题,然后打印出数据库的内容:
以下各节介绍了各个子模块。
dbm.gnu — GNU 对 dbm 的重新解释
该模块与 dbm 模块非常相似,但使用 GNU 库 gdbm
来提供一些附加功能。 请注意 dbm.gnu 和 dbm.ndbm 创建的文件格式不兼容。
dbm.gnu 模块提供了一个到 GNU DBM 库的接口。 dbm.gnu.gdbm
对象的行为类似于映射(字典),除了键和值在存储之前总是转换为字节。 打印 gdbm
对象不会打印键和值,并且不支持 items()
和 values()
方法。
- dbm.gnu.open(filename[, flag[, mode]])
打开一个
gdbm
数据库并返回一个gdbm
对象。 filename 参数是数据库文件的名称。可选的 flag 参数可以是:
价值
意义
'r'
以只读方式打开现有数据库(默认)
'w'
打开现有数据库进行读写
'c'
打开数据库进行读写,如果不存在则创建
'n'
总是创建一个新的、空的数据库,以读写方式打开
可以将以下附加字符附加到标志以控制数据库的打开方式:
价值
意义
'f'
以快速模式打开数据库。 对数据库的写入不会同步。
's'
同步模式。 这将导致对数据库的更改立即写入文件。
'u'
不要锁定数据库。
并非所有标志都对
gdbm
的所有版本都有效。 模块常量open_flags
是一串支持的标志字符。 如果指定了无效标志,则会引发异常 error。可选的 mode 参数是文件的 Unix 模式,仅在必须创建数据库时使用。 默认为八进制
0o666
。除了类似字典的方法,
gdbm
对象还有以下方法:- gdbm.firstkey()
可以使用此方法和 nextkey() 方法遍历数据库中的每个键。 遍历按
gdbm
的内部哈希值排序,不会按键值排序。 此方法返回起始密钥。
- gdbm.nextkey(key)
返回遍历中key后面的key。 以下代码打印数据库
db
中的每个键,而无需在内存中创建包含所有键的列表:
- gdbm.reorganize()
如果您进行了大量删除并希望缩小
gdbm
文件使用的空间,则此例程将重新组织数据库。gdbm
对象不会缩短数据库文件的长度,除非使用这种重组; 否则,删除的文件空间将被保留并在添加新的(键,值)对时重新使用。
- gdbm.sync()
当以快速模式打开数据库时,此方法会强制将任何未写入的数据写入磁盘。
- gdbm.close()
关闭
gdbm
数据库。
dbm.ndbm — 基于 ndbm 的接口
源代码: :source:`Lib/dbm/ndbm.py`
dbm.ndbm 模块提供了一个到 Unix“(n)dbm”库的接口。 Dbm 对象的行为类似于映射(字典),不同之处在于键和值始终存储为字节。 打印 dbm
对象不会打印键和值,并且不支持 items()
和 values()
方法。
该模块可以与“经典”ndbm 接口或 GNU GDBM 兼容接口一起使用。 在 Unix 上,configure 脚本将尝试定位适当的头文件以简化构建此模块。
- dbm.ndbm.library
- 使用的
ndbm
实现库的名称。
- dbm.ndbm.open(filename[, flag[, mode]])
打开一个 dbm 数据库并返回一个
ndbm
对象。 filename 参数是数据库文件的名称(没有.dir
或.pag
扩展名)。可选的 flag 参数必须是以下值之一:
价值
意义
'r'
以只读方式打开现有数据库(默认)
'w'
打开现有数据库进行读写
'c'
打开数据库进行读写,如果不存在则创建
'n'
总是创建一个新的、空的数据库,以读写方式打开
可选的 mode 参数是文件的 Unix 模式,仅在必须创建数据库时使用。 它默认为八进制
0o666
(并将被流行的 umask 修改)。除了类似字典的方法外,
ndbm
对象还提供以下方法:- ndbm.close()
关闭
ndbm
数据库。
dbm.dumb — 便携式 DBM 实现
源代码: :source:`Lib/dbm/dumb.py`
dbm.dumb 模块提供了一个完全用 Python 编写的类似字典的持久接口。 与 dbm.gnu 等其他模块不同,不需要外部库。 与其他持久映射一样,键和值始终存储为字节。
该模块定义了以下内容:
- dbm.dumb.open(filename[, flag[, mode]])
打开一个
dumbdbm
数据库并返回一个dumbdbm 对象。 filename 参数是数据库文件的基本名称(没有任何特定的扩展名)。 当创建一个dumbdbm 数据库时,会创建带有.dat
和.dir
扩展名的文件。可选的 flag 参数可以是:
价值
意义
'r'
以只读方式打开现有数据库(默认)
'w'
打开现有数据库进行读写
'c'
打开数据库进行读写,如果不存在则创建
'n'
总是创建一个新的、空的数据库,以读写方式打开
可选的 mode 参数是文件的 Unix 模式,仅在必须创建数据库时使用。 它默认为八进制
0o666
(并将被流行的 umask 修改)。警告
由于 Python 的 AST 编译器中的堆栈深度限制,在加载具有足够大/复杂条目的数据库时,可能会导致 Python 解释器崩溃。
在 3.5 版更改:open() 总是在标志具有值
'n'
时创建一个新数据库。在 3.8 版更改:使用标志
'r'
打开的数据库现在是只读的。 如果数据库不存在,使用标志'r'
和'w'
打开不再创建数据库。除了 collections.abc.MutableMapping 类提供的方法之外,
dumbdbm
对象还提供以下方法:- dumbdbm.sync()
同步磁盘目录和数据文件。 该方法由
Shelve.sync()
方法调用。
- dumbdbm.close()
关闭
dumbdbm
数据库。