2013-03-17 2 views
0

У меня есть файл CSV с некоторыми строк данных, которые я, если напечатанных в Python, будет выглядеть следующим образом:Печать отсортирован данные из CSV

['1', 'George Washington', '1789-04-30', '1797-03-04', 'Independent ', 'Virginia'] 
['2', 'John Adams', '1797-03-04', '1801-03-04', 'Federalist ', 'Massachusetts'] 
['3', 'Thomas Jefferson', '1801-03-04', '1809-03-04', 'Democratic-Republican ', 'Virginia'] 
['4', 'James Madison', '1809-03-04', '1817-03-04', 'Democratic-Republican ', 'Virginia'] 

Мне нужно напечатать эти 4 строки снова, но на этот раз отсортировано по второй элемент. Я пробовал этот код:

import csv 
csvdata=csv.reader(file('presidents.csv')) 
for i in csvdata: 
    i[1].sort() 
    print i 

Но это не сработало.

+3

'.sort()' 'принимает key' kwarg, который вы должны использовать, чтобы сказать ему, что элемент для сортировки. – bernie

ответ

4

Во-первых, вы должны использовать open, а не file. Чтобы отсортировать что-то, вам нужно дать ему коллекцию вещей для сортировки; попробуйте эту версию вместо:

with open('presidents.csv') as f: 
    csvdata = csv.reader(f) 
    rows = list(csvdata) 

# sort the rows in-place 

rows.sort(key=lambda x: x[1]) 

print rows 

Вы должны предоставить пользовательские key поиск, который является тем, что делает встроенная лямбда-функции. Он в основном сообщает функции сортировки использовать второй элемент каждого внутреннего списка для сортировки внешнего списка.

Имейте в виду, что sort() на месте рода это означает, что он не возвращает отсортированный список - на самом деле, она возвращает None, что приводит к сюрпризам, когда вы попробуете это:

rows = rows.sort(key=lambda x: x[1]) 

Теперь rows будет None. Если вы хотите иметь несортированный список и отсортированный список отдельно, используйте sorted(), но убедитесь, что вы назначаете результат - как это:

sorted_rows = sorted(rows, key=lambda x: x[1])) 
+4

Почему бы просто не использовать 'sorted' на' csvdata'? (и 'rows' может быть помещен как' rows = list (csvdata) 'во всяком случае) –

+0

@JonClements в соответствии с тем, что пытался проверить OP. Спасибо за идею 'list(), я всегда забываю ее. –

+0

файл должен быть открыт с помощью «rb», если вы используете csv.reader. – monkut

1

Errrrm выглядит, как вы пытаетесь разобраться строку^_^ Из Документы здесь: http://docs.python.org/2/library/csv.html

когда перебирать CSVReader вы получите на строки по одному ... Так что, когда вы говорите, я [1] .sort() я [1] = '1' (The первое значение в первом ряду csv)

Так что попробуйте t его:

import csv 
fh = open('presidents.csv','rt') 
csvdata=csv.reader(fh) 
for row in csvdata: 
    row.sort() 
    print row 

Edit - Просто Заметили файл вещь: P

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