mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
73 lines
58 KiB
HTML
73 lines
58 KiB
HTML
<div class="body" role="main"><div class="section" id="module-csv"><h1><span class="yiyi-st" id="yiyi-10">14.1. <a class="reference internal" href="#module-csv" title="csv: Write and read tabular data to and from delimited files."><code class="xref py py-mod docutils literal"><span class="pre">csv</span></code></a> - CSV文件读取和写入</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/csv.py">Lib / csv.py</a></span></p><p><span class="yiyi-st" id="yiyi-12">所谓的CSV(Comma Separated Values)格式是电子表格和数据库最常见的导入和导出格式。</span><span class="yiyi-st" id="yiyi-13">在尝试以<span class="target" id="index-1"></span> <a class="rfc reference external" href="https://tools.ietf.org/html/rfc4180.html"><strong>RFC 4180</strong></a>以标准化方式描述格式之前,CSV格式已使用多年。</span><span class="yiyi-st" id="yiyi-14">The lack of a well-defined standard means that subtle differences often exist in the data produced and consumed by different applications.</span><span class="yiyi-st" id="yiyi-15">这些差异可能会让处理来自多个来源的CSV文件烦人。</span><span class="yiyi-st" id="yiyi-16">尽管分隔符和引用字符不同,但是整体格式是足够相似的,以致于可以编写能够有效地操作这样的数据的单个模块,隐藏从编程器读取和写入数据的细节。</span></p><p><span class="yiyi-st" id="yiyi-17"><a class="reference internal" href="#module-csv" title="csv: Write and read tabular data to and from delimited files."><code class="xref py py-mod docutils literal"><span class="pre">csv</span></code></a>模块实现以CSV格式读取和写入表格数据的类。</span><span class="yiyi-st" id="yiyi-18">它允许程序员说,“以Excel首选的格式写入数据”或“从Excel生成的此文件中读取数据”,而不知道Excel使用的CSV格式的确切详细信息。</span><span class="yiyi-st" id="yiyi-19">程序员还可以描述其他应用程序理解的CSV格式,或定义自己的特殊用途CSV格式。</span></p><p><span class="yiyi-st" id="yiyi-20"><a class="reference internal" href="#module-csv" title="csv: Write and read tabular data to and from delimited files."><code class="xref py py-mod docutils literal"><span class="pre">csv</span></code></a>模块的<a class="reference internal" href="#csv.reader" title="csv.reader"><code class="xref py py-class docutils literal"><span class="pre">reader</span></code></a>和<a class="reference internal" href="#csv.writer" title="csv.writer"><code class="xref py py-class docutils literal"><span class="pre">writer</span></code></a>对象读取和写入序列。</span><span class="yiyi-st" id="yiyi-21">程序员还可以使用<a class="reference internal" href="#csv.DictReader" title="csv.DictReader"><code class="xref py py-class docutils literal"><span class="pre">DictReader</span></code></a>和<a class="reference internal" href="#csv.DictWriter" title="csv.DictWriter"><code class="xref py py-class docutils literal"><span class="pre">DictWriter</span></code></a>类以字典形式读取和写入数据。</span></p><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-22">也可以看看</span></p><dl class="last docutils"><dt><span class="yiyi-st" id="yiyi-23"><span class="target" id="index-2"></span> <a class="pep reference external" href="https://www.python.org/dev/peps/pep-0305"><strong>PEP 305</strong></a> - CSV文件API</span></dt><dd><span class="yiyi-st" id="yiyi-24">Python 改善建议书 提出了对Python的添加。</span></dd></dl></div><div class="section" id="module-contents"><h2><span class="yiyi-st" id="yiyi-25">14.1.1. </span><span class="yiyi-st" id="yiyi-26">模块内容</span></h2><p><span class="yiyi-st" id="yiyi-27"><a class="reference internal" href="#module-csv" title="csv: Write and read tabular data to and from delimited files."><code class="xref py py-mod docutils literal"><span class="pre">csv</span></code></a>模块定义以下函数:</span></p><dl class="function"><dt id="csv.reader"><span class="yiyi-st" id="yiyi-28"> <code class="descclassname">csv.</code><code class="descname">reader</code><span class="sig-paren">(</span><em>csvfile</em>, <em>dialect='excel'</em>, <em>**fmtparams</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-29">返回一个读取器对象,它将在给定的<em>csvfile</em>中迭代。</span><span class="yiyi-st" id="yiyi-30"><em>csvfile</em>可以是任何支持<a class="reference internal" href="../glossary.html#term-iterator"><span class="xref std std-term">iterator</span></a>协议的对象,并且每次调用<code class="xref py py-meth docutils literal"><span class="pre">__next__()</span></code>方法时返回一个字符串 - <a class="reference internal" href="../glossary.html#term-file-object"><span class="xref std std-term">file objects</span></a>和列表对象都是合适的。</span><span class="yiyi-st" id="yiyi-31">如果<em>csvfile</em>是文件对象,则应使用<code class="docutils literal"><span class="pre">newline=''</span></code>打开它。</span><span class="yiyi-st" id="yiyi-32"><a class="footnote-reference" href="#id3" id="id1">[1]</a>可以给出一个可选的<em>方言</em>参数,用于定义特定于某个CSV方言的一组参数。</span><span class="yiyi-st" id="yiyi-33">它可以是<a class="reference internal" href="#csv.Dialect" title="csv.Dialect"><code class="xref py py-class docutils literal"><span class="pre">Dialect</span></code></a>类的子类的实例或<a class="reference internal" href="#csv.list_dialects" title="csv.list_dialects"><code class="xref py py-func docutils literal"><span class="pre">list_dialects()</span></code></a>函数返回的字符串之一。</span><span class="yiyi-st" id="yiyi-34">可以给出其他可选的<em>fmtparams</em>关键字参数以覆盖当前方言(方言译为”编码分格“更好)中的各个格式化参数。</span><span class="yiyi-st" id="yiyi-35">有关方言和格式化参数的完整详细信息,请参见<a class="reference internal" href="#csv-fmt-params"><span>Dialects and Formatting Parameters</span></a>一节。</span></p><p><span class="yiyi-st" id="yiyi-36">从csv文件读取的每一行作为字符串列表返回。</span><span class="yiyi-st" id="yiyi-37">除非指定了<code class="docutils literal"><span class="pre">QUOTE_NONNUMERIC</span></code>格式选项(在这种情况下未引用的字段转换为浮点型),否则不会执行自动数据类型转换。</span></p><p><span class="yiyi-st" id="yiyi-38">简短用法示例:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">csv</span>
|
||
<span class="gp">>>> </span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'eggs.csv'</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span> <span class="k">as</span> <span class="n">csvfile</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="n">spamreader</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">reader</span><span class="p">(</span><span class="n">csvfile</span><span class="p">,</span> <span class="n">delimiter</span><span class="o">=</span><span class="s1">' '</span><span class="p">,</span> <span class="n">quotechar</span><span class="o">=</span><span class="s1">'|'</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">spamreader</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">row</span><span class="p">))</span>
|
||
<span class="go">Spam, Spam, Spam, Spam, Spam, Baked Beans</span>
|
||
<span class="go">Spam, Lovely Spam, Wonderful Spam</span>
|
||
</code></pre></dd></dl><dl class="function"><dt id="csv.writer"><span class="yiyi-st" id="yiyi-39"> <code class="descclassname">csv.</code><code class="descname">writer</code><span class="sig-paren">(</span><em>csvfile</em>, <em>dialect='excel'</em>, <em>**fmtparams</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-40">返回一个writer对象,负责将用户的数据转换为给定类文件对象上的分隔字符串。</span><span class="yiyi-st" id="yiyi-41"><em>csvfile</em>可以是具有<code class="xref py py-func docutils literal"><span class="pre">write()</span></code>方法的任何对象。</span><span class="yiyi-st" id="yiyi-42">如果<em>csvfile</em>是文件对象,则应使用<code class="docutils literal"><span class="pre">newline=''</span></code> <a class="footnote-reference" href="#id3" id="id2">[1]</a>打开。</span><span class="yiyi-st" id="yiyi-43">可以给出可选的<em>方言</em>参数,用于定义特定于特定CSV方言的一组参数。</span><span class="yiyi-st" id="yiyi-44">它可以是<a class="reference internal" href="#csv.Dialect" title="csv.Dialect"><code class="xref py py-class docutils literal"><span class="pre">Dialect</span></code></a>类的子类的实例或<a class="reference internal" href="#csv.list_dialects" title="csv.list_dialects"><code class="xref py py-func docutils literal"><span class="pre">list_dialects()</span></code></a>函数返回的字符串之一。</span><span class="yiyi-st" id="yiyi-45">可以给出其他可选的<em>fmtparams</em>关键字参数以覆盖当前方言中的各个格式化参数。</span><span class="yiyi-st" id="yiyi-46">有关方言和格式化参数的完整详细信息,请参见<a class="reference internal" href="#csv-fmt-params"><span>Dialects and Formatting Parameters</span></a>一节。</span><span class="yiyi-st" id="yiyi-47">为了尽可能容易地与实现DB API的模块接口,值<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>被写为空字符串。</span><span class="yiyi-st" id="yiyi-48">虽然这不是可逆转换,但它可以更轻松地将SQL NULL数据值转储到CSV文件,而无需预处理从<code class="docutils literal"><span class="pre">cursor.fetch*</span></code>调用返回的数据。</span><span class="yiyi-st" id="yiyi-49">所有其他非字符串数据在写入之前用<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-func docutils literal"><span class="pre">str()</span></code></a>进行字符串化。</span></p><p><span class="yiyi-st" id="yiyi-50">简短用法示例:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">csv</span>
|
||
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'eggs.csv'</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span> <span class="k">as</span> <span class="n">csvfile</span><span class="p">:</span>
|
||
<span class="n">spamwriter</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">writer</span><span class="p">(</span><span class="n">csvfile</span><span class="p">,</span> <span class="n">delimiter</span><span class="o">=</span><span class="s1">' '</span><span class="p">,</span>
|
||
<span class="n">quotechar</span><span class="o">=</span><span class="s1">'|'</span><span class="p">,</span> <span class="n">quoting</span><span class="o">=</span><span class="n">csv</span><span class="o">.</span><span class="n">QUOTE_MINIMAL</span><span class="p">)</span>
|
||
<span class="n">spamwriter</span><span class="o">.</span><span class="n">writerow</span><span class="p">([</span><span class="s1">'Spam'</span><span class="p">]</span> <span class="o">*</span> <span class="mi">5</span> <span class="o">+</span> <span class="p">[</span><span class="s1">'Baked Beans'</span><span class="p">])</span>
|
||
<span class="n">spamwriter</span><span class="o">.</span><span class="n">writerow</span><span class="p">([</span><span class="s1">'Spam'</span><span class="p">,</span> <span class="s1">'Lovely Spam'</span><span class="p">,</span> <span class="s1">'Wonderful Spam'</span><span class="p">])</span>
|
||
</code></pre></dd></dl><dl class="function"><dt id="csv.register_dialect"><span class="yiyi-st" id="yiyi-51"> <code class="descclassname">csv.</code><code class="descname">register_dialect</code><span class="sig-paren">(</span><em>name</em><span class="optional">[</span>, <em>dialect</em><span class="optional">[</span>, <em>**fmtparams</em><span class="optional">]</span><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-52">将<em>方言</em>与<em>名称</em>相关联。</span><span class="yiyi-st" id="yiyi-53"><em>名称</em>必须是字符串。</span><span class="yiyi-st" id="yiyi-54">方言可以通过传递<a class="reference internal" href="#csv.Dialect" title="csv.Dialect"><code class="xref py py-class docutils literal"><span class="pre">Dialect</span></code></a>的子类或<em>fmtparams</em>关键字参数或两者来指定,其中关键字参数覆盖方言的参数。</span><span class="yiyi-st" id="yiyi-55">有关方言和格式化参数的完整详细信息,请参见<a class="reference internal" href="#csv-fmt-params"><span>Dialects and Formatting Parameters</span></a>一节。</span></p></dd></dl><dl class="function"><dt id="csv.unregister_dialect"><span class="yiyi-st" id="yiyi-56"> <code class="descclassname">csv.</code><code class="descname">unregister_dialect</code><span class="sig-paren">(</span><em>name</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-57">从方言注册表中删除与<em>名称</em>关联的方言。</span><span class="yiyi-st" id="yiyi-58">如果<em>名称</em>不是注册的方言名称,则会引发<a class="reference internal" href="#csv.Error" title="csv.Error"><code class="xref py py-exc docutils literal"><span class="pre">Error</span></code></a>。</span></p></dd></dl><dl class="function"><dt id="csv.get_dialect"><span class="yiyi-st" id="yiyi-59"> <code class="descclassname">csv.</code><code class="descname">get_dialect</code><span class="sig-paren">(</span><em>name</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-60">返回与<em>名称</em>关联的方言。</span><span class="yiyi-st" id="yiyi-61">如果<em>名称</em>不是注册的方言名称,则会引发<a class="reference internal" href="#csv.Error" title="csv.Error"><code class="xref py py-exc docutils literal"><span class="pre">Error</span></code></a>。</span><span class="yiyi-st" id="yiyi-62">此函数返回不可变的<a class="reference internal" href="#csv.Dialect" title="csv.Dialect"><code class="xref py py-class docutils literal"><span class="pre">Dialect</span></code></a>。</span></p></dd></dl><dl class="function"><dt id="csv.list_dialects"><span class="yiyi-st" id="yiyi-63"> <code class="descclassname">csv.</code><code class="descname">list_dialects</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-64">返回所有注册方言的名称。</span></p></dd></dl><dl class="function"><dt id="csv.field_size_limit"><span class="yiyi-st" id="yiyi-65"> <code class="descclassname">csv.</code><code class="descname">field_size_limit</code><span class="sig-paren">(</span><span class="optional">[</span><em>new_limit</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-66">返回解析器允许的当前最大字段大小。</span><span class="yiyi-st" id="yiyi-67">如果给出<em>new_limit</em>,则这将成为新限制。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-68"><a class="reference internal" href="#module-csv" title="csv: Write and read tabular data to and from delimited files."><code class="xref py py-mod docutils literal"><span class="pre">csv</span></code></a>模块定义以下类:</span></p><dl class="class"><dt id="csv.DictReader"><span class="yiyi-st" id="yiyi-69"> <em class="property">class </em><code class="descclassname">csv.</code><code class="descname">DictReader</code><span class="sig-paren">(</span><em>csvfile</em>, <em>fieldnames=None</em>, <em>restkey=None</em>, <em>restval=None</em>, <em>dialect='excel'</em>, <em>*args</em>, <em>**kwds</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-70">创建一个对象,其操作类似于普通读取器,但将读取的信息映射到一个dict中,其中的键由可选的<em>fieldnames</em>参数给出。</span><span class="yiyi-st" id="yiyi-71"><em>fieldnames</em>参数是一个<a class="reference internal" href="collections.abc.html#module-collections.abc" title="collections.abc: Abstract base classes for containers"><code class="xref py py-mod docutils literal"><span class="pre">sequence</span></code></a>,其元素按顺序与输入数据的字段相关联。</span><span class="yiyi-st" id="yiyi-72">这些元素成为结果字典的键。</span><span class="yiyi-st" id="yiyi-73">如果省略<em>fieldnames</em>参数,则<em>csvfile</em>的第一行中的值将用作字段名称。</span><span class="yiyi-st" id="yiyi-74">如果读取的行具有比字段名序列更多的字段,则剩余数据将作为键值为<em>restkey</em>的序列添加。</span><span class="yiyi-st" id="yiyi-75">如果读取的行具有比字段名序列少的字段,则剩余的键使用可选的<em>restval</em>参数的值。</span><span class="yiyi-st" id="yiyi-76">任何其他可选或关键字参数都传递给底层的<a class="reference internal" href="#csv.reader" title="csv.reader"><code class="xref py py-class docutils literal"><span class="pre">reader</span></code></a>实例。</span></p><p><span class="yiyi-st" id="yiyi-77">简短用法示例:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">csv</span>
|
||
<span class="gp">>>> </span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'names.csv'</span><span class="p">)</span> <span class="k">as</span> <span class="n">csvfile</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="n">reader</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">DictReader</span><span class="p">(</span><span class="n">csvfile</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">reader</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="s1">'first_name'</span><span class="p">],</span> <span class="n">row</span><span class="p">[</span><span class="s1">'last_name'</span><span class="p">])</span>
|
||
<span class="gp">...</span>
|
||
<span class="go">Baked Beans</span>
|
||
<span class="go">Lovely Spam</span>
|
||
<span class="go">Wonderful Spam</span>
|
||
</code></pre></dd></dl><dl class="class"><dt id="csv.DictWriter"><span class="yiyi-st" id="yiyi-78"> <em class="property">class </em><code class="descclassname">csv.</code><code class="descname">DictWriter</code><span class="sig-paren">(</span><em>csvfile</em>, <em>fieldnames</em>, <em>restval=''</em>, <em>extrasaction='raise'</em>, <em>dialect='excel'</em>, <em>*args</em>, <em>**kwds</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-79">创建一个操作类似于常规writer的对象,但将字典映射到输出行。</span><span class="yiyi-st" id="yiyi-80"><em>fieldnames</em>参数是一个<a class="reference internal" href="collections.abc.html#module-collections.abc" title="collections.abc: Abstract base classes for containers"><code class="xref py py-mod docutils literal"><span class="pre">sequence</span></code></a>,用于标识传递给<code class="xref py py-meth docutils literal"><span class="pre">writerow()</span></code>方法的字典中的值被写入<em>csvfile</em>。</span><span class="yiyi-st" id="yiyi-81">如果字典在<em>fieldnames</em>中缺少键,则可选的<em>restval</em>参数指定要写入的值。</span><span class="yiyi-st" id="yiyi-82">如果传递给<code class="xref py py-meth docutils literal"><span class="pre">writerow()</span></code>方法的字典包含<em>fieldnames</em>中未找到的键,则可选的<em>extrasaction</em>参数指示要执行的操作。</span><span class="yiyi-st" id="yiyi-83">如果设置为<code class="docutils literal"><span class="pre">'raise'</span></code>,则会引发<a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal"><span class="pre">ValueError</span></code></a>。</span><span class="yiyi-st" id="yiyi-84">如果设置为<code class="docutils literal"><span class="pre">'ignore'</span></code>,则会忽略字典中的额外值。</span><span class="yiyi-st" id="yiyi-85">任何其他可选或关键字参数都传递给底层的<a class="reference internal" href="#csv.writer" title="csv.writer"><code class="xref py py-class docutils literal"><span class="pre">writer</span></code></a>实例。</span></p><p><span class="yiyi-st" id="yiyi-86">请注意,与<a class="reference internal" href="#csv.DictReader" title="csv.DictReader"><code class="xref py py-class docutils literal"><span class="pre">DictReader</span></code></a>类不同,<a class="reference internal" href="#csv.DictWriter" title="csv.DictWriter"><code class="xref py py-class docutils literal"><span class="pre">DictWriter</span></code></a>的<em>fieldnames</em>参数不是可选的。</span><span class="yiyi-st" id="yiyi-87">由于Python的<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>对象没有排序,因此没有足够的信息来推断将该行写入到<em>csvfile</em>的顺序。</span></p><p><span class="yiyi-st" id="yiyi-88">简短用法示例:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">csv</span>
|
||
|
||
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'names.csv'</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">csvfile</span><span class="p">:</span>
|
||
<span class="n">fieldnames</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'first_name'</span><span class="p">,</span> <span class="s1">'last_name'</span><span class="p">]</span>
|
||
<span class="n">writer</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">DictWriter</span><span class="p">(</span><span class="n">csvfile</span><span class="p">,</span> <span class="n">fieldnames</span><span class="o">=</span><span class="n">fieldnames</span><span class="p">)</span>
|
||
|
||
<span class="n">writer</span><span class="o">.</span><span class="n">writeheader</span><span class="p">()</span>
|
||
<span class="n">writer</span><span class="o">.</span><span class="n">writerow</span><span class="p">({</span><span class="s1">'first_name'</span><span class="p">:</span> <span class="s1">'Baked'</span><span class="p">,</span> <span class="s1">'last_name'</span><span class="p">:</span> <span class="s1">'Beans'</span><span class="p">})</span>
|
||
<span class="n">writer</span><span class="o">.</span><span class="n">writerow</span><span class="p">({</span><span class="s1">'first_name'</span><span class="p">:</span> <span class="s1">'Lovely'</span><span class="p">,</span> <span class="s1">'last_name'</span><span class="p">:</span> <span class="s1">'Spam'</span><span class="p">})</span>
|
||
<span class="n">writer</span><span class="o">.</span><span class="n">writerow</span><span class="p">({</span><span class="s1">'first_name'</span><span class="p">:</span> <span class="s1">'Wonderful'</span><span class="p">,</span> <span class="s1">'last_name'</span><span class="p">:</span> <span class="s1">'Spam'</span><span class="p">})</span>
|
||
</code></pre></dd></dl><dl class="class"><dt id="csv.Dialect"><span class="yiyi-st" id="yiyi-89"> <em class="property">class </em><code class="descclassname">csv.</code><code class="descname">Dialect</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-90"><a class="reference internal" href="#csv.Dialect" title="csv.Dialect"><code class="xref py py-class docutils literal"><span class="pre">Dialect</span></code></a>类是主要依赖于其属性的容器类,用于定义特定<a class="reference internal" href="#csv.reader" title="csv.reader"><code class="xref py py-class docutils literal"><span class="pre">reader</span></code></a>或<a class="reference internal" href="#csv.writer" title="csv.writer"><code class="xref py py-class docutils literal"><span class="pre">writer</span></code></a>实例的参数。</span></p></dd></dl><dl class="class"><dt id="csv.excel"><span class="yiyi-st" id="yiyi-91"> <em class="property">class </em><code class="descclassname">csv.</code><code class="descname">excel</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-92"><a class="reference internal" href="#csv.excel" title="csv.excel"><code class="xref py py-class docutils literal"><span class="pre">excel</span></code></a>类定义Excel生成的CSV文件的常用属性。</span><span class="yiyi-st" id="yiyi-93">它用方言名称<code class="docutils literal"><span class="pre">'excel'</span></code>注册。</span></p></dd></dl><dl class="class"><dt id="csv.excel_tab"><span class="yiyi-st" id="yiyi-94"> <em class="property">class </em><code class="descclassname">csv.</code><code class="descname">excel_tab</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-95"><a class="reference internal" href="#csv.excel_tab" title="csv.excel_tab"><code class="xref py py-class docutils literal"><span class="pre">excel_tab</span></code></a>类定义了Excel生成的TAB分隔文件的常用属性。</span><span class="yiyi-st" id="yiyi-96">它用方言名称<code class="docutils literal"><span class="pre">'excel-tab'</span></code>注册。</span></p></dd></dl><dl class="class"><dt id="csv.unix_dialect"><span class="yiyi-st" id="yiyi-97"> <em class="property">class </em><code class="descclassname">csv.</code><code class="descname">unix_dialect</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-98"><a class="reference internal" href="#csv.unix_dialect" title="csv.unix_dialect"><code class="xref py py-class docutils literal"><span class="pre">unix_dialect</span></code></a>类定义在UNIX系统上生成的CSV文件的常用属性,即</span><span class="yiyi-st" id="yiyi-99">使用<code class="docutils literal"><span class="pre">'\n'</span></code>作为行终止符并引用所有字段。</span><span class="yiyi-st" id="yiyi-100">它用方言名称<code class="docutils literal"><span class="pre">'unix'</span></code>注册。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-101"><span class="versionmodified">版本3.2中的新功能。</span></span></p></div></dd></dl><dl class="class"><dt id="csv.Sniffer"><span class="yiyi-st" id="yiyi-102"> <em class="property">class </em><code class="descclassname">csv.</code><code class="descname">Sniffer</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-103"><a class="reference internal" href="#csv.Sniffer" title="csv.Sniffer"><code class="xref py py-class docutils literal"><span class="pre">Sniffer</span></code></a>类用于推导CSV文件的格式。</span></p><p><span class="yiyi-st" id="yiyi-104"><a class="reference internal" href="#csv.Sniffer" title="csv.Sniffer"><code class="xref py py-class docutils literal"><span class="pre">Sniffer</span></code></a>类提供两种方法:</span></p><dl class="method"><dt id="csv.Sniffer.sniff"><span class="yiyi-st" id="yiyi-105"> <code class="descname">sniff</code><span class="sig-paren">(</span><em>sample</em>, <em>delimiters=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-106">分析给定的<em>示例</em>并返回一个反映所找到的参数的<a class="reference internal" href="#csv.Dialect" title="csv.Dialect"><code class="xref py py-class docutils literal"><span class="pre">Dialect</span></code></a>子类。</span><span class="yiyi-st" id="yiyi-107">如果给出了可选的<em>分隔符</em>参数,它将被解释为包含可能的有效分隔符字符的字符串。</span></p></dd></dl><dl class="method"><dt id="csv.Sniffer.has_header"><span class="yiyi-st" id="yiyi-108"> <code class="descname">has_header</code><span class="sig-paren">(</span><em>sample</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-109">分析示例文本(假定为CSV格式),如果第一行显示为一系列列标题,则返回<a class="reference internal" href="constants.html#True" title="True"><code class="xref py py-const docutils literal"><span class="pre">True</span></code></a>。</span></p></dd></dl></dd></dl><p><span class="yiyi-st" id="yiyi-110"><a class="reference internal" href="#csv.Sniffer" title="csv.Sniffer"><code class="xref py py-class docutils literal"><span class="pre">Sniffer</span></code></a>的示例使用:</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="s1">'example.csv'</span><span class="p">)</span> <span class="k">as</span> <span class="n">csvfile</span><span class="p">:</span>
|
||
<span class="n">dialect</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">Sniffer</span><span class="p">()</span><span class="o">.</span><span class="n">sniff</span><span class="p">(</span><span class="n">csvfile</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1024</span><span class="p">))</span>
|
||
<span class="n">csvfile</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="n">reader</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">reader</span><span class="p">(</span><span class="n">csvfile</span><span class="p">,</span> <span class="n">dialect</span><span class="p">)</span>
|
||
<span class="c1"># ... process CSV file contents here ...</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-111"><a class="reference internal" href="#module-csv" title="csv: Write and read tabular data to and from delimited files."><code class="xref py py-mod docutils literal"><span class="pre">csv</span></code></a>模块定义以下常量:</span></p><dl class="data"><dt id="csv.QUOTE_ALL"><span class="yiyi-st" id="yiyi-112"> <code class="descclassname">csv.</code><code class="descname">QUOTE_ALL</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-113">指示<a class="reference internal" href="#csv.writer" title="csv.writer"><code class="xref py py-class docutils literal"><span class="pre">writer</span></code></a>对象引用所有字段。</span></p></dd></dl><dl class="data"><dt id="csv.QUOTE_MINIMAL"><span class="yiyi-st" id="yiyi-114"> <code class="descclassname">csv.</code><code class="descname">QUOTE_MINIMAL</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-115">指示<a class="reference internal" href="#csv.writer" title="csv.writer"><code class="xref py py-class docutils literal"><span class="pre">writer</span></code></a>对象仅引用包含特殊字符(如<em>分隔符</em>,<em>quotechar</em>或<em>lineterminator t5>。</em></span></p></dd></dl><dl class="data"><dt id="csv.QUOTE_NONNUMERIC"><span class="yiyi-st" id="yiyi-116"> <code class="descclassname">csv.</code><code class="descname">QUOTE_NONNUMERIC</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-117">指示<a class="reference internal" href="#csv.writer" title="csv.writer"><code class="xref py py-class docutils literal"><span class="pre">writer</span></code></a>对象引用所有非数字字段。</span></p><p><span class="yiyi-st" id="yiyi-118">指示读者将所有未引用的字段转换为<em>float</em>。</span></p></dd></dl><dl class="data"><dt id="csv.QUOTE_NONE"><span class="yiyi-st" id="yiyi-119"> <code class="descclassname">csv.</code><code class="descname">QUOTE_NONE</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-120">指示<a class="reference internal" href="#csv.writer" title="csv.writer"><code class="xref py py-class docutils literal"><span class="pre">writer</span></code></a>对象从不引用字段。</span><span class="yiyi-st" id="yiyi-121">当输出数据中出现当前<em>定界符</em>时,其前面为当前<em>escapechar</em>字符。</span><span class="yiyi-st" id="yiyi-122">如果未设置<em>escapechar</em>,如果遇到需要转义的字符,则写入程序将引发<a class="reference internal" href="#csv.Error" title="csv.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-123">指示<a class="reference internal" href="#csv.reader" title="csv.reader"><code class="xref py py-class docutils literal"><span class="pre">reader</span></code></a>不对引号字符执行特殊处理。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-124"><a class="reference internal" href="#module-csv" title="csv: Write and read tabular data to and from delimited files."><code class="xref py py-mod docutils literal"><span class="pre">csv</span></code></a>模块定义了以下异常:</span></p><dl class="exception"><dt id="csv.Error"><span class="yiyi-st" id="yiyi-125"> <em class="property">exception </em><code class="descclassname">csv.</code><code class="descname">Error</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-126">检测到错误时由任何函数引发。</span></p></dd></dl></div><div class="section" id="dialects-and-formatting-parameters"><h2><span class="yiyi-st" id="yiyi-127">14.1.2. </span><span class="yiyi-st" id="yiyi-128">方言和格式参数</span></h2><p><span class="yiyi-st" id="yiyi-129">为了更容易指定输入和输出记录的格式,特定的格式化参数被分组到方言中。</span><span class="yiyi-st" id="yiyi-130">方言是具有一组特定方法和单个<code class="xref py py-meth docutils literal"><span class="pre">validate()</span></code>方法的<a class="reference internal" href="#csv.Dialect" title="csv.Dialect"><code class="xref py py-class docutils literal"><span class="pre">Dialect</span></code></a>类的子类。</span><span class="yiyi-st" id="yiyi-131">当创建<a class="reference internal" href="#csv.reader" title="csv.reader"><code class="xref py py-class docutils literal"><span class="pre">reader</span></code></a>或<a class="reference internal" href="#csv.writer" title="csv.writer"><code class="xref py py-class docutils literal"><span class="pre">writer</span></code></a>对象时,程序员可以指定<a class="reference internal" href="#csv.Dialect" title="csv.Dialect"><code class="xref py py-class docutils literal"><span class="pre">Dialect</span></code></a>类的字符串或子类作为方言参数。</span><span class="yiyi-st" id="yiyi-132">除了<em>dialect</em>参数外,程序员还可以指定单独的格式参数,它们与<a class="reference internal" href="#csv.Dialect" title="csv.Dialect"><code class="xref py py-class docutils literal"><span class="pre">Dialect</span></code></a>类的下面定义的属性具有相同的名称。</span></p><p><span class="yiyi-st" id="yiyi-133">方言支持以下属性:</span></p><dl class="attribute"><dt id="csv.Dialect.delimiter"><span class="yiyi-st" id="yiyi-134"> <code class="descclassname">Dialect.</code><code class="descname">delimiter</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-135">用于分隔字段的单字符字符串。</span><span class="yiyi-st" id="yiyi-136">它默认为<code class="docutils literal"><span class="pre">','</span></code>。</span></p></dd></dl><dl class="attribute"><dt id="csv.Dialect.doublequote"><span class="yiyi-st" id="yiyi-137"> <code class="descclassname">Dialect.</code><code class="descname">doublequote</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-138">控制在字段中出现的<em>quotechar</em>实例本身应如何引用。</span><span class="yiyi-st" id="yiyi-139">当<a class="reference internal" href="constants.html#True" title="True"><code class="xref py py-const docutils literal"><span class="pre">True</span></code></a>时,字符加倍。</span><span class="yiyi-st" id="yiyi-140">当<a class="reference internal" href="constants.html#False" title="False"><code class="xref py py-const docutils literal"><span class="pre">False</span></code></a>时,<em>escapechar</em>用作<em>quotechar</em>的前缀。</span><span class="yiyi-st" id="yiyi-141">默认为<a class="reference internal" href="constants.html#True" title="True"><code class="xref py py-const docutils literal"><span class="pre">True</span></code></a>。</span></p><p><span class="yiyi-st" id="yiyi-142">On output, if <em>doublequote</em> is <a class="reference internal" href="constants.html#False" title="False"><code class="xref py py-const docutils literal"><span class="pre">False</span></code></a> and no <em>escapechar</em> is set, <a class="reference internal" href="#csv.Error" title="csv.Error"><code class="xref py py-exc docutils literal"><span class="pre">Error</span></code></a> is raised if a <em>quotechar</em> is found in a field.</span></p></dd></dl><dl class="attribute"><dt id="csv.Dialect.escapechar"><span class="yiyi-st" id="yiyi-143"> <code class="descclassname">Dialect.</code><code class="descname">escapechar</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-144">写入器将<em>分隔符</em>(如果<em>引用</em>)转义的一个字符串设置为<a class="reference internal" href="#csv.QUOTE_NONE" title="csv.QUOTE_NONE"><code class="xref py py-const docutils literal"><span class="pre">QUOTE_NONE</span></code></a>和<em>quotechar</em>如果<em>doublequote</em>是<a class="reference internal" href="constants.html#False" title="False"><code class="xref py py-const docutils literal"><span class="pre">False</span></code></a>。</span><span class="yiyi-st" id="yiyi-145">读取时,<em>escapechar</em>会删除以下字符中的任何特殊含义。</span><span class="yiyi-st" id="yiyi-146">它默认为<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>,它禁用转义。</span></p></dd></dl><dl class="attribute"><dt id="csv.Dialect.lineterminator"><span class="yiyi-st" id="yiyi-147"> <code class="descclassname">Dialect.</code><code class="descname">lineterminator</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-148">用于终止由<a class="reference internal" href="#csv.writer" title="csv.writer"><code class="xref py py-class docutils literal"><span class="pre">writer</span></code></a>生成的行的字符串。</span><span class="yiyi-st" id="yiyi-149">它默认为<code class="docutils literal"><span class="pre">'\r\n'</span></code>。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-150">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-151"><a class="reference internal" href="#csv.reader" title="csv.reader"><code class="xref py py-class docutils literal"><span class="pre">reader</span></code></a>是硬编码的,以识别<code class="docutils literal"><span class="pre">'\r'</span></code>或<code class="docutils literal"><span class="pre">'\n'</span></code>作为行尾,并忽略<em> lineterminator</em>。</span><span class="yiyi-st" id="yiyi-152">此行为可能会在将来更改。</span></p></div></dd></dl><dl class="attribute"><dt id="csv.Dialect.quotechar"><span class="yiyi-st" id="yiyi-153"> <code class="descclassname">Dialect.</code><code class="descname">quotechar</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-154">用于引用包含特殊字符(例如<em>分隔符</em>或<em>quotechar</em>)或包含换行字符的字段的单字符字符串。</span><span class="yiyi-st" id="yiyi-155">它默认为<code class="docutils literal"><span class="pre">'"'</span></code>。</span></p></dd></dl><dl class="attribute"><dt id="csv.Dialect.quoting"><span class="yiyi-st" id="yiyi-156"> <code class="descclassname">Dialect.</code><code class="descname">quoting</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-157">控制当quote应由writer生成并由reader识别。</span><span class="yiyi-st" id="yiyi-158">它可以接受任何<code class="xref py py-const docutils literal"><span class="pre">QUOTE_*</span></code>常量(参见<a class="reference internal" href="#csv-contents"><span>Module Contents</span></a>一节),默认为<a class="reference internal" href="#csv.QUOTE_MINIMAL" title="csv.QUOTE_MINIMAL"><code class="xref py py-const docutils literal"><span class="pre">QUOTE_MINIMAL</span></code></a>。</span></p></dd></dl><dl class="attribute"><dt id="csv.Dialect.skipinitialspace"><span class="yiyi-st" id="yiyi-159"> <code class="descclassname">Dialect.</code><code class="descname">skipinitialspace</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-160">当<a class="reference internal" href="constants.html#True" title="True"><code class="xref py py-const docutils literal"><span class="pre">True</span></code></a>时,紧跟<em>分隔符</em>后的空格将被忽略。</span><span class="yiyi-st" id="yiyi-161">默认值为<a class="reference internal" href="constants.html#False" title="False"><code class="xref py py-const docutils literal"><span class="pre">False</span></code></a>。</span></p></dd></dl><dl class="attribute"><dt id="csv.Dialect.strict"><span class="yiyi-st" id="yiyi-162"> <code class="descclassname">Dialect.</code><code class="descname">strict</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-163">当<code class="docutils literal"><span class="pre">True</span></code>时,在错误的CSV输入上引发异常<a class="reference internal" href="#csv.Error" title="csv.Error"><code class="xref py py-exc docutils literal"><span class="pre">Error</span></code></a>。</span><span class="yiyi-st" id="yiyi-164">默认值为<code class="docutils literal"><span class="pre">False</span></code>。</span></p></dd></dl></div><div class="section" id="reader-objects"><h2><span class="yiyi-st" id="yiyi-165">14.1.3. </span><span class="yiyi-st" id="yiyi-166"> Reader 对象</span></h2><p><span class="yiyi-st" id="yiyi-167">Reader对象(<a class="reference internal" href="#csv.DictReader" title="csv.DictReader"><code class="xref py py-class docutils literal"><span class="pre">DictReader</span></code></a>实例和由<a class="reference internal" href="#csv.reader" title="csv.reader"><code class="xref py py-func docutils literal"><span class="pre">reader()</span></code></a>函数返回的对象)有以下公共方法:</span></p><dl class="method"><dt id="csv.csvreader.__next__"><span class="yiyi-st" id="yiyi-168"> <code class="descclassname">csvreader.</code><code class="descname">__next__</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-169">返回Reader的可迭代对象的下一行作为列表,根据当前方言解析。</span><span class="yiyi-st" id="yiyi-170">通常你应该把它叫做<code class="docutils literal"><span class="pre">next(reader)</span></code>。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-171">Reader对象具有以下公共属性:</span></p><dl class="attribute"><dt id="csv.csvreader.dialect"><span class="yiyi-st" id="yiyi-172"> <code class="descclassname">csvreader.</code><code class="descname">dialect</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-173">解析器使用的方言的只读描述。</span></p></dd></dl><dl class="attribute"><dt id="csv.csvreader.line_num"><span class="yiyi-st" id="yiyi-174"> <code class="descclassname">csvreader.</code><code class="descname">line_num</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-175">从源迭代器读取的行数。</span><span class="yiyi-st" id="yiyi-176">这与返回的记录数不同,因为记录可以跨越多行。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-177">DictReader对象具有以下公共属性:</span></p><dl class="attribute"><dt id="csv.csvreader.fieldnames"><span class="yiyi-st" id="yiyi-178"> <code class="descclassname">csvreader.</code><code class="descname">fieldnames</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-179"></span></p></dd></dl></div><div class="section" id="writer-objects"><h2><span class="yiyi-st" id="yiyi-180">14.1.4. </span><span class="yiyi-st" id="yiyi-181"> Writer 对象</span></h2><p><span class="yiyi-st" id="yiyi-182"><code class="xref py py-class docutils literal"><span class="pre">Writer</span></code>对象(<a class="reference internal" href="#csv.DictWriter" title="csv.DictWriter"><code class="xref py py-class docutils literal"><span class="pre">DictWriter</span></code></a>实例和由<a class="reference internal" href="#csv.writer" title="csv.writer"><code class="xref py py-func docutils literal"><span class="pre">writer()</span></code></a>函数返回的对象)具有以下公共方法。</span><span class="yiyi-st" id="yiyi-183">A <em>row</em> must be an iterable of strings or numbers for <code class="xref py py-class docutils literal"><span class="pre">Writer</span></code> objects and a dictionary mapping fieldnames to strings or numbers (by passing them through <a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-func docutils literal"><span class="pre">str()</span></code></a> first) for <a class="reference internal" href="#csv.DictWriter" title="csv.DictWriter"><code class="xref py py-class docutils literal"><span class="pre">DictWriter</span></code></a> objects. </span><span class="yiyi-st" id="yiyi-184">注意,复数用柔义包围。</span><span class="yiyi-st" id="yiyi-185">这可能会导致一些问题,其他程序读取CSV文件(假设他们支持复数)。</span></p><dl class="method"><dt id="csv.csvwriter.writerow"><span class="yiyi-st" id="yiyi-186"> <code class="descclassname">csvwriter.</code><code class="descname">writerow</code><span class="sig-paren">(</span><em>row</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-187">将参数<em>row</em>写入写入器的文件对象,根据当前方言格式化。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-188"><span class="versionmodified">在版本3.5中已更改:</span>添加了对任意iterable的支持。</span></p></div></dd></dl><dl class="method"><dt id="csv.csvwriter.writerows"><span class="yiyi-st" id="yiyi-189"> <code class="descclassname">csvwriter.</code><code class="descname">writerows</code><span class="sig-paren">(</span><em>rows</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-190">将所有<em>行</em>参数(如上所述的<em>行</em>对象的列表)写入writer的文件对象,根据当前方言格式化。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-191">Writer对象具有以下公共属性:</span></p><dl class="attribute"><dt id="csv.csvwriter.dialect"><span class="yiyi-st" id="yiyi-192"> <code class="descclassname">csvwriter.</code><code class="descname">dialect</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-193">Writer使用的方言的只读描述。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-194">DictWriter对象具有以下公共方法:</span></p><dl class="method"><dt id="csv.DictWriter.writeheader"><span class="yiyi-st" id="yiyi-195"> <code class="descclassname">DictWriter.</code><code class="descname">writeheader</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-196">用字段名写入一行(在构造函数中指定)。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-197"><span class="versionmodified">版本3.2中的新功能。</span></span></p></div></dd></dl></div><div class="section" id="examples"><h2><span class="yiyi-st" id="yiyi-198">14.1.5. </span><span class="yiyi-st" id="yiyi-199">实例</span></h2><p><span class="yiyi-st" id="yiyi-200">读取CSV文件的最简单示例:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">csv</span>
|
||
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'some.csv'</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
||
<span class="n">reader</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">reader</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">reader</span><span class="p">:</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-201">使用其它格式读取文件:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">csv</span>
|
||
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'passwd'</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
||
<span class="n">reader</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">reader</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">delimiter</span><span class="o">=</span><span class="s1">':'</span><span class="p">,</span> <span class="n">quoting</span><span class="o">=</span><span class="n">csv</span><span class="o">.</span><span class="n">QUOTE_NONE</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">reader</span><span class="p">:</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-202">相应的最简单的写入示例是:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">csv</span>
|
||
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'some.csv'</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
||
<span class="n">writer</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">writer</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
||
<span class="n">writer</span><span class="o">.</span><span class="n">writerows</span><span class="p">(</span><span class="n">someiterable</span><span class="p">)</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-203">由于<a class="reference internal" href="functions.html#open" title="open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>用于打开要读取的CSV文件,因此默认情况下该文件将使用系统默认编码解码为unicode(请参阅<a class="reference internal" href="locale.html#locale.getpreferredencoding" title="locale.getpreferredencoding"><code class="xref py py-func docutils literal"><span class="pre">locale.getpreferredencoding()</span></code></a>) 。</span><span class="yiyi-st" id="yiyi-204">要使用不同的编码对文件进行解码,请使用open的<code class="docutils literal"><span class="pre">encoding</span></code>参数:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">csv</span>
|
||
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'some.csv'</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">'utf-8'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
||
<span class="n">reader</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">reader</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">reader</span><span class="p">:</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-205">这同样适用于在除系统默认编码以外的其他内容中写入:在打开输出文件时指定encoding参数。</span></p><p><span class="yiyi-st" id="yiyi-206">注册新方言:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">csv</span>
|
||
<span class="n">csv</span><span class="o">.</span><span class="n">register_dialect</span><span class="p">(</span><span class="s1">'unixpwd'</span><span class="p">,</span> <span class="n">delimiter</span><span class="o">=</span><span class="s1">':'</span><span class="p">,</span> <span class="n">quoting</span><span class="o">=</span><span class="n">csv</span><span class="o">.</span><span class="n">QUOTE_NONE</span><span class="p">)</span>
|
||
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'passwd'</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
||
<span class="n">reader</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">reader</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s1">'unixpwd'</span><span class="p">)</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-207">稍微更高级的使用读者 - 捕获和报告错误:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">csv</span><span class="o">,</span> <span class="nn">sys</span>
|
||
<span class="n">filename</span> <span class="o">=</span> <span class="s1">'some.csv'</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="n">newline</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
||
<span class="n">reader</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">reader</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">reader</span><span class="p">:</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
||
<span class="k">except</span> <span class="n">csv</span><span class="o">.</span><span class="n">Error</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
||
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="s1">'file </span><span class="si">{}</span><span class="s1">, line </span><span class="si">{}</span><span class="s1">: </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">reader</span><span class="o">.</span><span class="n">line_num</span><span class="p">,</span> <span class="n">e</span><span class="p">))</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-208">虽然模块不直接支持解析字符串,它可以很容易地做到:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">csv</span>
|
||
<span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">csv</span><span class="o">.</span><span class="n">reader</span><span class="p">([</span><span class="s1">'one,two,three'</span><span class="p">]):</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
||
</code></pre><p class="rubric"><span class="yiyi-st" id="yiyi-209">脚注</span></p><table class="docutils footnote" frame="void" id="id3" rules="none"><tbody valign="top"><tr><td class="label"><span class="yiyi-st" id="yiyi-210">[1]</span></td><td><span class="yiyi-st" id="yiyi-211"><em>(<a class="fn-backref" href="#id1">1</a>,<a class="fn-backref" href="#id2">2</a>)</em>如果未指定<code class="docutils literal"><span class="pre">newline=''</span></code>将正确解释,在使用<code class="docutils literal"><span class="pre">\r\n</span></code> linendings写入额外<code class="docutils literal"><span class="pre">\r</span></code>的平台上将被添加。</span><span class="yiyi-st" id="yiyi-212">指定<code class="docutils literal"><span class="pre">newline=''</span></code>应该是安全的,因为csv模块有自己的(<a class="reference internal" href="../glossary.html#term-universal-newlines"><span class="xref std std-term">universal</span></a>)换行处理。</span></td></tr></tbody></table></div></div></div> |