从CSV打印排序数据

时间:2013-03-17 21:12:20

标签: python sorting csv

我有一个带有一些数据行的CSV文件,如果用Python打印,我将看起来像这样:

['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

但它不起作用。

2 个答案:

答案 0 :(得分: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查找,这是内联函数lambda所做的。它基本上告诉sort函数使用每个内部列表的第二个元素来对外部列表进行排序。

请注意,sort()就地排序这意味着它不会返回已排序的列表 - 事实上,它会返回None,这会导致意外当你尝试这个:

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

现在rows将是None。如果您希望将未排序列表和排序列表分开,请使用sorted(),但请确保分配结果 - 如下所示:

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

答案 1 :(得分:1)

Errrrm看起来像是在尝试对字符串^ _ ^进行排序 来自这里的文档: http://docs.python.org/2/library/csv.html

当您遍历csvreader时,您会一次获得一行... 所以,当你说我[1] .sort() 我[1] =' 1' (csv第一行中的第一个值)

所以试试这个:

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

编辑 - 刚注意到文件:P