使用pd.read_csv自动检测CSV文件中的分隔符

SEU*_*SEU 5 python csv delimiter pandas

read_csv是否可以自动检测定界符?numpy的genfromtxt执行此操作。我的文件的数据具有单个空格,两个空格和一个制表符作为分隔符。genfromtext()解决了这个问题,但比熊猫的read_csv慢。有任何想法吗?

pie*_*etz 14

另一种选择是使用内置的 CSV 嗅探器。我将其与仅读取一定数量的字节混合在一起,以防 CSV 文件很大。

import csv

def get_delimiter(file_path, bytes = 4096):
    sniffer = csv.Sniffer()
    data = open(file_path, "r").read(bytes)
    delimiter = sniffer.sniff(data).delimiter
    return delimiter
Run Code Online (Sandbox Code Playgroud)


cs9*_*s95 5

选项1

使用delim_whitespace=True

df = pd.read_csv('file.csv', delim_whitespace=True)
Run Code Online (Sandbox Code Playgroud)

选项2

将正则表达式传递给sep参数:

df = pd.read_csv('file.csv', sep='\s+')
Run Code Online (Sandbox Code Playgroud)

这相当于第一个选项


的文档pd.read_csv


小智 5

为了更好地控制,我使用了 python 项目中名为 detector_delimiter 的 python 模块。请参阅https://pypi.org/project/detect-delimiter/。它已经存在了一段时间了。与所有代码一样,您应该在部署之前使用解释器进行测试。我已经测试了 python 版本 3.8.5。

请参阅下面的代码示例,其中自动检测分隔符,并从方法的输出中定义 var 分隔符。然后,代码使用 sep = 分隔符读取 CSV 文件。我已经使用以下分隔符进行了测试,尽管其他分隔符应该可以工作:; , |

它不适用于多字符分隔符,例如“,”

警告!此方法不会检测格式错误的 CSV 文件。在输入文件包含两者的情况下;并且,该方法返回 , 作为检测到的分隔符。

from detect_delimiter import detect
import pandas as pd

filename = "some_csv.csv"
with open(filename) as f:
    firstline = f.readline()
    delimiter = detect(firstline)

records = pd.read_csv(filename, sep = delimiter)
Run Code Online (Sandbox Code Playgroud)