2013-04-29 75 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