如何使用csv.Sniffer处理两种不同类型的CSV文件?

8

我希望能够读取两种不同类型的CSV文件:

  • 一种使用','作为分隔符
  • 一种使用';'作为分隔符

我尝试通过以下方式检查我正在使用哪种分隔符:

dialect = csv.Sniffer().sniff(csvfile, [',', ';'])  
data = csv.reader(csvfile, dialect)

但是我遇到了 TypeError: 预期字符串或缓冲区 错误。

如果我这样做,它可以工作,但是我不知道何时使用哪个分隔符。

data = csv.reader(csvfile, delimiter = ",")  
data = csv.reader(csvfile, delimiter = ";")

有人可以帮我吗?

1个回答

29

Sniffer期望得到一个示例字符串,而不是一个文件。你只需要:

dialect = csv.Sniffer().sniff(csvfile.readline(), [',',';'])
csvfile.seek(0)  
data = csv.reader(csvfile, dialect)

寻找操作很重要,因为使用readline命令时会改变当前在文件中的位置,需要将其重置回文件开头。否则会丢失数据。


1
嗅探器的唯一目的是在没有先前知识的情况下确定分隔符,那么列出分隔符的意义是什么? - Vaidøtas I.
3
@VaidøtasI. 的意思是限制分隔符的探测范围,避免探测到奇怪的分隔符。在我的一个测试中,探测器发现“B”是我的分隔符,而这显然不是我真正的 csv 分隔符。 - Quentin
1
@Quentin,好的。 - Vaidøtas I.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接