2013-04-29 77 views
3

我需要将数据写在下面蟒蛇,移调号码表蟒蛇

student score 
Bill   43 
Suzy  54 
Sally  41 

但我必须甩掉它太像

student Bill Suzy Sally 
score 43 54 41 

我有这个已经写好,

ofile = open('grades','r') 
Tfile = open('Tgrades','u') 
date = [] 
while 1: 
    a = ofile.readline() 
    if a=='': 
    break 
    data.append(a.split()) 
+2

我头上形成的解决方案大量使用了“zip”内建。你知道吗?如果没有,请检查出来。这是非常有用的。 – mgilson 2013-04-29 19:20:31

回答

2
with open ('yourfile') as fin: 
    lines = (line.split() for line in fin) 
    for row in zip(*lines): 
     print ' '.join(row) 
0
>>> student =('Billy','Suzy','Sally') 
>>> score=(43,54,41) 
>>> (student,score) 
(('Billy', 'Suzy', 'Sally'), (43, 54, 41)) 

>>> flipped = zip(*(student,score)) 
>>> flipped 
[('Billy', 43), ('Suzy', 54), ('Sally', 41)] 

>>> zip(*flipped) 
[('Billy', 'Suzy', 'Sally'), (43, 54, 41)] 

您可以将矩阵转置zip(*matrix)

3

Jon Clements的答案显示了如何在您拥有数据后转置数据。

您可能还想考虑使用csv模块首先读取数据,并且您应该确定关闭文件。

import csv 
with open('grades') as fin: 
    rows = csv.reader(fin, delimiter=' ', skipinitialspace=True) 
    transposed = zip(*rows) 
    with open('tgrades', 'w') as fout: 
     w = csv.writer(fout, delimiter='\t') 
     w.writerows(transposed) 

而且一旦你了解每一行是干什么的,你可以做这个有很多更简洁:

import csv 
with open('grades') as fin, open('tgrades', 'w') as fout: 
    rows = csv.reader(fin, delimiter=' ', skipinitialspace=True) 
    csv.writer(fout, delimiter='\t').writerows(zip(*rows)) 

有一点要记住的是,你不会免费获得很好的间距。即使你没有把原来的情况排除在外,也没有什么帮助,因为这是错误的。我通过使用制表符而不是空格来解决这个问题,因为所有的值和标题都是7个字符或更少......但通常,在这种情况下(只要在编辑器中使用8个字符的制表符查看它)这个技巧是行不通的。所以,如果你真正想要的是一个人们可读的表格,它具有很好的格式,而不是在人类可读和机器可读(这是CSV是什么)之间的妥协,这不是完整的答案。

+0

不幸的是不得不保持我的答案很短 - 因为在手机上打字太可怕了。 +1为你平常的详细答案 – 2013-04-29 19:52:32

+0

@JonClements:哇,你真的在​​电话上回答SO问题吗?用代码?我无法想象甚至认真尝试,更不用说给你一个像你这样有用的答案! – abarnert 2013-04-29 19:54:37

+0

是啊 - 受虐狂,愚蠢或沉重的SO成瘾的迹象。他们没有一个很好的特征...:'( – 2013-04-29 19:58:14