包含引号和逗号字符的CSV文件

8 投票
3 回答
27594 浏览
提问于 2025-04-17 12:48

我有一堆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 个回答

2

我会写一个转换器,来解析最初的csv文件,并输出一个有效的csv文件。你可以使用逗号(,)或者换行符(\n)来判断数据是怎么分隔开的。

11

你有没有试过通过 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"']
4

我还不能评论,所以我就发个回答吧...

假设你用逗号作为分隔符,那么你的数据里有没有逗号呢?如果没有的话,你可以在处理CSV之前,先把字段中第一个和最后一个字符之间的所有引号都变成两个引号,这样就能避免问题了。

撰写回答