2019-04-21 11:50:48 +08:00

28 lines
34 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="body" role="main"><div class="section" id="module-dbm"><h1><span class="yiyi-st" id="yiyi-10">12.5. <a class="reference internal" href="#module-dbm" title='dbm: Interfaces to various Unix "database" formats.'><code class="xref py py-mod docutils literal"><span class="pre">dbm</span></code></a> - 与Unix“数据库”的接口</span></h1><p><span class="yiyi-st" id="yiyi-11"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/dbm/__init__.py">Lib/dbm/__init__.py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#module-dbm" title='dbm: Interfaces to various Unix "database" formats.'><code class="xref py py-mod docutils literal"><span class="pre">dbm</span></code></a>是DBM数据库变体的通用接口 - <a class="reference internal" href="#module-dbm.gnu" title="dbm.gnu: GNU's reinterpretation of dbm. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">dbm.gnu</span></code></a><a class="reference internal" href="#module-dbm.ndbm" title='dbm.ndbm: The standard "database" interface, based on ndbm. (Unix)'><code class="xref py py-mod docutils literal"><span class="pre">dbm.ndbm</span></code></a></span><span class="yiyi-st" id="yiyi-13">如果没有安装这些模块,将使用模块<a class="reference internal" href="#module-dbm.dumb" title="dbm.dumb: Portable implementation of the simple DBM interface."><code class="xref py py-mod docutils literal"><span class="pre">dbm.dumb</span></code></a>中的慢但简单的实现。</span><span class="yiyi-st" id="yiyi-14">有一个<a class="reference external" href="https://www.jcea.es/programacion/pybsddb.htm">第三方接口</a>到Oracle Berkeley DB。</span></p><dl class="exception"><dt id="dbm.error"><span class="yiyi-st" id="yiyi-15"> <em class="property">exception </em><code class="descclassname">dbm.</code><code class="descname">error</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-16">包含可由每个受支持的模块引发的异常的元组,具有唯一异常(也称为<a class="reference internal" href="#dbm.error" title="dbm.error"><code class="xref py py-exc docutils literal"><span class="pre">dbm.error</span></code></a>)作为第一项 - 后者用于<a class="reference internal" href="#dbm.error" title="dbm.error"><code class="xref py py-exc docutils literal"><span class="pre">dbm.error</span></code></a></span></p></dd></dl><dl class="function"><dt id="dbm.whichdb"><span class="yiyi-st" id="yiyi-17"> <code class="descclassname">dbm.</code><code class="descname">whichdb</code><span class="sig-paren">(</span><em>filename</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-18">此函数尝试猜测几个简单数据库模块中的哪一个可用 - <a class="reference internal" href="#module-dbm.gnu" title="dbm.gnu: GNU's reinterpretation of dbm. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">dbm.gnu</span></code></a><a class="reference internal" href="#module-dbm.ndbm" title='dbm.ndbm: The standard "database" interface, based on ndbm. (Unix)'><code class="xref py py-mod docutils literal"><span class="pre">dbm.ndbm</span></code></a><a class="reference internal" href="#module-dbm.dumb" title="dbm.dumb: Portable implementation of the simple DBM interface."><code class="xref py py-mod docutils literal"><span class="pre">dbm.dumb</span></code></a>以打开给定的文件。</span></p><p><span class="yiyi-st" id="yiyi-19">返回以下值之一:<code class="docutils literal"><span class="pre">None</span></code>如果文件无法读取或不存在则无法打开;如果文件的格式不能被猜测,则为空字符串(<code class="docutils literal"><span class="pre">''</span></code>);或包含所需模块名称的字符串,例如<code class="docutils literal"><span class="pre">'dbm.ndbm'</span></code><code class="docutils literal"><span class="pre">'dbm.gnu'</span></code></span></p></dd></dl><dl class="function"><dt id="dbm.open"><span class="yiyi-st" id="yiyi-20"> <code class="descclassname">dbm.</code><code class="descname">open</code><span class="sig-paren">(</span><em>file</em>, <em>flag='r'</em>, <em>mode=0o666</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-21">打开数据库文件<em>文件</em>并返回相应的对象。</span></p><p><span class="yiyi-st" id="yiyi-22">如果数据库文件已经存在,则<a class="reference internal" href="#dbm.whichdb" title="dbm.whichdb"><code class="xref py py-func docutils literal"><span class="pre">whichdb()</span></code></a>函数用于确定其类型,并使用适当的模块;如果不存在,则使用上面列出的可以导入的第一个模块。</span></p><p><span class="yiyi-st" id="yiyi-23">可选的<em>flag</em>参数可以是:</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-24"></span></th><th class="head"><span class="yiyi-st" id="yiyi-25">含义</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-26"><code class="docutils literal"><span class="pre">'r'</span></code></span></td><td><span class="yiyi-st" id="yiyi-27">打开现有数据库以进行只读(默认)</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-28"><code class="docutils literal"><span class="pre">'w'</span></code></span></td><td><span class="yiyi-st" id="yiyi-29">打开现有数据库进行读写</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-30"><code class="docutils literal"><span class="pre">'c'</span></code></span></td><td><span class="yiyi-st" id="yiyi-31">打开用于读取和写入的数据库,如果不存在则创建它</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-32"><code class="docutils literal"><span class="pre">'n'</span></code></span></td><td><span class="yiyi-st" id="yiyi-33">始终创建一个新的空数据库,打开进行读取和写入</span></td></tr></tbody></table><p><span class="yiyi-st" id="yiyi-34">可选的<em>mode</em>参数是文件的Unix模式仅在必须创建数据库时使用。</span><span class="yiyi-st" id="yiyi-35">它默认为八进制<code class="docutils literal"><span class="pre">0o666</span></code>并且将由当前的umask修改</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-36">The object returned by <a class="reference internal" href="#dbm.open" title="dbm.open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a> supports the same basic functionality as dictionaries; keys and their corresponding values can be stored, retrieved, and deleted, and the <a class="reference internal" href="../reference/expressions.html#in"><code class="xref std std-keyword docutils literal"><span class="pre">in</span></code></a> operator and the <code class="xref py py-meth docutils literal"><span class="pre">keys()</span></code> method are available, as well as <code class="xref py py-meth docutils literal"><span class="pre">get()</span></code> and <code class="xref py py-meth docutils literal"><span class="pre">setdefault()</span></code>.</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-37"><span class="versionmodified">在版本3.2中更改:</span> <code class="xref py py-meth docutils literal"><span class="pre">get()</span></code><code class="xref py py-meth docutils literal"><span class="pre">setdefault()</span></code>现在可在所有数据库模块中使用。</span></p></div><p><span class="yiyi-st" id="yiyi-38">键和值始终以字节存储。</span><span class="yiyi-st" id="yiyi-39">这意味着,当使用字符串时,它们在被存储之前被隐式地转换为默认编码。</span></p><p><span class="yiyi-st" id="yiyi-40">这些对象也支持在<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal"><span class="pre">with</span></code></a>语句中使用,在完成后会自动关闭它们。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-41"><span class="versionmodified">在版本3.4中已更改:</span>向由<a class="reference internal" href="#dbm.open" title="dbm.open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>返回的对象添加了上下文管理协议的本机支持。</span></p></div><p><span class="yiyi-st" id="yiyi-42">以下示例记录一些主机名和相应的标题,然后打印出数据库的内容:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">dbm</span>
<span class="c1"># Open database, creating it if necessary.</span>
<span class="k">with</span> <span class="n">dbm</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">'cache'</span><span class="p">,</span> <span class="s1">'c'</span><span class="p">)</span> <span class="k">as</span> <span class="n">db</span><span class="p">:</span>
<span class="c1"># Record some values</span>
<span class="n">db</span><span class="p">[</span><span class="n">b</span><span class="s1">'hello'</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span><span class="s1">'there'</span>
<span class="n">db</span><span class="p">[</span><span class="s1">'www.python.org'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Python Website'</span>
<span class="n">db</span><span class="p">[</span><span class="s1">'www.cnn.com'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Cable News Network'</span>
<span class="c1"># Note that the keys are considered bytes now.</span>
<span class="k">assert</span> <span class="n">db</span><span class="p">[</span><span class="n">b</span><span class="s1">'www.python.org'</span><span class="p">]</span> <span class="o">==</span> <span class="n">b</span><span class="s1">'Python Website'</span>
<span class="c1"># Notice how the value is now in bytes.</span>
<span class="k">assert</span> <span class="n">db</span><span class="p">[</span><span class="s1">'www.cnn.com'</span><span class="p">]</span> <span class="o">==</span> <span class="n">b</span><span class="s1">'Cable News Network'</span>
<span class="c1"># Often-used methods of the dict interface work too.</span>
<span class="nb">print</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'python.org'</span><span class="p">,</span> <span class="n">b</span><span class="s1">'not present'</span><span class="p">))</span>
<span class="c1"># Storing a non-string key or value will raise an exception (most</span>
<span class="c1"># likely a TypeError).</span>
<span class="n">db</span><span class="p">[</span><span class="s1">'www.yahoo.com'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">4</span>
<span class="c1"># db is automatically closed when leaving the with statement.</span>
</code></pre><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-43">也可以看看</span></p><dl class="last docutils"><dt><span class="yiyi-st" id="yiyi-44">模块<a class="reference internal" href="shelve.html#module-shelve" title="shelve: Python object persistence."><code class="xref py py-mod docutils literal"><span class="pre">shelve</span></code></a></span></dt><dd><span class="yiyi-st" id="yiyi-45">持久性模块存储非字符串数据。</span></dd></dl></div><p><span class="yiyi-st" id="yiyi-46">各个子模块将在以下部分中介绍。</span></p><div class="section" id="module-dbm.gnu"><h2><span class="yiyi-st" id="yiyi-47">12.5.1. <a class="reference internal" href="#module-dbm.gnu" title="dbm.gnu: GNU's reinterpretation of dbm. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">dbm.gnu</span></code></a> - GNU对dbm的重新解释</span></h2><p><span class="yiyi-st" id="yiyi-48"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/dbm/gnu.py">Lib/dbm/gnu.py</a></span></p><p><span class="yiyi-st" id="yiyi-49">此模块与<a class="reference internal" href="#module-dbm" title='dbm: Interfaces to various Unix "database" formats.'><code class="xref py py-mod docutils literal"><span class="pre">dbm</span></code></a>模块非常相似但使用GNU库<code class="docutils literal"><span class="pre">gdbm</span></code>来提供一些其他功能。</span><span class="yiyi-st" id="yiyi-50">请注意,由<a class="reference internal" href="#module-dbm.gnu" title="dbm.gnu: GNU's reinterpretation of dbm. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">dbm.gnu</span></code></a><a class="reference internal" href="#module-dbm.ndbm" title='dbm.ndbm: The standard "database" interface, based on ndbm. (Unix)'><code class="xref py py-mod docutils literal"><span class="pre">dbm.ndbm</span></code></a>创建的文件格式不兼容。</span></p><p><span class="yiyi-st" id="yiyi-51"><a class="reference internal" href="#module-dbm.gnu" title="dbm.gnu: GNU's reinterpretation of dbm. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">dbm.gnu</span></code></a>模块提供了一个到GNU DBM库的接口。</span><span class="yiyi-st" id="yiyi-52"><code class="docutils literal"><span class="pre">dbm.gnu.gdbm</span></code>对象的行为类似于映射(字典),除非键和值在存储之前始终转换为字节。</span><span class="yiyi-st" id="yiyi-53">打印<code class="docutils literal"><span class="pre">gdbm</span></code>对象不会打印键和值,并且不支持<code class="xref py py-meth docutils literal"><span class="pre">items()</span></code><code class="xref py py-meth docutils literal"><span class="pre">values()</span></code>方法。</span></p><dl class="exception"><dt id="dbm.gnu.error"><span class="yiyi-st" id="yiyi-54"> <em class="property">exception </em><code class="descclassname">dbm.gnu.</code><code class="descname">error</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-55"><a class="reference internal" href="#module-dbm.gnu" title="dbm.gnu: GNU's reinterpretation of dbm. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">dbm.gnu</span></code></a>上出现的特定错误例如I / O错误。</span><span class="yiyi-st" id="yiyi-56"><a class="reference internal" href="exceptions.html#KeyError" title="KeyError"><code class="xref py py-exc docutils literal"><span class="pre">KeyError</span></code></a>针对一般映射错误(例如指定不正确的键)引发。</span></p></dd></dl><dl class="function"><dt id="dbm.gnu.open"><span class="yiyi-st" id="yiyi-57"> <code class="descclassname">dbm.gnu.</code><code class="descname">open</code><span class="sig-paren">(</span><em>filename</em><span class="optional">[</span>, <em>flag</em><span class="optional">[</span>, <em>mode</em><span class="optional">]</span><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-58">打开<code class="docutils literal"><span class="pre">gdbm</span></code>数据库并返回一个<code class="xref py py-class docutils literal"><span class="pre">gdbm</span></code>对象。</span><span class="yiyi-st" id="yiyi-59"><em>filename</em>参数是数据库文件的名称。</span></p><p><span class="yiyi-st" id="yiyi-60">可选的<em>标志</em>参数可以是:</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-61"></span></th><th class="head"><span class="yiyi-st" id="yiyi-62">含义</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-63"><code class="docutils literal"><span class="pre">'r'</span></code></span></td><td><span class="yiyi-st" id="yiyi-64">打开现有数据库以进行只读(默认)</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-65"><code class="docutils literal"><span class="pre">'w'</span></code></span></td><td><span class="yiyi-st" id="yiyi-66">打开现有数据库进行读写</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-67"><code class="docutils literal"><span class="pre">'c'</span></code></span></td><td><span class="yiyi-st" id="yiyi-68">打开用于读取和写入的数据库,如果不存在则创建它</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-69"><code class="docutils literal"><span class="pre">'n'</span></code></span></td><td><span class="yiyi-st" id="yiyi-70">始终创建一个新的空数据库,打开进行读取和写入</span></td></tr></tbody></table><p><span class="yiyi-st" id="yiyi-71">可以将以下附加字符附加到标志以控制数据库的打开方式:</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-72"></span></th><th class="head"><span class="yiyi-st" id="yiyi-73">含义</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-74"><code class="docutils literal"><span class="pre">'f'</span></code></span></td><td><span class="yiyi-st" id="yiyi-75">以快速模式打开数据库。</span><span class="yiyi-st" id="yiyi-76">对数据库的写入将不同步。</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-77"><code class="docutils literal"><span class="pre">'s'</span></code></span></td><td><span class="yiyi-st" id="yiyi-78">同步模式。</span><span class="yiyi-st" id="yiyi-79">这将导致对数据库的更改立即写入文件。</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-80"><code class="docutils literal"><span class="pre">'u'</span></code></span></td><td><span class="yiyi-st" id="yiyi-81">不要锁定数据库。</span></td></tr></tbody></table><p><span class="yiyi-st" id="yiyi-82">并非所有标志对<code class="docutils literal"><span class="pre">gdbm</span></code>的所有版本有效。</span><span class="yiyi-st" id="yiyi-83">模块常量<code class="xref py py-const docutils literal"><span class="pre">open_flags</span></code>是一个支持的标志字符串。</span><span class="yiyi-st" id="yiyi-84">如果指定了无效标志,则会引发异常<a class="reference internal" href="#dbm.gnu.error" title="dbm.gnu.error"><code class="xref py py-exc docutils literal"><span class="pre">error</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-85">可选的<em>模式</em>参数是文件的Unix模式仅在必须创建数据库时使用。</span><span class="yiyi-st" id="yiyi-86">它默认为八进制<code class="docutils literal"><span class="pre">0o666</span></code></span></p><p><span class="yiyi-st" id="yiyi-87">除了类似字典的方法,<code class="docutils literal"><span class="pre">gdbm</span></code>对象有以下方法:</span></p><dl class="method"><dt id="dbm.gnu.gdbm.firstkey"><span class="yiyi-st" id="yiyi-88"> <code class="descclassname">gdbm.</code><code class="descname">firstkey</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-89">可以使用此方法和<a class="reference internal" href="#dbm.gnu.gdbm.nextkey" title="dbm.gnu.gdbm.nextkey"><code class="xref py py-meth docutils literal"><span class="pre">nextkey()</span></code></a>方法循环数据库中的每个键。</span><span class="yiyi-st" id="yiyi-90">遍历按<code class="docutils literal"><span class="pre">gdbm</span></code>的内部散列值排序,并且不会按键值排序。</span><span class="yiyi-st" id="yiyi-91">此方法返回开始键。</span></p></dd></dl><dl class="method"><dt id="dbm.gnu.gdbm.nextkey"><span class="yiyi-st" id="yiyi-92"> <code class="descclassname">gdbm.</code><code class="descname">nextkey</code><span class="sig-paren">(</span><em>key</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-93">返回遍历中<em></em>后面的键。</span><span class="yiyi-st" id="yiyi-94">以下代码打印数据库中的每个键<code class="docutils literal"><span class="pre">db</span></code>,而不必在包含它们的内存中创建一个列表:</span></p><pre><code class="language-python"><span></span><span class="n">k</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">firstkey</span><span class="p">()</span>
<span class="k">while</span> <span class="n">k</span> <span class="o">!=</span> <span class="kc">None</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">k</span><span class="p">)</span>
<span class="n">k</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">nextkey</span><span class="p">(</span><span class="n">k</span><span class="p">)</span>
</code></pre></dd></dl><dl class="method"><dt id="dbm.gnu.gdbm.reorganize"><span class="yiyi-st" id="yiyi-95"> <code class="descclassname">gdbm.</code><code class="descname">reorganize</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-96">如果您执行了大量删除并希望缩小<code class="docutils literal"><span class="pre">gdbm</span></code>文件使用的空间,此例程将重组数据库。</span><span class="yiyi-st" id="yiyi-97"><code class="docutils literal"><span class="pre">gdbm</span></code>对象不会缩短数据库文件的长度,除非使用此重组;否则,删除的文件空间将被保留并作为新(键,值)对添加重新使用。</span></p></dd></dl><dl class="method"><dt id="dbm.gnu.gdbm.sync"><span class="yiyi-st" id="yiyi-98"> <code class="descclassname">gdbm.</code><code class="descname">sync</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-99">当数据库以快速模式打开时,此方法强制任何未写入的数据写入磁盘。</span></p></dd></dl><dl class="method"><dt id="dbm.gnu.gdbm.close"><span class="yiyi-st" id="yiyi-100"> <code class="descclassname">gdbm.</code><code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-101">关闭<code class="docutils literal"><span class="pre">gdbm</span></code>数据库。</span></p></dd></dl></dd></dl></div><div class="section" id="module-dbm.ndbm"><h2><span class="yiyi-st" id="yiyi-102">12.5.2. <a class="reference internal" href="#module-dbm.ndbm" title='dbm.ndbm: The standard "database" interface, based on ndbm. (Unix)'><code class="xref py py-mod docutils literal"><span class="pre">dbm.ndbm</span></code></a> - 基于ndbm的接口 </span></h2><p><span class="yiyi-st" id="yiyi-103"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/dbm/ndbm.py">Lib/dbm/ndbm.py</a></span></p><p><span class="yiyi-st" id="yiyi-104"><a class="reference internal" href="#module-dbm.ndbm" title='dbm.ndbm: The standard "database" interface, based on ndbm. (Unix)'><code class="xref py py-mod docutils literal"><span class="pre">dbm.ndbm</span></code></a>模块提供了一个到Unix“ndbm”库的接口。</span><span class="yiyi-st" id="yiyi-105">Dbm对象的行为像映射字典除了键和值总是存储为字节。</span><span class="yiyi-st" id="yiyi-106">打印<code class="docutils literal"><span class="pre">dbm</span></code>对象不会打印键和值,并且不支持<code class="xref py py-meth docutils literal"><span class="pre">items()</span></code><code class="xref py py-meth docutils literal"><span class="pre">values()</span></code>方法。</span></p><p><span class="yiyi-st" id="yiyi-107">此模块可以与“经典”ndbm接口或GNU GDBM兼容性接口一起使用。</span><span class="yiyi-st" id="yiyi-108">在Unix上<strong class="program">configure</strong>脚本将尝试定位相应的头文件以简化构建此模块。</span></p><dl class="exception"><dt id="dbm.ndbm.error"><span class="yiyi-st" id="yiyi-109"> <em class="property">exception </em><code class="descclassname">dbm.ndbm.</code><code class="descname">error</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-110"><a class="reference internal" href="#module-dbm.ndbm" title='dbm.ndbm: The standard "database" interface, based on ndbm. (Unix)'><code class="xref py py-mod docutils literal"><span class="pre">dbm.ndbm</span></code></a>上引发的特定错误例如I / O错误。</span><span class="yiyi-st" id="yiyi-111"><a class="reference internal" href="exceptions.html#KeyError" title="KeyError"><code class="xref py py-exc docutils literal"><span class="pre">KeyError</span></code></a>针对一般映射错误(例如指定不正确的键)引发。</span></p></dd></dl><dl class="data"><dt id="dbm.ndbm.library"><span class="yiyi-st" id="yiyi-112"> <code class="descclassname">dbm.ndbm.</code><code class="descname">library</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-113">使用的<code class="docutils literal"><span class="pre">ndbm</span></code>实施库的名称。</span></p></dd></dl><dl class="function"><dt id="dbm.ndbm.open"><span class="yiyi-st" id="yiyi-114"> <code class="descclassname">dbm.ndbm.</code><code class="descname">open</code><span class="sig-paren">(</span><em>filename</em><span class="optional">[</span>, <em>flag</em><span class="optional">[</span>, <em>mode</em><span class="optional">]</span><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-115">打开dbm数据库并返回<code class="docutils literal"><span class="pre">ndbm</span></code>对象。</span><span class="yiyi-st" id="yiyi-116"><em>filename</em>参数是数据库文件的名称(不含<code class="file docutils literal"><span class="pre">.dir</span></code><code class="file docutils literal"><span class="pre">.pag</span></code>扩展名)。</span></p><p><span class="yiyi-st" id="yiyi-117">可选的<em>标志</em>参数必须是以下值之一:</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-118"></span></th><th class="head"><span class="yiyi-st" id="yiyi-119">含义</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-120"><code class="docutils literal"><span class="pre">'r'</span></code></span></td><td><span class="yiyi-st" id="yiyi-121">打开现有数据库以进行只读(默认)</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-122"><code class="docutils literal"><span class="pre">'w'</span></code></span></td><td><span class="yiyi-st" id="yiyi-123">打开现有数据库进行读写</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-124"><code class="docutils literal"><span class="pre">'c'</span></code></span></td><td><span class="yiyi-st" id="yiyi-125">打开用于读取和写入的数据库,如果不存在则创建它</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-126"><code class="docutils literal"><span class="pre">'n'</span></code></span></td><td><span class="yiyi-st" id="yiyi-127">始终创建一个新的空数据库,打开进行读取和写入</span></td></tr></tbody></table><p><span class="yiyi-st" id="yiyi-128">可选的<em>模式</em>参数是文件的Unix模式仅在必须创建数据库时使用。</span><span class="yiyi-st" id="yiyi-129">它默认为八进制<code class="docutils literal"><span class="pre">0o666</span></code>并且将由当前的umask修改</span></p><p><span class="yiyi-st" id="yiyi-130">除了类似字典的方法之外,<code class="docutils literal"><span class="pre">ndbm</span></code>对象还提供以下方法:</span></p><dl class="method"><dt id="dbm.ndbm.ndbm.close"><span class="yiyi-st" id="yiyi-131"> <code class="descclassname">ndbm.</code><code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-132">关闭<code class="docutils literal"><span class="pre">ndbm</span></code>数据库。</span></p></dd></dl></dd></dl></div><div class="section" id="module-dbm.dumb"><h2><span class="yiyi-st" id="yiyi-133">12.5.3. <a class="reference internal" href="#module-dbm.dumb" title="dbm.dumb: Portable implementation of the simple DBM interface."><code class="xref py py-mod docutils literal"><span class="pre">dbm.dumb</span></code></a> - 便携式DBM实施</span></h2><p><span class="yiyi-st" id="yiyi-134"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/dbm/dumb.py">Lib/dbm/dumb.py</a></span></p><div class="admonition note" id="index-0"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-135">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-136">当更健壮的模块不可用时,<a class="reference internal" href="#module-dbm.dumb" title="dbm.dumb: Portable implementation of the simple DBM interface."><code class="xref py py-mod docutils literal"><span class="pre">dbm.dumb</span></code></a>模块用作<a class="reference internal" href="#module-dbm" title='dbm: Interfaces to various Unix "database" formats.'><code class="xref py py-mod docutils literal"><span class="pre">dbm</span></code></a>模块的最后手段。</span><span class="yiyi-st" id="yiyi-137"><a class="reference internal" href="#module-dbm.dumb" title="dbm.dumb: Portable implementation of the simple DBM interface."><code class="xref py py-mod docutils literal"><span class="pre">dbm.dumb</span></code></a>模块不是为了速度而编写的,并且不像其他数据库模块那么频繁。</span></p></div><p><span class="yiyi-st" id="yiyi-138"><a class="reference internal" href="#module-dbm.dumb" title="dbm.dumb: Portable implementation of the simple DBM interface."><code class="xref py py-mod docutils literal"><span class="pre">dbm.dumb</span></code></a>模块提供了一个持久的类字典接口它完全用Python编写。</span><span class="yiyi-st" id="yiyi-139">与其他模块(例如<a class="reference internal" href="#module-dbm.gnu" title="dbm.gnu: GNU's reinterpretation of dbm. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">dbm.gnu</span></code></a>)不同,不需要外部库。</span><span class="yiyi-st" id="yiyi-140">与其他持久性映射一样,键和值始终以字节存储。</span></p><p><span class="yiyi-st" id="yiyi-141">模块定义如下:</span></p><dl class="exception"><dt id="dbm.dumb.error"><span class="yiyi-st" id="yiyi-142"> <em class="property">exception </em><code class="descclassname">dbm.dumb.</code><code class="descname">error</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-143"><a class="reference internal" href="#module-dbm.dumb" title="dbm.dumb: Portable implementation of the simple DBM interface."><code class="xref py py-mod docutils literal"><span class="pre">dbm.dumb</span></code></a>上出现的特定错误例如I / O错误。</span><span class="yiyi-st" id="yiyi-144"><a class="reference internal" href="exceptions.html#KeyError" title="KeyError"><code class="xref py py-exc docutils literal"><span class="pre">KeyError</span></code></a>针对一般映射错误(例如指定不正确的键)引发。</span></p></dd></dl><dl class="function"><dt id="dbm.dumb.open"><span class="yiyi-st" id="yiyi-145"> <code class="descclassname">dbm.dumb.</code><code class="descname">open</code><span class="sig-paren">(</span><em>filename</em><span class="optional">[</span>, <em>flag</em><span class="optional">[</span>, <em>mode</em><span class="optional">]</span><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-146">打开<code class="docutils literal"><span class="pre">dumbdbm</span></code>数据库并返回dumbdbm对象。</span><span class="yiyi-st" id="yiyi-147"><em>filename</em>参数是数据库文件的基本名称(没有任何特定的扩展名)。</span><span class="yiyi-st" id="yiyi-148">当创建dumbdbm数据库时将创建具有<code class="file docutils literal"><span class="pre">.dat</span></code><code class="file docutils literal"><span class="pre">.dir</span></code>扩展名的文件。</span></p><p><span class="yiyi-st" id="yiyi-149">可选的<em>标志</em>参数仅支持<code class="docutils literal"><span class="pre">'c'</span></code><code class="docutils literal"><span class="pre">'n'</span></code>值的语义。</span><span class="yiyi-st" id="yiyi-150">其他值将默认为始终为更新打开的数据库,如果不存在则将创建。</span></p><p><span class="yiyi-st" id="yiyi-151">可选的<em>模式</em>参数是文件的Unix模式仅在必须创建数据库时使用。</span><span class="yiyi-st" id="yiyi-152">它默认为八进制<code class="docutils literal"><span class="pre">0o666</span></code>并且将由当前的umask修改</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-153"><span class="versionmodified">在版本3.5中更改:</span> <a class="reference internal" href="#dbm.dumb.open" title="dbm.dumb.open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>在标志值为<code class="docutils literal"><span class="pre">'n'</span></code>时始终创建一个新数据库。</span></p></div><p><span class="yiyi-st" id="yiyi-154">除了<a class="reference internal" href="collections.abc.html#collections.abc.MutableMapping" title="collections.abc.MutableMapping"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.MutableMapping</span></code></a>类提供的方法,<code class="xref py py-class docutils literal"><span class="pre">dumbdbm</span></code>对象提供以下方法:</span></p><dl class="method"><dt id="dbm.dumb.dumbdbm.sync"><span class="yiyi-st" id="yiyi-155"> <code class="descclassname">dumbdbm.</code><code class="descname">sync</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-156">同步磁盘目录和数据文件。</span><span class="yiyi-st" id="yiyi-157">此方法由<code class="xref py py-meth docutils literal"><span class="pre">Shelve.sync()</span></code>方法调用。</span></p></dd></dl><dl class="method"><dt id="dbm.dumb.dumbdbm.close"><span class="yiyi-st" id="yiyi-158"> <code class="descclassname">dumbdbm.</code><code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-159">关闭<code class="docutils literal"><span class="pre">dumbdbm</span></code>数据库。</span></p></dd></dl></dd></dl></div></div></div>