2010-01-20 87 views
19

我想按日期對CSV表進行排序。開始時是一個簡單的任務:按列分類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 e。 G。
  • 我想按日期排序,最新的條目第一個
  • 我如何讓這個閱讀器進入一個可排序的數據結構?我想我可以做一個日期列表:datelist + =日期,分割和排序。但是,我必須重新標識CSV表中的完整條目。這不僅僅是對事物清單進行排序。
  • CSV似乎並未有在排序功能

最佳的解決辦法是有一個CSV客戶端處理諸如數據庫文件建立。我沒有找到這樣的事情。

我希望有人知道這裏一些不錯的排序魔術;)

感謝,

馬呂斯

+2

如果您只是想要一個工具來對CSV文件進行排序,請參閱http://code.google.com/p/csvfix/上的我的FOSS項目csvfix/ – 2010-01-20 09:54:14

回答

47
import operator 
sortedlist = sorted(reader, key=operator.itemgetter(3), reverse=True) 

或使用拉姆達

sortedlist = sorted(reader, key=lambda row: row[3], reverse=True) 
+0

這是重寫該文件,還是隻保存排序列表變量? – Jeff 2014-04-16 18:11:42

+1

@Jeff:它不會觸及原始文件。如果你想寫出結果,那麼你必須做一個單獨的操作。 – 2014-04-16 20:50:52

+0

@ IgnacioVazquez-Abrams這兩種方法有什麼區別,它們在做什麼?應該選擇哪一個? – abaumg 2017-07-28 10:20:44

11

讀者的作用就像一臺發電機。在與一些假數據的文件:

>>> 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']] 
2

多列的情況下,分揀

with open('xxx.csv',newline='') as csvfile: 
    spamreader = csv.DictReader(csvfile, delimiter=";") 
    sortedlist = sorted(spamreader, key=lambda row:(row['title'],row['date']), reverse=False) 

它首先排序通過title,然後按date排序。