我正在尝试使用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))
在我的日志文件
中解决此类问题会很好答案 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