mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
28 lines
34 KiB
HTML
28 lines
34 KiB
HTML
<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“(n)dbm”库的接口。</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> |