2017-03-22 36 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