2017-03-22 23 views
1

使用Python 3和熊猫0.19.2Python的大熊猫读取自定义文件格式的数据帧

我有格式化这样一个日志文件:

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

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

回答

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') 
+0

感谢你为这个。我正在研究熊猫解析器(https://github.com/pandas-dev/pandas/blob/v0.19.2/pandas/io/parsers.py#L494-L646),我无法正确地分类任何东西。 .. – Guillaume

+0

Wau,不错的主意;) – jezrael

+0

你可以在每一行的开头加'''和'['到每一行的结尾?那么就没有必要更换了。 –

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