Python - 列表 - 格式化为表格

时间:2017-03-02 00:35:54

标签: python python-3.x

我尝试将制表符分隔表读入列表数组。 我用过:

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(* data)) 然而,那就完整地省略了第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 个答案:

答案 0 :(得分: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