Python pandas从自定义文件格式读取数据帧

时间:2017-03-22 14:33:11

标签: pandas parsing dataframe

使用Python 3和pandas 0.19.2

我有一个以这种方式格式化的日志文件:

[Header1][Header2][Header3][HeaderN]
[=======][=======][=======][=======]
[Value1][Value2][Value3][ValueN]
[AnotherValue1][ValuesCanBeEmpty][][]
...

...这非常类似于CSV,每个值都被[]包围,并且没有真正的分隔符。 将该内容加载到pandas DataFrame中的最有效方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以read_csv使用分隔符][\必须将其转义。然后是replace列和值,并按dropna删除所有NaN的行:

import pandas as pd
from pandas.compat import StringIO

temp=u"""[Header1][Header2][Header3][HeaderN]
[=======][=======][=======][=======]
[Value1][Value2][Value3][ValueN]
[AnotherValue1][ValuesCanBeEmpty][][]"""

#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), sep="\]\[", engine='python')
df.columns = df.columns.to_series().replace(['^\[', '\]$'],['',''], regex=True)
df = df.replace(['^\[', '\]$', '=', ''], ['', '', np.nan, np.nan], regex=True)
df = df.dropna(how='all')
print (df)
         Header1           Header2 Header3 HeaderN
1         Value1            Value2  Value3  ValueN
2  AnotherValue1  ValuesCanBeEmpty     NaN     NaN

print (df.columns)
Index(['Header1', 'Header2', 'Header3', 'HeaderN'], dtype='object')

答案 1 :(得分:0)

我认为您可以从每行的开头删除],从每行的末尾删除[,然后使用分隔符][进行阅读。

s ='''[Header1][Header2][Header3][HeaderN]
[=======][=======][=======][=======]
[Value1][Value2][Value3][ValueN]
[AnotherValue1][ValuesCanBeEmpty][][]'''
f = StringIO(s)

s1 = ''.join([line.lstrip('[').rstrip('\n]') + '\n' for line in f.readlines()])
pd.read_csv(StringIO(s1), sep='\]\[', engine='python')

输出

         Header1           Header2  Header3  HeaderN
0        =======           =======  =======  =======
1         Value1            Value2   Value3   ValueN
2  AnotherValue1  ValuesCanBeEmpty      NaN      NaN