读取CSV,将信息写入新CSV并按列排序

时间:2013-09-28 06:02:41

标签: python sorting csv

处理从csv获取值的内容并将它们在句子中写入新的csv:

import csv

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

这需要以下内容:

MPP01,RCT-6,1/6,14336,LOS UHF MCR
SIPRPP01,RCT-6,1/6,8192,SIPRNET
NIPRPP02,RCT-6,2/6,4096,NIPRNET
BSPEPP03,RCT-6,1/10,472,BSPE
DPV0PP04,1/10,2/6,472,DPV0
SIPRPP04,1/6,1/3,8192,SIPRNET
NIPRPP03,1/6,1/10,8192,NIPRNET
SIPRPP03,3/6,1/10,4096,NIPRNET
NIPRZP01,MEB,RCT-6,8192,NIPRNET
SIPRZP01,MEB,RCT-6,4096,SIPRNET

并将其写入新文件:

 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.

我正在尝试根据哪些单元的哪些任务对语句进行分组 - 我通过在第一列中编写相关单元来完成此操作,然后我可以在excel中手动排序以组合在一起每个单位的相关任务。

有没有办法让程序在将数据写入新的csv时对数据进行排序?或者有一种方法可以将它们分组:

1/6
Terminate...
Establish...

2/6 
Terminate...
Establish...
Establish...

3/6
Terminate...
Terminate...

我感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您应该将列存储在带有列表的字典中,然后将字典写入结果文件:

import csv
from collections import defaultdict

d = defaultdict(list)

with open('Links.csv', 'rb') as inf:
    reader = csv.reader(inf, delimiter=',', quoting=csv.QUOTE_NONE)
    for row in reader:
        d[row[2]].append(row)

with open('outfile.csv', 'w') as outf:
    for k,v in d.iteritems():
        outf.write('{}\n'.format(k))
        for i in v:
            up = '{1},Establish {4} link {0} at {3} Kbps to {2}.\n'
            down = up.replace('Establish','Terminate').replace('to','from')
            outf.write(up.format(*i))
            outf.write(down.format(*i))
        outf.write('\n')