让csv.Sniffer使用带引号的值

Ant*_*lvy 8 python csv python-2.7 python-3.x

我正在尝试使用许多StackOverflow答案中建议的python的CSV嗅探器工具来猜测给定的CSV文件是否由;or 分隔,.

它与基本文件一起工作正常,但是当一个值包含一个分隔符时,它被双引号包围(标准为),并且嗅探器抛出_csv.Error: Could not determine delimiter.

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

这是一个最小的失败的CSV文件:

column1,column2
0,"a, b"
Run Code Online (Sandbox Code Playgroud)

并且概念证明:

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
Run Code Online (Sandbox Code Playgroud)

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

msw*_*msw 20

你给了嗅探器过多的输入.如果运行,示例文件仍然有效:

csv.Sniffer().sniff(f.readline())
Run Code Online (Sandbox Code Playgroud)

它仅使用标题行来确定分隔符.如果您想了解为什么Sniffer启发式失败以获取更多数据,则无法替代读取csv.py库源代码.

  • 谢谢!!这似乎是[Python文档](https://docs.python.org/3/library/csv.html#csv.Sniffer)的一个主要缺陷,它显示了读取1024字节的有问题的方法:`dialect = csv.嗅探器().嗅探(csvfile.read(1024))`.CSV文件总是包含多行的文本文件,因此似乎`f.readline()`是正确的选项. (3认同)
  • 谢谢,我最终像您建议的那样做。遗憾的是那是唯一的方法。 (2认同)
  • @msw指向CSV源的链接,第165行现在指向空行。不知道您是否打算指向源的特定部分,但是如果您这样做,则链接到特定提交以实现稳定的线链接是一个好主意。 (2认同)