【问题标题】:Printing sorted data from CSV从 CSV 打印排序的数据
【发布时间】:2013-03-06 04:01:52
【问题描述】:

我有一个包含一些数据行的 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

但它不起作用。

【问题讨论】:

  • .sort() 需要一个 key kwarg,您必须使用它来告诉它要排序的元素。

标签: python sorting csv


【解决方案1】:

首先,您应该使用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() 是一个就地排序,这意味着它不会返回已排序的列表 - 事实上,它会返回 None,这会在您尝试此操作时导致意外:

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

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

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

【讨论】:

  • 为什么不在 csvdata 上使用 sorted 呢? (而rows 无论如何都可以写成rows = list(csvdata)
  • @JonClements 与 OP 的尝试保持一致。感谢list() 的想法,我总是忘记那个。
  • 如果您使用的是 csv.reader,文件应该用“rb”打开。
  • @monkut 不一定 - csv.writer 推荐 rb
  • csv.writer 不会是“wb”吗?
【解决方案2】:

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

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

所以试试这个:

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

编辑—— 刚刚注意到文件的事情:P

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多