2022.03.12  

【Python】ヘッダー入りCSVファイルを昇順、降順でソートする

Python    

次のような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
コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信