我尝试将制表符分隔表读入列表数组。 我用过:
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)]
任何想法如何处理?
谢谢!
答案 0 :(得分:0)
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