uTools-Manuals/docs/python/plistlib.html
2019-04-21 11:50:48 +08:00

21 lines
23 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

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-plistlib"><h1><span class="yiyi-st" id="yiyi-10">14.5. <a class="reference internal" href="#module-plistlib" title="plistlib: Generate and parse Mac OS X plist files."><code class="xref py py-mod docutils literal"><span class="pre">plistlib</span></code></a> - 生成并解析Mac OS X <code class="docutils literal"><span class="pre">.plist</span></code>文件</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/plistlib.py">Lib / plistlib.py</a></span></p><p><span class="yiyi-st" id="yiyi-12">此模块提供了一个用于读取和写入主要由Mac OS X使用的“属性列表”文件的接口并支持二进制和XML plist文件。</span></p><p><span class="yiyi-st" id="yiyi-13">属性列表(<code class="docutils literal"><span class="pre">.plist</span></code>)文件格式是一个简单的序列化,支持基本的对象类型,如字典,列表,数字和字符串。</span><span class="yiyi-st" id="yiyi-14">通常顶层对象是字典。</span></p><p><span class="yiyi-st" id="yiyi-15">要写出和解析plist文件请使用<a class="reference internal" href="#plistlib.dump" title="plistlib.dump"><code class="xref py py-func docutils literal"><span class="pre">dump()</span></code></a><a class="reference internal" href="#plistlib.load" title="plistlib.load"><code class="xref py py-func docutils literal"><span class="pre">load()</span></code></a>函数。</span></p><p><span class="yiyi-st" id="yiyi-16">要使用字节对象中的plist数据请使用<a class="reference internal" href="#plistlib.dumps" title="plistlib.dumps"><code class="xref py py-func docutils literal"><span class="pre">dumps()</span></code></a><a class="reference internal" href="#plistlib.loads" title="plistlib.loads"><code class="xref py py-func docutils literal"><span class="pre">loads()</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-17">值可以是字符串,整数,浮点数,布尔值,元组,列表,字典(但只有字符串键),<a class="reference internal" href="#plistlib.Data" title="plistlib.Data"><code class="xref py py-class docutils literal"><span class="pre">Data</span></code></a><a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a><code class="xref py py-class docutils literal"><span class="pre">bytesarray</span></code><a class="reference internal" href="datetime.html#datetime.datetime" title="datetime.datetime"><code class="xref py py-class docutils literal"><span class="pre">datetime.datetime</span></code></a>对象。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-18"><span class="versionmodified">在版本3.4中已更改:</span>新的API旧的API已弃用。</span><span class="yiyi-st" id="yiyi-19">支持二进制格式plists添加。</span></p></div><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-20">也可以看看</span></p><dl class="last docutils"><dt><span class="yiyi-st" id="yiyi-21"><a class="reference external" href="https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/plist.5.html">PList手册页</a></span></dt><dd><span class="yiyi-st" id="yiyi-22">苹果的文件格式文件。</span></dd></dl></div><p><span class="yiyi-st" id="yiyi-23">该模块定义了以下功能:</span></p><dl class="function"><dt id="plistlib.load"><span class="yiyi-st" id="yiyi-24"> <code class="descclassname">plistlib.</code><code class="descname">load</code><span class="sig-paren">(</span><em>fp</em>, <em>*</em>, <em>fmt=None</em>, <em>use_builtin_types=True</em>, <em>dict_type=dict</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-25">读取plist文件。</span><span class="yiyi-st" id="yiyi-26"><em>fp</em>应该是一个可读的二进制文件对象。</span><span class="yiyi-st" id="yiyi-27">返回解包的根对象(通常是字典)。</span></p><p><span class="yiyi-st" id="yiyi-28"><em>fmt</em>是文件的格式,以下值有效:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-29"><a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-data docutils literal"><span class="pre">None</span></code></a>:自动检测文件格式</span></li><li><span class="yiyi-st" id="yiyi-30"><a class="reference internal" href="#plistlib.FMT_XML" title="plistlib.FMT_XML"><code class="xref py py-data docutils literal"><span class="pre">FMT_XML</span></code></a>XML文件格式</span></li><li><span class="yiyi-st" id="yiyi-31"><a class="reference internal" href="#plistlib.FMT_BINARY" title="plistlib.FMT_BINARY"><code class="xref py py-data docutils literal"><span class="pre">FMT_BINARY</span></code></a>二进制plist格式</span></li></ul><p><span class="yiyi-st" id="yiyi-32">如果<em>use_builtin_types</em>为true默认值二进制数据将作为<a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a>的实例返回,否则返回为<a class="reference internal" href="#plistlib.Data" title="plistlib.Data"><code class="xref py py-class docutils literal"><span class="pre">Data</span></code></a>的实例。</span></p><p><span class="yiyi-st" id="yiyi-33"><em>dict_type</em>是用于从plist文件读取的字典的类型。</span><span class="yiyi-st" id="yiyi-34">plist的确切结构可以通过使用<a class="reference internal" href="collections.html#collections.OrderedDict" title="collections.OrderedDict"><code class="xref py py-class docutils literal"><span class="pre">collections.OrderedDict</span></code></a>虽然键的顺序在plist文件中不重要来恢复。</span></p><p><span class="yiyi-st" id="yiyi-35"><a class="reference internal" href="#plistlib.FMT_XML" title="plistlib.FMT_XML"><code class="xref py py-data docutils literal"><span class="pre">FMT_XML</span></code></a>格式的XML数据使用<a class="reference internal" href="pyexpat.html#module-xml.parsers.expat" title="xml.parsers.expat: An interface to the Expat non-validating XML parser."><code class="xref py py-mod docutils literal"><span class="pre">xml.parsers.expat</span></code></a>中的Expat解析器解析 - 请参阅其文档了解可能的异常XML格式的异常。</span><span class="yiyi-st" id="yiyi-36">未知的元素将被plist解析器简单地忽略。</span></p><p><span class="yiyi-st" id="yiyi-37">当文件无法解析时,二进制格式的解析器引发<code class="xref py py-exc docutils literal"><span class="pre">InvalidFileException</span></code></span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-38"><span class="versionmodified">版本3.4中的新功能。</span></span></p></div></dd></dl><dl class="function"><dt id="plistlib.loads"><span class="yiyi-st" id="yiyi-39"> <code class="descclassname">plistlib.</code><code class="descname">loads</code><span class="sig-paren">(</span><em>data</em>, <em>*</em>, <em>fmt=None</em>, <em>use_builtin_types=True</em>, <em>dict_type=dict</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-40">从字节对象加载plist。</span><span class="yiyi-st" id="yiyi-41">有关关键字参数的说明,请参见<a class="reference internal" href="#plistlib.load" title="plistlib.load"><code class="xref py py-func docutils literal"><span class="pre">load()</span></code></a></span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-42"><span class="versionmodified">版本3.4中的新功能。</span></span></p></div></dd></dl><dl class="function"><dt id="plistlib.dump"><span class="yiyi-st" id="yiyi-43"> <code class="descclassname">plistlib.</code><code class="descname">dump</code><span class="sig-paren">(</span><em>value</em>, <em>fp</em>, <em>*</em>, <em>fmt=FMT_XML</em>, <em>sort_keys=True</em>, <em>skipkeys=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-44"><em></em>写入plist文件。</span><span class="yiyi-st" id="yiyi-45"><em>Fp</em>应为可写二进制文件对象。</span></p><p><span class="yiyi-st" id="yiyi-46"><em>fmt</em>参数指定plist文件的格式可以是以下值之一</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-47"><a class="reference internal" href="#plistlib.FMT_XML" title="plistlib.FMT_XML"><code class="xref py py-data docutils literal"><span class="pre">FMT_XML</span></code></a>XML格式化plist文件</span></li><li><span class="yiyi-st" id="yiyi-48"><a class="reference internal" href="#plistlib.FMT_BINARY" title="plistlib.FMT_BINARY"><code class="xref py py-data docutils literal"><span class="pre">FMT_BINARY</span></code></a>二进制格式化plist文件</span></li></ul><p><span class="yiyi-st" id="yiyi-49"><em>sort_keys</em>为true默认值字典的键将以排序顺序写入plist否则它们将以字典的迭代顺序写入。</span></p><p><span class="yiyi-st" id="yiyi-50">当字典的键不是字符串时,当<em>skipkeys</em>为false默认函数引发<a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal"><span class="pre">TypeError</span></code></a>,否则将跳过此类键。</span></p><p><span class="yiyi-st" id="yiyi-51">如果对象是不受支持的类型或包含不受支持类型的对象的容器,则会引发<a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal"><span class="pre">TypeError</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-52">对于不能在二进制plist文件中表示的整数值将会引发<a class="reference internal" href="exceptions.html#OverflowError" title="OverflowError"><code class="xref py py-exc docutils literal"><span class="pre">OverflowError</span></code></a></span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-53"><span class="versionmodified">版本3.4中的新功能。</span></span></p></div></dd></dl><dl class="function"><dt id="plistlib.dumps"><span class="yiyi-st" id="yiyi-54"> <code class="descclassname">plistlib.</code><code class="descname">dumps</code><span class="sig-paren">(</span><em>value</em>, <em>*</em>, <em>fmt=FMT_XML</em>, <em>sort_keys=True</em>, <em>skipkeys=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-55"><em></em>返回为plist格式的字节对象。</span><span class="yiyi-st" id="yiyi-56">有关此函数的关键字参数的说明,请参阅<a class="reference internal" href="#plistlib.dump" title="plistlib.dump"><code class="xref py py-func docutils literal"><span class="pre">dump()</span></code></a>的文档。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-57"><span class="versionmodified">版本3.4中的新功能。</span></span></p></div></dd></dl><p><span class="yiyi-st" id="yiyi-58">以下函数已弃用:</span></p><dl class="function"><dt id="plistlib.readPlist"><span class="yiyi-st" id="yiyi-59"> <code class="descclassname">plistlib.</code><code class="descname">readPlist</code><span class="sig-paren">(</span><em>pathOrFile</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-60">读取plist文件。</span><span class="yiyi-st" id="yiyi-61"><em>pathOrFile</em>可以是文件名或(可读和二进制)文件对象。</span><span class="yiyi-st" id="yiyi-62">返回解包的根对象(通常是字典)。</span></p><p><span class="yiyi-st" id="yiyi-63">此函数调用<a class="reference internal" href="#plistlib.load" title="plistlib.load"><code class="xref py py-func docutils literal"><span class="pre">load()</span></code></a>进行实际工作,有关<a class="reference internal" href="#plistlib.load" title="plistlib.load"><code class="xref py py-func docutils literal"><span class="pre">that</span> <span class="pre">function</span></code></a>关键字参数。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-64">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-65">结果中的Dict值具有延迟到<code class="docutils literal"><span class="pre">__getitem_</span></code><code class="docutils literal"><span class="pre">__getattr__</span></code>方法。</span><span class="yiyi-st" id="yiyi-66">这意味着您可以使用属性访问来访问这些字典的项目。</span></p></div><div class="deprecated"><p><span class="yiyi-st" id="yiyi-67"><span class="versionmodified">自3.4版起已弃用:</span>改用<a class="reference internal" href="#plistlib.load" title="plistlib.load"><code class="xref py py-func docutils literal"><span class="pre">load()</span></code></a></span></p></div></dd></dl><dl class="function"><dt id="plistlib.writePlist"><span class="yiyi-st" id="yiyi-68"> <code class="descclassname">plistlib.</code><code class="descname">writePlist</code><span class="sig-paren">(</span><em>rootObject</em>, <em>pathOrFile</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-69"><em>rootObject</em>写入XML plist文件。</span><span class="yiyi-st" id="yiyi-70"><em>pathOrFile</em>可以是文件名或(可写和二进制)文件对象</span></p><div class="deprecated"><p><span class="yiyi-st" id="yiyi-71"><span class="versionmodified">自3.4版起已弃用:</span>改用<a class="reference internal" href="#plistlib.dump" title="plistlib.dump"><code class="xref py py-func docutils literal"><span class="pre">dump()</span></code></a></span></p></div></dd></dl><dl class="function"><dt id="plistlib.readPlistFromBytes"><span class="yiyi-st" id="yiyi-72"> <code class="descclassname">plistlib.</code><code class="descname">readPlistFromBytes</code><span class="sig-paren">(</span><em>data</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-73">从字节对象读取plist数据。</span><span class="yiyi-st" id="yiyi-74">返回根对象。</span></p><p><span class="yiyi-st" id="yiyi-75">有关关键字参数的说明,请参见<a class="reference internal" href="#plistlib.load" title="plistlib.load"><code class="xref py py-func docutils literal"><span class="pre">load()</span></code></a></span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-76">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-77">结果中的Dict值具有延迟到<code class="docutils literal"><span class="pre">__getitem_</span></code><code class="docutils literal"><span class="pre">__getattr__</span></code>方法。</span><span class="yiyi-st" id="yiyi-78">这意味着您可以使用属性访问来访问这些字典的项目。</span></p></div><div class="deprecated"><p><span class="yiyi-st" id="yiyi-79"><span class="versionmodified">自3.4版起已弃用:</span>改用<a class="reference internal" href="#plistlib.loads" title="plistlib.loads"><code class="xref py py-func docutils literal"><span class="pre">loads()</span></code></a></span></p></div></dd></dl><dl class="function"><dt id="plistlib.writePlistToBytes"><span class="yiyi-st" id="yiyi-80"> <code class="descclassname">plistlib.</code><code class="descname">writePlistToBytes</code><span class="sig-paren">(</span><em>rootObject</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-81">返回<em>rootObject</em>作为XML plist格式的字节对象。</span></p><div class="deprecated"><p><span class="yiyi-st" id="yiyi-82"><span class="versionmodified">自版本3.4后已弃用:</span>改用<a class="reference internal" href="#plistlib.dumps" title="plistlib.dumps"><code class="xref py py-func docutils literal"><span class="pre">dumps()</span></code></a></span></p></div></dd></dl><p><span class="yiyi-st" id="yiyi-83">以下类可用:</span></p><dl class="class"><dt><span class="yiyi-st" id="yiyi-84"><code class="descname">Dict[dict]</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-85">返回与字典<em>dict</em>相同值的扩展映射对象。</span></p><p><span class="yiyi-st" id="yiyi-86">此类是<a class="reference internal" href="stdtypes.html#dict" title="dict"><code class="xref py py-class docutils literal"><span class="pre">dict</span></code></a>的子类,其中属性访问可用于访问项目。</span><span class="yiyi-st" id="yiyi-87">也就是说,<code class="docutils literal"><span class="pre">aDict.key</span></code>与在映射中获取,设置和删除项目的<code class="docutils literal"><span class="pre">aDict['key']</span></code>相同。</span></p><div class="deprecated"><p><span class="yiyi-st" id="yiyi-88"><span class="versionmodified">自3.0版起已弃用。</span></span></p></div></dd></dl><dl class="class"><dt id="plistlib.Data"><span class="yiyi-st" id="yiyi-89"> <em class="property">class </em><code class="descclassname">plistlib.</code><code class="descname">Data</code><span class="sig-paren">(</span><em>data</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-90">返回字节对象<em>数据</em>周围的“数据”包装器对象。</span><span class="yiyi-st" id="yiyi-91">这用在从/到plists转换以表示plist中可用的<code class="docutils literal"><span class="pre">&lt;data&gt;</span></code>类型的函数中。</span></p><p><span class="yiyi-st" id="yiyi-92">它有一个属性,<code class="xref py py-attr docutils literal"><span class="pre">data</span></code>可以用于检索存储在其中的Python字节对象。</span></p><div class="deprecated"><p><span class="yiyi-st" id="yiyi-93"><span class="versionmodified">自版本3.4后已弃用:</span>改用<a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a>物件。</span></p></div></dd></dl><p><span class="yiyi-st" id="yiyi-94">以下常量可用:</span></p><dl class="data"><dt id="plistlib.FMT_XML"><span class="yiyi-st" id="yiyi-95"> <code class="descclassname">plistlib.</code><code class="descname">FMT_XML</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-96">plist文件的XML格式。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-97"><span class="versionmodified">版本3.4中的新功能。</span></span></p></div></dd></dl><dl class="data"><dt id="plistlib.FMT_BINARY"><span class="yiyi-st" id="yiyi-98"> <code class="descclassname">plistlib.</code><code class="descname">FMT_BINARY</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-99">plist文件的二进制格式</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-100"><span class="versionmodified">版本3.4中的新功能。</span></span></p></div></dd></dl><div class="section" id="examples"><h2><span class="yiyi-st" id="yiyi-101">14.5.1. </span><span class="yiyi-st" id="yiyi-102">Examples</span></h2><p><span class="yiyi-st" id="yiyi-103">生成plist</span></p><pre><code class="language-python"><span></span><span class="n">pl</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="n">aString</span> <span class="o">=</span> <span class="s2">"Doodah"</span><span class="p">,</span>
<span class="n">aList</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"A"</span><span class="p">,</span> <span class="s2">"B"</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mf">32.1</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]],</span>
<span class="n">aFloat</span> <span class="o">=</span> <span class="mf">0.1</span><span class="p">,</span>
<span class="n">anInt</span> <span class="o">=</span> <span class="mi">728</span><span class="p">,</span>
<span class="n">aDict</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="n">anotherString</span> <span class="o">=</span> <span class="s2">"&lt;hello &amp; hi there!&gt;"</span><span class="p">,</span>
<span class="n">aThirdString</span> <span class="o">=</span> <span class="s2">"M</span><span class="se">\xe4</span><span class="s2">ssig, Ma</span><span class="se">\xdf</span><span class="s2">"</span><span class="p">,</span>
<span class="n">aTrueValue</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<span class="n">aFalseValue</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
<span class="p">),</span>
<span class="n">someData</span> <span class="o">=</span> <span class="n">b</span><span class="s2">"&lt;binary gunk&gt;"</span><span class="p">,</span>
<span class="n">someMoreData</span> <span class="o">=</span> <span class="n">b</span><span class="s2">"&lt;lots of binary gunk&gt;"</span> <span class="o">*</span> <span class="mi">10</span><span class="p">,</span>
<span class="n">aDate</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">mktime</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">gmtime</span><span class="p">())),</span>
<span class="p">)</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">fileName</span><span class="p">,</span> <span class="s1">'wb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">fp</span><span class="p">:</span>
<span class="n">dump</span><span class="p">(</span><span class="n">pl</span><span class="p">,</span> <span class="n">fp</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-104">解析plist</span></p><pre><code class="language-python"><span></span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">fileName</span><span class="p">,</span> <span class="s1">'rb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">fp</span><span class="p">:</span>
<span class="n">pl</span> <span class="o">=</span> <span class="n">load</span><span class="p">(</span><span class="n">fp</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">pl</span><span class="p">[</span><span class="s2">"aKey"</span><span class="p">])</span>
</code></pre></div></div></div>