2013-10-02 2 views
-1

Это то, что я до сих пор:Python: Сортировка CSV по столбцам

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 в алфавитном по первому столбцу, но я не могу заставить оператор sortedlist работать.

Спасибо.

+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

Смежные вопросы