让csv.Sniffer使用带引号的值

时间:2016-03-02 19:45:33

标签: python python-2.7 csv python-3.x

我尝试按照许多StackOverflow答案中的建议使用python's CSV sniffer tool来猜测给定的CSV文件是否由;,分隔。

它可以正常使用基本文件,但是当一个值包含一个分隔符时,它会被双引号括起来(正如标准所示),而嗅探器会抛出_csv.Error: Could not determine delimiter

以前有没有人经历过这个?

以下是最小的失败CSV文件:

column1,column2
0,"a, b"

概念证明:

Python 3.5.1 (default, Dec  7 2015, 12:58:09) 
[GCC 5.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import csv
>>> f = open("example.csv", "r")
>>> f.seek(0);
0
>>> csv.Sniffer().sniff(f.read(), delimiters=';,')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/csv.py", line 186, in sniff
    raise Error("Could not determine delimiter")
_csv.Error: Could not determine delimiter

我可以完全控制输入CSV文件的生成;但有时它会被使用MS Office的第三方修改,并且分隔符被半毫米替换,所以我必须使用这种猜测方法。 我知道我可以在输入文件中停止使用逗号,但我想知道我是否先做错了。

1 个答案:

答案 0 :(得分:18)

你给嗅探器太多输入了。如果您运行:

,您的示例文件将起作用
csv.Sniffer().sniff(f.readline())

仅使用标题行来确定分隔符。如果您想了解为什么Sniffer启发式失败以获取更多数据,那么reading the csv.py library source code就无法替代。