代码之家  ›  专栏  ›  技术社区  ›  wishi

按列对csv排序

  •  22
  • wishi  · 技术社区  · 15 年前

    我想按日期对csv表进行排序。从一项简单的任务开始:

    import sys
    import csv
    
    reader = csv.reader(open("files.csv"), delimiter=";")
    
    for id, path, title, date, author, platform, type, port in reader:
        print date
    

    我使用python的csv模块读取具有该结构的文件:

    id;file;description;date;author;platform;type;port
    
    • 日期是ISO-8601,因此我可以很容易地对其进行排序而不需要解析:2003-04-22例如。
    • 我想先按日期、最新条目排序
    • 如何将此阅读器放入可排序的数据结构中?我想通过一些努力,我可以创建一个日期列表:datelist+=date,split和sort。但是,我必须重新识别csv表中的完整条目。它不仅仅是对一系列事情进行排序。
    • csv似乎没有内置的排序功能

    最佳解决方案是让一个csv客户机像处理数据库一样处理文件。我没有找到那样的东西。

    我希望有人知道这里有一些很好的分类魔法;)

    谢谢,

    马吕斯

    3 回复  |  直到 7 年前
        1
  •  53
  •   Tomasz Jakub Rup    9 年前
    import operator
    sortedlist = sorted(reader, key=operator.itemgetter(3), reverse=True)
    

    或使用lambda

    sortedlist = sorted(reader, key=lambda row: row[3], reverse=True)
    
        2
  •  11
  •   Community CDub    8 年前

    读者就像发电机。在包含一些假数据的文件上:

    >>> import sys, csv
    >>> data = csv.reader(open('data.csv'),delimiter=';')
    >>> data
    <_csv.reader object at 0x1004a11a0>
    >>> data.next()
    ['a', ' b', ' c']
    >>> data.next()
    ['x', ' y', ' z']
    >>> data.next()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    

    将operator.itemgetter用作 Ignacio 建议:

    >>> data = csv.reader(open('data.csv'),delimiter=';')
    >>> import operator
    >>> sortedlist = sorted(data, key=operator.itemgetter(2), reverse=True)
    >>> sortedlist
    [['x', ' y', ' z'], ['a', ' b', ' c']]
    
        3
  •  4
  •   Foreever    7 年前

    排序依据 多列 排序 column_1 ,然后按排序 column_2 )

    with open('unsorted.csv',newline='') as csvfile:
        spamreader = csv.DictReader(csvfile, delimiter=";")
        sortedlist = sorted(spamreader, key=lambda row:(row['column_1'],row['column_2']), reverse=False)
    
    
    with open('sorted.csv', 'w') as f:
        fieldnames = ['column_1', 'column_2', column_3]
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()
        for row in sortedlist:
            writer.writerow(row)