4

我需要用python写下面的数据,

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())
4

3 回答 3

5
with open ('yourfile') as fin:
   lines = (line.split() for line in fin)
   for row in zip(*lines):
       print ' '.join(row)
于 2013-04-29T19:23:50.310 回答
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))

要记住的一件事是,您不会免费获得良好的间距。即使您没有丢弃原始案例中排列的所有间距,它也无济于事,因为它的数量是错误的。我通过使用制表符而不是空格来解决这个问题,这在这种情况下有效(只要您在带有 8 个字符制表符的编辑器中查看它),因为您所有的值和标题都是 7 个字符或更少……但总的来说,这个技巧行不通。因此,如果您真正想要的是具有良好格式的人类可读表格,而不是人类可读和机器可读(这就是 CSV)之间的良好折衷,那么这不是全部答案。

于 2013-04-29T19:49:56.983 回答
1
>>> 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)

于 2013-04-29T19:42:11.787 回答