<p>在<code>write_file</code>函数中引入双引号。在</p>
<p>CSV文件表面看起来很简单,但迟早你会遇到一些更复杂的问题。第一个问题是:如果字段内容中出现表示分隔符的字符,应该怎么办?由于CSV格式没有真正的标准,不同的人对这个问题的正确答案有不同的看法。在</p>
<p>Python<code>csv</code>库试图将这种复杂性和各种方法抽象出来,并使其更容易按照不同的规则读写CSV文件。这是由<a href="https://docs.python.org/2/library/csv.html#dialects-and-formatting-parameters">^{<cd3>} class</a>对象完成的。在</p>
<p><code>write_file</code>函数的作者决定手动构造输出行,方法是将所有字段和分隔符字符合并在一起,但随后使用<code>csv</code>模块将数据实际写入文件:</p>
<pre><code>writer.writerow([givers_list[ind][1] + ',' + givers_list[ind][2]
+ ',' + givers_list[ind][3]
+ ',' + givers_list[rand_vec[ind]][1] + ','
+ givers_list[rand_vec[ind]][2] + ',' + givers_list[rand_vec[ind]][3]])
</code></pre>
<p><code>csv</code>模块的这种不一致用法导致整行数据被视为单个字段</strong>。因为该字段包含用作字段分隔符的字符,<code>Dialect.quoting</code>决定如何处理它。默认的引号配置,<code>csv.QUOTE_MINIMAL</code>表示应该使用<code>Dialect.quotechar</code>来引用该字段,默认为双引号字符(<code>"</code>)。为什么最后整个字段都被双引号包围了。在</p>
<p>快速而简单,但不正确的解决方案是将引用算法改为<code>csv.QUOTE_NONE</code>。这将告诉writer对象从不环绕字段,而是通过<code>Dialect.escapechar</code>转义特殊字符。根据文档,将其设置为<code>None</code>(默认值)将引发一个错误。我想把它设为空字符串就可以了。在</p>
<p>正确的解决方案是给<code>writer.writerrow</code>输入预期的字段列表。应该这样做(未经测试):</p>
^{pr2}$