1
编辑日期: 2024-11-28 文章阅读: 次
今天跟大家分享遇到一个遇到的挺狗血的问题,读入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
为逗号。
这样经过一遍替换处理后,就不会再出现数据缺失、有些行被过滤的问题。