我有一个带有一些数据行的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
但它不起作用。
答案 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