сортировать CSV по столбцу - PullRequest
25 голосов
/ 20 января 2010

Я хочу отсортировать таблицу 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

Я использовал CSV-модуль Python для чтения файла с такой структурой:

id;file;description;date;author;platform;type;port
  • Дата - ISO-8601, поэтому я могу легко разобрать ее без разбора: 2003-04-22 e. г.
  • Я хочу отсортировать по дате, сначала новые записи
  • Как мне включить этот читатель в сортируемую структуру данных? Я думаю, что с некоторыми усилиями я мог бы создать список дат: datelist + = date, split и sort. Однако я должен повторно идентифицировать полную запись в таблице CSV. Это не просто сортировка списка вещей.
  • У csv нет встроенной функции сортировки

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

Надеюсь, здесь кто-нибудь знает какую-нибудь хорошую магию сортировки;)

Спасибо

Marius

Ответы [ 3 ]

59 голосов
/ 20 января 2010
import operator
sortedlist = sorted(reader, key=operator.itemgetter(3), reverse=True)

или используйте лямбду

sortedlist = sorted(reader, key=lambda row: row[3], reverse=True)
11 голосов
/ 20 января 2010

Считыватель действует как генератор. Для файла с некоторыми поддельными данными:

>>> 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 в качестве Игнасио предлагает:

>>> 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']]
4 голосов
/ 16 мая 2017

Сортировать по НЕСКОЛЬКО КОЛОНН (Сортировать по 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...