web-dev-qa-db-ja.com

列で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 + = date、split、sortただし、CSVテーブルの完全なエントリを再特定する必要があります。物事のリストを並べ替えるだけではありません。
  • csvには組み込みのソート機能がないようです

最適なソリューションは、データベースのようにファイルを処理するCSVクライアントを持つことです。そのようなものは見つかりませんでした。

ここで誰かがニースの並べ替えの魔法を知っていることを願っています;)

ありがとう、

マリウス

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

またはラムダを使用

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

リーダーはジェネレーターのように動作します。いくつかの偽データを含むファイル:

>>> 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']]
12
telliott99

MULTIPLE COLUMNでソートするには(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)
4
Tiina