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

73 lines
58 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-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">所谓的CSVComma 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">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">csv</span>
<span class="gp">&gt;&gt;&gt; </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">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">csv</span>
<span class="gp">&gt;&gt;&gt; </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&gt;</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>