【发布时间】:2018-01-25 17:05:49
【问题描述】:
使用自动分隔符检测配置读取 csv 文件 (pd.read_csv(file_path, sep=None)) 时,pandas 会尝试推断分隔符(或分隔符)。
有没有办法检索此推断的结果(最终用于sep 的值)?
编辑
我正在专门寻找一种使用由read_csv 返回的pandas 对象的方法。我使用的是 0.20.2 版的 pandas。
【问题讨论】:
使用自动分隔符检测配置读取 csv 文件 (pd.read_csv(file_path, sep=None)) 时,pandas 会尝试推断分隔符(或分隔符)。
有没有办法检索此推断的结果(最终用于sep 的值)?
编辑
我正在专门寻找一种使用由read_csv 返回的pandas 对象的方法。我使用的是 0.20.2 版的 pandas。
【问题讨论】:
如果您只想检测 csv 的方言(不加载数据),您可以使用内置的 csv.Sniffer 标准:
Sniffer 类用于推断 CSV 文件的格式。
特别是sniff 方法:
sniff(sample, delimiters=None)分析给定的样本并返回反映 找到的参数。如果给出了可选的分隔符参数,它是 解释为包含可能的有效分隔符的字符串 字符。
以下是它的用法示例:
with open('example.csv', 'r') as csvfile:
dialect = csv.Sniffer().sniff(csvfile.readline())
print(dialect.delimiter)
【讨论】:
我认为您无需导入csv就可以做到这一点:
reader = pd.read_csv(file_path, sep = None, iterator = True)
inferred_sep = reader._engine.data.dialect.delimiter
编辑:
忘记了 iterator = True 参数。
【讨论】:
AttributeError: 'DataFrame' object has no attribute '_engine'。我使用的是 0.20.2 版的 pandas。
reader = pd.read_csv(file_path, sep = None, engine = 'python') 工作得更好吗?
reader = pd.read_csv(file_path, sep = None, iterator = True)
reader 对象不再是 pandas.DataFrame 对象。相反,如果键入pandas.io.parsers.TextFileReader。知道如何在返回 pandas.DataFrame 的同时执行此操作吗?
csv.Sniffer
Sniffer 类用于推断 CSV 文件。
嗅探(样本,分隔符=无)
分析给定的样本并返回一个 反映找到的参数的方言子类。如果可选 给定 delimiters 参数,它被解释为一个字符串 包含可能的有效分隔符。
Dialect.delimiter
用于分隔字段的单字符字符串。它 默认为','
import csv
sniffer = csv.Sniffer()
dialect = sniffer.sniff('first, second, third, fourth')
print dialect.delimiter
【讨论】: