Python检测CSV文件中的分隔符/定界符。

7
我有一个函数可以读取并处理多个数据帧的*.csv文件。但是,并非所有CSV文件都具有相同的分隔符。那么,Python如何检测CSV文件使用的分隔符类型,并将其用于read_csv()函数中以在Pandas中读取它?
df = pd.read_csv(path, sep = 'xxx',header = None, index_col = 0)
2个回答

13

更新

实际上,使用参数engine='python'作为read_csv的参数。它将尝试自动检测正确的分隔符。

sepstr,默认值为','

要使用的分隔符。如果sepNone,则C引擎无法自动检测分隔符,但是Python解析引擎可以,这意味着后者将被使用,并通过Python的内置探测工具csv.Sniffer自动检测分隔符。此外,长度大于1且不同于'\s+'的分隔符将被解释为正则表达式,并且还将强制使用Python解析引擎。请注意,正则表达式分隔符容易忽略带引号的数据。正则表达式示例:'\r\t'。

使用csv.Sniffer

import csv

def find_delimiter(filename):
    sniffer = csv.Sniffer()
    with open(filename) as fp:
        delimiter = sniffer.sniff(fp.read(5000)).delimiter
    return delimiter

演示:

>>> find_delimiter('data.csv')
','

>>> find_delimiter('data.txt')
' ' 

fp.read() 中为什么要使用 5000 的值? - Maria Fernanda
1
只需设置最大缓冲区大小以避免读取整个文件。我认为5000字节足以确定分隔符。 - Corralien
1
哇!它运行了!!我看到其他帖子中他们迭代可能的分隔符列表,但很可能会出现错误。然而,有了你的答案,它真的很好用!! - Maria Fernanda
1
设置 pandas.read_csv('data.csv',sep=None) 可以自动检测分隔符,并使用 Python 引擎。 - Reda El Hail

4
正如Reda El Hail在评论中所说,设置参数sep = None,就像这样:
pandas.read_csv('data.csv',sep=None)

如果您使用awswrangler库在s3中读取csv文件,则可以执行类似于以下操作:

awswrangler.s3.read_csv('s3://bucket/prefix', sep = None)

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