有没有一种方法让read_csv
自动检测分隔符?numpy的genfromtxt
可以做到这一点。
我的文件中使用单个空格、双个空格和制表符作为分隔符。 genfromtxt()
可以解决这个问题,但比pandas的read_csv
慢。
有什么想法吗?
有没有一种方法让read_csv
自动检测分隔符?numpy的genfromtxt
可以做到这一点。
我的文件中使用单个空格、双个空格和制表符作为分隔符。 genfromtxt()
可以解决这个问题,但比pandas的read_csv
慢。
有什么想法吗?
另一种选择是使用内置的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
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)
选项1
使用delim_whitespace = True
df = pd.read_csv('file.csv', delim_whitespace=True)
选项2
将正则表达式传递给sep
参数:
df = pd.read_csv('file.csv', sep='\s+')
这相当于第一个选项。
sep='\t'
。 - Adrian Keister
detect_delimiter
不考虑引号和转义,因此如果分隔符由于转义而出现更多次数,则很容易错过正确的分隔符。它按照逗号、分号、冒号、竖线和制表符的顺序计算前5行中每个字符的出现次数。如果默认字符在每行中出现的次数相等,则返回该字符,否则返回第一个出现次数相等的字符,...否则以同样的方式测试最常出现的字符,如果仍然失败,则返回默认值。 - Herbert