Подтвердить что ты не робот

Сортировать 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. г.
  • Я хочу сортировать по дате, сначала вносить новые записи
  • Как мне получить этот читатель в сортируемую структуру данных? Я думаю, что с некоторыми усилиями я мог бы создать datelist: datelist + = date, split и sort. Однако мне нужно повторно идентифицировать полную запись в таблице CSV. Это не просто сортировка списка вещей.
  • csv, похоже, не имеет встроенной функции сортировки

Оптимальным решением было бы иметь клиент CSV, который обрабатывает файл как базу данных. Я не нашел ничего подобного.

Я надеюсь, что кто-то знает чудесную магию сортировки здесь;)

Спасибо,

Мариус

4b9b3361

Ответ 1

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

или используйте lambda

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

Ответ 2

Читатель действует как генератор. В файле с некоторыми поддельными данными:

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

в случае сортировка МНОГОКРАТНОЙ КОЛОНКИ:

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.