2017-03-02 3 views
2

Ich experimentierte mit dem Lesen einer tabulatorgetrennten Tabelle in ein Listenfeld. I verwendet:Python - Listen - Formatierung als Tabelle

with open('/home/data.txt') as textFile: 
    data = [line.split() for line in textFile] 

die

ein Druck gibt mir fein gearbeitet (Hinzufügen von Zeilenumbrüchen zur besseren Lesbarkeit):

[('Col1', 'Col2', 'Col3', 'Col4'), 
('A', 1, 2, 3), 
('B', 4, 5, 6), 
('C', 11, 22, 33), 
('D', 44, 55, 66), 
('E', 1, 2), 
('F', 1, 2)] 

für die letzten beiden Zeilen sind die Werte für Col4 null gewesen .

Nun mein Problem: Ich wollte einfach eine Spalte basierend Liste erstellen, so habe ich nur einen Druck (zip (* data)) jedoch, dass dann Spalte 4 in seiner Gesamtheit unterlässt ....

[('Col1', 'A', 'B', 'C', 'D', 'E', 'F'), 
('Col2', 1, 4, 11, 44, 1, 1), 
('Col3', 2, 5, 22, 55, 2, 2)] 

ich würde so etwas wie wollen:

[('Col1', 'A', 'B', 'C', 'D', 'E', 'F'), 
('Col2', 1, 4, 11, 44, 1, 1), 
('Col3', 2, 5, 22, 55, 2, 2), 
('Col4', 3, 6, 33, 66)] 

Irgendwelche Ideen, wie man damit umgehen?

Danke!

+1

Auswahl Ihres Ausgang ist nicht unbedingt praktikabel - wenn die kurzen Reihen nicht ganz am Ende waren, Ihre Spalten würde nicht mehr Zeile nach oben aufgrund der fehlenden Gegenstände. Statt '' zip() '' versuche '' iertools.zip_longest() '' - es blendet kurze Zeilen mit None aus (oder einen anderen Wert, der durch einen '' fillvalue = '' Parameter angegeben wird). – jasonharper

Antwort

0

Um näher auf jasonharper's comment:

import itertools 
with open('/home/data.txt') as textFile: 
    data = [line.split() for line in textFile] 

transposed = list(itertools.zip_longest(*data)) 

Nun, wenn Sie print(transposed) Sie erhalten:

Out[('Col1', 'A', 'B', 'C', 'D', 'E', 'F'), ('Col2', 1, 4, 11, 44, 1, 1),('Col3', 2, 5, 22, 55, 2, 2), ('Col4', 3, 6, 33, 66, None, None)]

Wenn Sie einen optionalen fillvalue Parameter itertools.zip_longest() füttern müssen Sie einige andere Füllstoff erhalten . list(itertools.zip_longest(*data, fillvalue='a') würden Sie:

Out[('Col1', 'A', 'B', 'C', 'D', 'E', 'F'), ('Col2', 1, 4, 11, 44, 1, 1),('Col3', 2, 5, 22, 55, 2, 2), ('Col4', 3, 6, 33, 66, 'a', 'a')]

DASS gesagt, wenn Sie mit einem viel größeren csv arbeiten und dies ist ein Spielzeug Beispiel, könnten Sie pandas mit in Betracht ziehen, wie das wird dies machen zu tun Art transponieren einfacherer:

import pandas as pd 
df = pd.read_csv('/home/data.txt') 

... geben Ihnen einen Datenrahmen Objekt:

Col1 Col2 Col3 Col4 
0 A  1  2 3.0 
1 B  4  5 6.0 
2 C  11  22 33.0 
3 D  44  55 66.0 
4 E  1  2 NaN 
5 F  1  2 NaN 

df.transpose() werden Sie dann:

 0 1 2 3 4 5 
Col1 A B C D E F 
Col2 1 4 11 44 1 1 
Col3 2 5 22 55 2 2 
Col4 3 6 33 66 NaN NaN