次のようなcsvファイルがあり、ヘッダーの位置を変えずにソートを行いたくなりました。
そこで、自由にソートを行えるように簡単なソート関数を作成しました。
test.csv(元)
No, 名前 ,算数,国語,理科,社会
1, taro , 50, 50, 50, 50
2, jiro , 98, 10, 90, 10
3, saburou , 10, 76, 62, 50
4, mike , 16, 88, 91, 90
5, dekisugi ,100,100,100,100
6, madao , 2, 3, 5, 7
CSVソート関数
CSVソートプログラムの内容は次のようになります。
csv_sort.py
import os
import csv
import pathlib
import operator
# カレントディレクトリにtest.csvがあることを教える
current_path = os.path.dirname(__file__)
csv_file = pathlib.Path(current_path, 'test.csv')
# sort_rowで指定した列を並び替える関数
def sort_csv(csv_file: pathlib, sort_row: int, desc: bool = False):
'''
第一引数:編集するCSVファイルをフルパスで指定
第二引数:ソートする列を数字で指定(左から0,1,2・・・)
第三引数:昇順(False)降順(True)を指定
'''
# 今回作成したuser_list_csvを開く
csv_data = csv.reader(open(csv_file), delimiter=',')
# ヘッダー情報を取得
header = next(csv_data)
# ヘッダー以外の列を並び替える
sort_result = sorted(csv_data, reverse=desc, key=operator.itemgetter(sort_row))
# 新規ファイルとしてuser_list_csvを開く
with open(csv_file, "w") as f:
# ヘッダーと並び替え結果をファイルに書き込む
data = csv.writer(f, delimiter=',')
data.writerow(header)
for r in sort_result:
data.writerow(r)
if __name__ == '__main__':
# csvをソートする関数を実行
sort_csv(csv_file, 2, False)
上記は算数
列を昇順ソートしています。実行結果は次の通りです。
test.csv(実行結果)
No, 名前 ,算数,国語,理科,社会
6, madao , 2, 3, 5, 7
3, saburou , 10, 76, 62, 50
4, mike , 16, 88, 91, 90
1, taro , 50, 50, 50, 50
2, jiro , 98, 10, 90, 10
5, dekisugi ,100,100,100,100
今度は国語
の列を降順にてみます。
そこでファイル末尾のcsv_sort()関数を次のように設定します。
国語の列は3番目(0から数えて)なので第二引数に3を指定。
降順にソートしたい場合、第三引数をTrue
とします。(昇順はFalse)
csv_sort(csv_file, 3, True)
test.csv(実行結果)
No, 名前 ,算数,国語,理科,社会
5, dekisugi ,100,100,100,100
4, mike , 16, 88, 91, 90
3, saburou , 10, 76, 62, 50
1, taro , 50, 50, 50, 50
2, jiro , 98, 10, 90, 10
6, madao , 2, 3, 5, 7