2013-10-02 52 views
-1

此排序爲csv是我到目前爲止有:的Python:通過

import csv 
import operator 

with open('Links.csv', 'rb') as input_file, \ 
open('Link Statements.csv', 'w') as output_file: 

reader = csv.reader(input_file, delimiter=',', quoting=csv.QUOTE_NONE) 

for row in reader: 
    link_name, from_unit, to_unit, rate, type = row 
    output_file.write(" %s," % (from_unit)) 
    output_file.write("Establish %s link %s at %s Kbps to %s.\n" % (type, link_name, rate, to_unit)) 
    output_file.write(" %s," % (to_unit)) 
    output_file.write("Terminate %s link %s at %s Kbps from %s.\n" % (type, link_name, rate, from_unit)) 

data = csv.reader(open('Link Statements.csv'),delimiter=',') 
for unit, statement in reader: 
print unit 
sortedlist = sorted(data, key=operator.itemgetter(0), reverse=True) 
sortedlist 

我創建一個CSV文件,看起來像這樣:

RCT-6,Establish LOS UHF MCR link MPP01 at 14336 Kbps to 1/6. 
    1/6,Terminate LOS UHF MCR link MPP01 at 14336 Kbps from RCT-6. 
    RCT-6,Establish SIPRNET link SIPRPP01 at 8192 Kbps to 1/6. 
    1/6,Terminate SIPRNET link SIPRPP01 at 8192 Kbps from RCT-6. 
    RCT-6,Establish NIPRNET link NIPRPP02 at 4096 Kbps to 2/6. 
    2/6,Terminate NIPRNET link NIPRPP02 at 4096 Kbps from RCT-6. 
    RCT-6,Establish BSPE link BSPEPP03 at 472 Kbps to 1/10. 
    1/10,Terminate BSPE link BSPEPP03 at 472 Kbps from RCT-6. 
    1/10,Establish DPV0 link DPV0PP04 at 472 Kbps to 2/6. 
    2/6,Terminate DPV0 link DPV0PP04 at 472 Kbps from 1/10. 
    1/6,Establish SIPRNET link SIPRPP04 at 8192 Kbps to 1/3. 
    1/3,Terminate SIPRNET link SIPRPP04 at 8192 Kbps from 1/6. 
    1/6,Establish NIPRNET link NIPRPP03 at 8192 Kbps to 1/10. 
    1/10,Terminate NIPRNET link NIPRPP03 at 8192 Kbps from 1/6. 
    3/6,Establish NIPRNET link SIPRPP03 at 4096 Kbps to 1/10. 
    1/10,Terminate NIPRNET link SIPRPP03 at 4096 Kbps from 3/6. 
    MEB,Establish NIPRNET link NIPRZP01 at 8192 Kbps to RCT-6. 
    RCT-6,Terminate NIPRNET link NIPRZP01 at 8192 Kbps from MEB. 
    MEB,Establish SIPRNET link SIPRZP01 at 4096 Kbps to RCT-6. 
    RCT-6,Terminate SIPRNET link SIPRZP01 at 4096 Kbps from MEB. 

我想要的CSV字母數字排序在第一列,但我無法使有序列表語句正常工作。

謝謝。

+1

源csv的外觀如何?請修復您的縮進以及... – dawg

+0

當您說「我無法使排序後的語句正常工作」時,您期望它做什麼,它做了什麼? – abarnert

回答

1

你的第一個問題是:

for unit, statement in reader: 
    print unit 

reader是您爲Links.csv文件創建原來這裏的讀者。我必須猜測,因爲你的問題缺乏縮進,但我認爲這個後面的代碼不在with聲明中。如果是這樣,你試圖遍歷一個已經關閉的文件,這會引發一個異常,我認爲這是你所看到的(儘管你還沒有告訴我們這只是另一個猜測)。

如果我猜錯了,這仍然是with語句中,那麼你有一個不同問題:Link Statements.csv尚未關閉,因此它沒有被刷新,所以當你打開新的句柄,它可能沒有任何內容,或只有第一個7-1/2行或其他任何東西。如果是這種情況,只需從with中減去此代碼即可。

無論如何,你的意思可能是data,而不是reader

-

但是,如果你解決這個問題,它只會導致一個新問題。 A csv.reader迭代器 - 您只能迭代一次。所以,這會打印出每一行,然後sorted會在您已經完成所有操作後對剩餘的內容進行排序,這意味着您將得到一個空列表。

如果你真的需要打印出所有的值,然後排序的所有值,你需要把它們放入一個列表,像這樣:

data = list(csv.reader(open('Link Statements.csv'),delimiter=',')) 

雖然我們在這裏,值得注意的是你在這裏泄漏了Link Statements.csv文件;就像你之前在代碼中做的那樣,使用with語句更好。


最後,除了引用它外,最後,你不會對sortedlist做任何事情。想必print吧,用它生成一個新的CSV文件,或者做一些其他的事情,而不是什麼都不做。


你沒有給我們您的源數據,但我可以複製和您的中間數據粘貼到一種叫Link Statements.csv,然後運行代碼的下半年。如果我這樣做,那麼這條命令:

data = csv.reader(open('Link Statements.csv'),delimiter=',') 
sortedlist = sorted(data, key=operator.itemgetter(0), reverse=True) 
for item in sortedlist: 
    print item 

...我得到這個:

[' RCT-6', 'Establish LOS UHF MCR link MPP01 at 14336 Kbps to 1/6.'] 
[' RCT-6', 'Establish SIPRNET link SIPRPP01 at 8192 Kbps to 1/6.'] 
[' RCT-6', 'Establish NIPRNET link NIPRPP02 at 4096 Kbps to 2/6.'] 
[' RCT-6', 'Establish BSPE link BSPEPP03 at 472 Kbps to 1/10.'] 
[' RCT-6', 'Terminate NIPRNET link NIPRZP01 at 8192 Kbps from MEB.'] 
[' RCT-6', 'Terminate SIPRNET link SIPRZP01 at 4096 Kbps from MEB.'] 
[' MEB', 'Establish NIPRNET link NIPRZP01 at 8192 Kbps to RCT-6.'] 
[' MEB', 'Establish SIPRNET link SIPRZP01 at 4096 Kbps to RCT-6.'] 
[' 3/6', 'Establish NIPRNET link SIPRPP03 at 4096 Kbps to 1/10.'] 
[' 2/6', 'Terminate NIPRNET link NIPRPP02 at 4096 Kbps from RCT-6.'] 
[' 2/6', 'Terminate DPV0 link DPV0PP04 at 472 Kbps from 1/10.'] 
[' 1/6', 'Terminate LOS UHF MCR link MPP01 at 14336 Kbps from RCT-6.'] 
[' 1/6', 'Terminate SIPRNET link SIPRPP01 at 8192 Kbps from RCT-6.'] 
[' 1/6', 'Establish SIPRNET link SIPRPP04 at 8192 Kbps to 1/3.'] 
[' 1/6', 'Establish NIPRNET link NIPRPP03 at 8192 Kbps to 1/10.'] 
[' 1/3', 'Terminate SIPRNET link SIPRPP04 at 8192 Kbps from 1/6.'] 
[' 1/10', 'Terminate BSPE link BSPEPP03 at 472 Kbps from RCT-6.'] 
[' 1/10', 'Establish DPV0 link DPV0PP04 at 472 Kbps to 2/6.'] 
[' 1/10', 'Terminate NIPRNET link NIPRPP03 at 8192 Kbps from 1/6.'] 
[' 1/10', 'Terminate NIPRNET link SIPRPP03 at 4096 Kbps from 3/6.'] 

所以,你sorted線似乎是你想要的到底是什麼;這是一切它是你錯了。

+0

謝謝,這一切都有道理,我現在就像我想要的那樣工作。當你知道這是我第一次嘗試編寫代碼時,你可能並不會感到驚訝,但我想我已經想出了這個小小的項目。 – nort0

+0

@ nort0:那麼,你自己就擁有了所有的硬件,這只是一小堆細節。對於剛剛起步的人來說,這是你所期望的,但有可能走得更遠。 – abarnert