双引号在write_file
功能中引入.
CSV文件在表面上看起来很简单,但迟早会遇到一些更复杂的问题.第一个是:如果在字段内容中出现字符表示分隔符,会发生什么?由于CSV格式没有真正的标准,不同的人对这个问题有正确答案的不同想法.
Python csv
库试图抽象这种复杂性和各种方法,并使遵循不同规则更容易读取和写入CSV文件.这是由Dialect
类对象完成的.
write_file
函数的作者决定通过将所有字段和分隔符连接在一起来手动构造输出行,然后使用csv
模块实际将数据写入文件:
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]])
csv
模块的这种不一致使用导致整行数据被视为单个字段.因为该字段包含用作字段分隔符的字符,所以Dialect.quoting
决定如何处理它.默认引用配置,csv.QUOTE_MINIMAL
表示该字段应使用Dialect.quotechar
- 引用默认为双引号字符("
).这就是为什么最终整个字段最终都被双引号字符所包围.
快速简便但不正确的解决方案是将引用算法改为csv.QUOTE_NONE
.这将告诉writer对象永远不会包围字段,而是通过转义特殊字符Dialect.escapechar
.根据文档,将其设置为None
(默认)将引发错误.我想将它设置为空字符串可以完成这项工作.
正确的解决方案是writer.writerrow
使用预期的输入数据 - 字段列表.这应该做(未经测试):
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]])