2017-03-22 5 views
1

Verwendung von Python 3 und Pandas 0.19.2Python Pandas lesen Datenrahmen von benutzerdefinierten Dateiformat

Ich habe eine Protokolldatei auf diese Weise formatiert:

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

... was sehr viel ist wie eine CSV ausgenommen dass jeder Wert von [ und ] umgeben ist und es kein echtes Trennzeichen gibt. Was wäre der effizienteste Weg, um diesen Inhalt in einen Pandas DataFrame zu laden?

Antwort

2

Sie können read_csv mit Trennzeichen ][ verwenden, das durch \ escape sein muss. Dann replace Spalten und Werte, und entfernen Sie Reihe mit allen NaN von dropna:

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

Vielen Dank dafür. Ich habe nach Pandas-Parsern gesucht (https://github.com/pandas-dev/pandas/blob/v0.19.2/pandas/io/parsers.py#L494-L646) und konnte nichts richtig ableiten. .. – Guillaume

+0

Wau, nette Idee;) – jezrael

+0

Könnten Sie einfach ']' am Anfang jeder Zeile und '[' am Ende jeder Zeile hinzufügen? Dann wird es nicht nötig sein zu ersetzen. –

0

Ich glaube, Sie ] von Anfang jeder Zeile und [ vom Ende jeder Zeile entfernen und dann mit dem Begrenzer ][ lesen.

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

Ausgabe

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