2013-10-02 120 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