在pandas中检索由read_csv推断出的分隔符

19
使用自动分隔符检测配置读取 CSV 文件时(pd.read_csv(file_path, sep=None)),pandas 会尝试推断分隔符(或分隔符)。是否有一种方法可以检索此推断的结果(最终用于 sep 的值)? 编辑 我特别寻找一种使用由 read_csv 返回的 pandas 对象的方法。我使用 pandas 版本 0.20.2。
4个回答

15

我认为你可以在不导入csv的情况下完成这个任务:

reader = pd.read_csv(file_path, sep = None, iterator = True)
inferred_sep = reader._engine.data.dialect.delimiter

编辑:

忘记了iterator = True参数。


2
这是我正在寻找的答案类型,但不幸的是它并不起作用。我得到了:AttributeError: 'DataFrame' object has no attribute '_engine'。我使用的是 pandas 的 0.20.2 版本。 - Leo Bouloc
啊,抱歉,请尝试使用reader = pd.read_csv(file_path, sep=None, iterator=True) - RHSmith159
所以这个方法可以获取分隔符,但是reader对象不再是一个pandas.DataFrame对象。相反,它是pandas.io.parsers.TextFileReader类型。有什么办法可以在返回pandas.DataFrame的同时完成这个操作吗? - Leo Bouloc
dataframe = pd.concat(reader) you might also need to add the ignore_index=True argument to concat() - RHSmith159
1
解析器警告:由于“c”引擎不支持sep=None和delim_whitespace=False,因此回退到“python”引擎;您可以通过指定engine='python'来避免此警告。 - Martin Thoma
显示剩余3条评论

10
如果您只想检测csv的方言(而不加载数据),则可以使用内置的csv.Sniffer标准:

Sniffer类用于推断CSV文件的格式。

特别是,sniff方法:
sniff(sample, delimiters=None)

Analyze the given sample and return a Dialect subclass reflecting the parameters found. If the optional delimiters parameter is given, it is interpreted as a string containing possible valid delimiter characters.

这是一个使用示例:
with open('example.csv', 'r') as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.readline())
    print(dialect.delimiter)

1

csv.Sniffer

Sniffer类用于推断CSV文件的格式。

sniff(sample, delimiters=None)

分析给定的样本并返回反映找到的参数的Dialect子类。如果给定了可选的分隔符参数,则将其解释为可能包含有效分隔符字符的字符串。


Dialect.delimiter

一个用于分隔字段的单字符字符串。默认为“,”。

import csv

sniffer = csv.Sniffer()
dialect = sniffer.sniff('first, second, third, fourth')
print dialect.delimiter

-1

基于RHSmith159的回答,您可以这样做。在读取CSV后,您需要使用concat来防止数据框转换为TextFileReader对象。您可能还需要将引擎指定为Python,以避免出现解析器警告,例如以下代码:

    reader = pd.read_csv(filename, sep = None, iterator = True, engine='python')
    df = pd.concat(reader)
    delimiter = reader._engine.data.dialect.delimiter
    print(delimiter)
    print(df)

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