我有一个包含此类数据的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,而不是浮动。
我试图创建一个方言,在csv阅读器和编写器上添加引用,但我没有尝试过与原始数据完全匹配的结果。
任何人都有同样的问题,并找到了解决方案。
答案 0 :(得分:7)
写作时,quoting=csv.QUOTE_NONNUMERIC
保持值不加引号,只要它们是数字,即。如果他们的类型是int
或float
(例如),这意味着它会写出您期望的内容。
您的问题可能是,在阅读时,csv.reader
会将其读取的每一行转换为{{1>}个字符串(如果您仔细阅读文档,那么会看到读者不执行自动数据类型转换!
如果您在阅读后没有执行任何类型的转换 ,那么当您编写时,您最终会在引号上显示所有内容...因为您编写的所有内容都是字符串。
编辑:当然,会引用日期字段,因为它们不是数字,这意味着您无法使用标准list
获得准确的预期行为。
答案 1 :(得分:1)
你确定你有问题吗?您正在描述的行为是正确的:csv
模块只有在必要正确解析它们时才会将字符串括在引号中。因此,您应该只看到包含逗号,换行符等字符串的引号。除非您在读取输出时遇到错误,否则没有问题。
答案 2 :(得分:0)
尝试获得原始数据的“完全匹配”是一项困难且可能毫无结果的努力。 quoting=csv.QUOTE_NONNUMERIC
在所有内容中都加上了引号,因为当你读取它时,每个字段都是一个字符串。
您对某些“引用”输入字段可能包含逗号的担忧通常不是那么重要。如果您在其中一个引用字段中添加了逗号并使用了默认编写器,则会在输出中自动引用带逗号的字段。