首页 > 解决方案 > 使用列之间的换行符读取 csv 文件

问题描述

我已经使用pandas, 用分号分隔的列读取和解析 csv 文件;。一些文件(出于未知原因)'\r\n'在一些列之后有一个序列,这使得pandas.read_csv它们分成不同的行。我想转义这些字符并将“第二行”附加到“第一行”,否则之后解析会变得困难。

我可以识别这些行,因为它们后面跟着数字,而正确的第一列包含时间,例如00:00:00. 有可能做到这一点pandas.read_csv吗?


例子

使用正确的文件,我的代码将如下所示:

data = io.StringIO( ''' a; b; c; d 
                    x10; 20; 30; 40
                    x11; 21; 31; 41
                    x12; 22; 32; 42
                    x13; 23; 33; 43
                    x14; 24; 34; 44
                    x15; 25; 35; 45
                 ''' )

pd.read_csv( data, sep=';' )

输出:

    a   b   c   d
0   10  20  30  40
1   11  21  31  41
2   12  22  32  42
3   13  23  33  43
4   14  24  34  44
5   15  25  35  45

问题

使用损坏的文件,它看起来像这样:

data = io.StringIO( ''' a; b; c; d 
                        x10; 20; 30; 40
                        x11; 21; 31; 41
                        x12; 22; 
                        32; 42
                        x13; 23; 33; 43
                        x14; 24; 34; 44
                        x15; 25; 35; 45
                     ''' )

pd.read_csv( data, sep=';' )

输出:

    a   b   c   d
0   x10     20  30  40.0
1   x11     21  31  41.0
2   x12     22      NaN
3   32  42  NaN     NaN
4   x13     23  33  43.0
5   x14     24  34  44.0
6   x15     25  35  45.0

然而,在这两种情况下,预期输出都是第一个。在这个例子中,我会考虑替换\r\n\d\d\d\d在pandas中构建数据框之前/期间摆脱那些换行符。

如果可能的话,我想避免先修复文件,避免在使用 pandas 阅读之前制作额外的脚本来检查所有文件,因为会定期出现新文件。


在 Pandas 中读取 csv 文件时是否可以替换部分字符串?

有没有另一种方法来解决这类问题?


使用 python 3.6.8 ,熊猫 0.24.2

标签: pythonpandascsvdataframe

解决方案


这是大型 csv 经常发生的事情。我用来解决它的方法是使用 python 读取它们并检查分隔符的数量是否符合您的预期,否则删除该行。然后,一旦原始数据得到纠正,您就可以使用StringIO. 您的错误示例的示例:

# We load the file
filestream = open(filepath)

# Now we filter the data as follows
data = filter(lambda l: l.count(";")==3, filestream)

# Now we convert to String IO
stream = io.StringIO("\n".join(data))

# And finally we read with Pandas
pd.read_csv(stream, sep=';' )

推荐阅读