python,读取包含太多分隔符的CSV

时间:2017-03-17 07:39:47

标签: python csv pandas

我正在尝试使用python中的pandas读取日志文件,格式如下:

TimeStamp, Label, VarName, Data
2017-03-09 13:03:20, USER_INPUT, Name, Test 1
2017-03-09 13:03:20, USER_INPUT, ProjectNumber, 04BGA
2017-03-09 13:03:20, USER_INPUT, PasteType, Senju F100
.
.

可以正常工作,直到我达到以下类型的行:

2017-03-09 12:03:20, CASETTE_INFO, CassetteHSPGetEjectorFeedAdjust, 2,2,2,2.4,3.5,1.15,1.1

是否有可能以某种方式告诉大熊猫如果有超过3个分隔符,那么将其余部分挤在一起作为一个字符串?像

data = "2,2,2,2.4,3.5,1.15,1.1" 

或者还有其他解决方案吗?

我现在只是跳过这些线来解决问题

pd.read_csv(filename, error_bad_lines=False)) 

在我的日志文件

中解决此类问题会很好

1 个答案:

答案 0 :(得分:3)

我认为您需要更改分隔符到,\s+ - 它表示逗号包含一个或多个空格:

df = pd.read_csv(filename, sep=",\s+", engine='python')

样品:

import pandas as pd
from pandas.compat import StringIO

temp=u"""imeStamp, Label, VarName, Data
2017-03-09 13:03:20, USER_INPUT, Name, Test 1
2017-03-09 13:03:20, USER_INPUT, ProjectNumber, 04BGA
2017-03-09 13:03:20, USER_INPUT, PasteType, Senju F100
2017-03-09 12:03:20, CASETTE_INFO, CassetteHSPGetEjectorFeedAdjust, 2,2,2,2.4,3.5,1.15,1.1"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), sep=",\s+", engine='python')
print (df)
              imeStamp         Label                          VarName  \
0  2017-03-09 13:03:20    USER_INPUT                             Name   
1  2017-03-09 13:03:20    USER_INPUT                    ProjectNumber   
2  2017-03-09 13:03:20    USER_INPUT                        PasteType   
3  2017-03-09 12:03:20  CASETTE_INFO  CassetteHSPGetEjectorFeedAdjust   

                     Data  
0                  Test 1  
1                   04BGA  
2              Senju F100  
3  2,2,2,2.4,3.5,1.15,1.1  

如果1.solution不起作用,请使用不在数据中的分隔符 - ¥|,并将所有数据读取到一列data。然后使用str.split

import pandas as pd
from pandas.compat import StringIO

temp=u"""TimeStamp, Label, VarName, Data
2017-03-09 13:03:20, USER_INPUT, Name, Test 1
2017-03-09 13:03:20, USER_INPUT, ProjectNumber, 04BGA
2017-03-09 13:03:20, USER_INPUT, PasteType, Senju F100
2017-03-09 12:03:20, CASETTE_INFO, CassetteHSPGetEjectorFeedAdjust, 2,2,2,2.4,3.5,1.15,1.1"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), sep = '¥', names=['data'], skiprows=1)
print (df)
                                                data
0      2017-03-09 13:03:20, USER_INPUT, Name, Test 1
1  2017-03-09 13:03:20, USER_INPUT, ProjectNumber...
2  2017-03-09 13:03:20, USER_INPUT, PasteType, Se...
3  2017-03-09 12:03:20, CASETTE_INFO, CassetteHSP...

df = df.data.str.split(',', n=3, expand=True)
df.columns = ['TimeStamp','Label','VarName','Data']
print (df)
             TimeStamp          Label                           VarName  \
0  2017-03-09 13:03:20     USER_INPUT                              Name   
1  2017-03-09 13:03:20     USER_INPUT                     ProjectNumber   
2  2017-03-09 13:03:20     USER_INPUT                         PasteType   
3  2017-03-09 12:03:20   CASETTE_INFO   CassetteHSPGetEjectorFeedAdjust   

                      Data  
0                   Test 1  
1                    04BGA  
2               Senju F100  
3   2,2,2,2.4,3.5,1.15,1.1