包含引号和逗号字符的CSV文件
我有一堆CSV文件想要解析,但问题是其中一半的文件里,使用了引号作为引号,而且在主要字段里面还有逗号。它们其实并不是真正的CSV文件,但有固定数量的字段可以识别。使用dialect=csv."excel"的设置在没有额外引号和逗号的文件上效果很好。
这些数据比较旧,也没有人支持。我想让它们重新焕发生机。
例如:
"AAAAA
AAAA
AAAA
AAAA","AAAAAAAA
AAAAAA
AAAAA "AAAAAA" AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAA, AAAAA
AAAAAAAAA AAAAA AAAAAAAAAA
AAAAA, "AAAAA", AAAAAAAAA
AAAAAAAA AAAAAAAA
AAAAAAA
"
这导致文件解析器出错,抛出一个错误 _csv.Error: newline inside string
。我通过去掉第二个字段里面的引号,发现这个问题就是由此引起的,这样csv.reader模块就能正常解析文件了。
有些字段是多行的——我不确定这是否重要。
我一直在研究方言设置,虽然我找到了'skipinitialspace',但这似乎并没有解决问题。
为了明确一点——这并不是有效的'CSV',它的数据对象大致遵循CSV结构,但字段内容里面有逗号和引号。
行结束符是 \x0d\x0a
我尝试了多种双引号和方言模块中的引号变量的组合,但就是无法正确解析。
我不能确定是否只有在字段边界上才会出现 ," 或 ", 的组合。
这个问题只出现在文件中的一个字段(最后一个),而且有几千个文件。
3 个回答
我会写一个转换器,来解析最初的csv文件,并输出一个有效的csv文件。你可以使用逗号(,)或者换行符(\n)来判断数据是怎么分隔开的。
你有没有试过通过 csv.QUOTE_NONE
这个参数来设置 quoting
?因为我没有你的代码或数据来测试,所以我不知道这个方法对你的数据是否有效,但看起来它在你提供的那部分内容上是有效的。
>>> import csv
>>> r = csv.reader(open('foo.csv', 'rb'), quoting=csv.QUOTE_NONE)
>>> for row in r: print row
...
['"A"', '"B"', '"ccc "ccccccc" cccccc"']
我还不能评论,所以我就发个回答吧...
假设你用逗号作为分隔符,那么你的数据里有没有逗号呢?如果没有的话,你可以在处理CSV之前,先把字段中第一个和最后一个字符之间的所有引号都变成两个引号,这样就能避免问题了。