2017-03-02 44 views
2

我嘗試將製表符分隔表讀入列表數組中。 我用:Python - Lists - 格式化爲表

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

是工作的罰款

打印給我這個(添加換行符以提高可讀性):

[('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)] 

最後兩行COL4的價值已空。

現在我的問題: 我想簡單地創建基於列的列表,所以我只是做了一個打印(ZIP(*數據)) 不過是再在其全部省略列4 ....

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

我想是這樣的:

[('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)] 

任何想法如何處理這個問題?

謝謝!

+1

你的要求的輸出並不一定是可行的 - 如果短行不是在最後,你列將不再排隊,由於丟失物品。嘗試''itertools.zip_longest()''而不是''zip()'',它用None填充短行(或者由'fillvalue =''參數指定的另一個值)。 – jasonharper

回答

0

爲了詳細說明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)) 

現在,如果你print(transposed),你會得到:

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

如果你給一個可選fillvalue參數itertools.zip_longest()你會得到一些其他的填料。 list(itertools.zip_longest(*data, fillvalue='a')會給你:

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

THAT說,如果你有一個更大的CSV工作,這是一個玩具例如,你可能要考慮使用pandas,因爲這將使這樣做那種簡單的轉置:

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

...會給你一個數據框對象:

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()會給你:

 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