我有一个CSV文件,里面有这样的数据
15,"I",2,41301888,"BYRNESS RAW","","BYRNESS VILLAGE","NORTHUMBERLAND","ENG"
11,"I",3,41350101,2,2935,2,2008-01-09,1,8,0,2003-02-01,,2009-12-22,2003-02-11,377016.00,601912.00,377105.00,602354.00,10
我正在读这篇文章,然后将不同的行写入不同的CSV文件。在
但是,在原始数据中,非数字字段周围有引号,因为其中一些字段中包含逗号。在
我不能保留这些引语。在
我研究了很多,发现了quoting=csv.QUOTE_NONNUMERIC
,但是现在每个字段都有一个引号,我不知道为什么??在
如果我尝试其他引用选项之一,比如MINIMAL,那么我最终会得到一条关于日期值的错误消息,即2008-01-09,而不是一个float。在
我尝试过创建一种方言,在csv阅读器和writer上添加引用,但是我没有尝试任何结果来获得与原始数据完全匹配的结果。在
任何人都有同样的问题并找到了解决办法。在
你确定你有问题吗?您描述的行为是正确的:
csv
模块只在正确解析字符串需要的情况下才会用引号将字符串括起来。因此,您应该只看到包含逗号、换行符等的字符串的引号。除非您在读回输出时遇到错误,否则没有问题。在试图获得原始数据的“精确匹配”是一项困难的工作,而且可能是徒劳的。
quoting=csv.QUOTE_NONNUMERIC
在所有字段周围加上引号,因为当您读入每个字段时,每个字段都是一个字符串。在您担心一些“带引号”的输入字段可能有逗号,这通常不是什么大问题。如果在一个带引号的字段中添加逗号并使用默认编写器,则带逗号的字段将自动在输出中引用。在
写入时,}(例如),这意味着它将写入您期望的值。在
quoting=csv.QUOTE_NONNUMERIC
只要值是数字,也就是说,如果它们的类型是int
或{您的问题可能是,在读取时,
csv.reader
会将它读取的每一行都转换为字符串的list
(如果您足够仔细地阅读文档,您将看到一个阅读器不执行自动数据类型转换!在如果你在阅读之后不进行任何形式的转换,那么当你写作的时候,你就会把所有的东西都加上引号。。。因为你写的东西都是字符串。在
编辑:当然,日期字段会被引用,因为它们是而不是数字,这意味着您无法使用标准的
csv.writer
获得确切的预期行为。在相关问题 更多 >
编程相关推荐