跳转至

挺狗血的问题读入csv文件分隔符问题

本文总阅读量次 ,原创教程,严禁转载

今天跟大家分享遇到一个遇到的挺狗血的问题,读入csv文件关于分隔符的问题。

1

使用pandas读入csv文件后,发现列没分割开,所以将sep参数调整为\t,发现还是没分割开,再试空格,再试\s+,即各种空白字符组合,有几例能分隔开,但是还有些列无法分割开。

左思右想,不得其解。那就去查查csv文件有没有自动解析出分隔符的工具,其实这种工具并不难做,把每行的分隔符规律找一遍,按照不同概率给出不同的分隔符可能。

网上并没有找到,一般网上没有找到答案的问题,主要分两类,要么这个问题的关联领域是极其小众的,要么这个问题本不是问题,可能是因为犯傻导致的极其低级错误而出现的问题。

很明显读个csv列无法分割不属于小众问题,所以应该是犯傻导致。

果不其然,等我再三观察发现,读入文件所有列都没有分割,也就是\(N\)行1列的数据格式,所以问题出在读入文件上。

2

作为延伸,我想说下csv文件一个较大被人诟病的问题,正是由于分割符导致。

如下文件a.csv,分隔符是逗号,你注意看Hi,pythoner单元格,它的取值中含有一个逗号

等我使用pandas读入此文件时,会发生什么:

import pandas as pd 
pd.__version__  # '1.2.4'

pd.read_csv('a.csv', index_col=False)
读入后,Hi,pythoner单元格的取值被截断为Hi

如果多个单元格存在多于1个逗号,因为列无法对其还会抛异常,为此read_csv还提供一个参数error_bad_lines,专门丢弃这种含有多个逗号的行,这种错误在大数据量时尤其容易出现,为了第一时间读入数据往往将error_bad_lines设置为False,即丢弃这种多逗号的行。

如果csv文件的分隔符是\t或其他,也同样面临一样的问题,如果分隔符恰好出现在单元格中,这种错误是不可避免的。

3

如果你的数据恰好又大量出现了分隔符的行,这就需要引起重视了。

为此比较保险的一种做法是,替换单元格中出现的csv文件的分隔符为其他符号,如分隔符为逗号,替换单元格的逗号为空格;如为\t,替换单元格的\t为逗号。

这样经过一遍替换处理后,就不会再出现数据缺失、有些行被过滤的问题。