[Python]CSVファイルを読み込んで、ソートして見る

CSVファイル読み込み部分も追加

では、プログラムコード中の多次元配列をソートする事例を紹介しました。CSVファイルからの読み込み部分は、比較的事例が多いので、敢えてコードを掲載しませんでしたが、友人からCSVファイルの読み込み部分も掲載して欲しい。と言う依頼があったので掲載します。

CSVファイルを読み込んで、ソートしてみる

の発展版に、CSVファイルの読み込み部分を追加してあります。CSVファイルはExcelで作成した物を想定してあります。


#!/usr/bin/python
#-*- coding: utf-8 -*-

import sys
import csv

#-----------------------------------------------------------
# sort2x2.py
#   CSVファイルを読み込んで、ソートして見る。
#-----------------------------------------------------------

# CSVファイルを読み込み、多次元配列へ格納する
def csvread(csvfile):
    csvarray = []

    try:
        csvf = open(csvfile, "r", encoding="ms932")
    except:
        print ("open error: " + csvfile)
    else:
        csvdata = csv.reader(csvf, delimiter=",")

        # 数字→数値 変換
        csvarray = []
        for row in csvdata:
            a = []
            for col in range(len(row)):
                try:
                    w = int(row[col])
                except:
                    w = row[col]
                a.append(w)
            csvarray.append(a)

        # CSVファイルをクローズ
        csvf.close()

        return csvarray

# 2次元配列のダンプ(文字列として返す)
def dump_2d(a):
    s  = "  | 0   1     2    3   4\n"
    s += "--+" + "-" * 21 + "\n"
    for k in range(len(a)):
        s += ("%2d|%2d, %2d, %s, %3d, %2d\n" % \
            (k, a[k][0], a[k][1], a[k][2], a[k][3], a[k][4]))
    return s

# 実行するコマンド
cmda = ["normal", "l_2d.sort()", "l_2d.sort(key=lambda x: x[1])",
 "l_2d.sort(key=lambda x: -x[3])", 
 "l_2d.sort(key=lambda x: (x[4], x[1]))",
 "l_2d.sort(key=lambda x: (x[2], x[1], x[3]))", 
 "l_2d.sort(key=lambda x: (x[2], -x[1], x[3]))", 
 "new_l_2d = sorted(l_2d, key=lambda x: (x[2], -x[1], x[3]))"]

# CSVファイルを読み込んで、多次元配列へ入れる
l_2d = []
csvfile = "sort2x2.csv"
l_2d = csvread(csvfile)

# 結果保存用の、テキストファイルを用意する
outfile = "sort2x2.txt"
try:
    outf = open(outfile, "w", encoding="utf_8")
except OSError:
    print ("open error: " + outfile + "\n")
else:
    # コマンドリストのループ
    for cmd in (cmda):
        # normal 以外なら、exit() を行う
        if cmd != "normal":
            exec(cmd)
        # 結果出力
        s = dump_2d(l_2d)
        print (cmd + "\n" + s)
        outf.write(cmd + "\n" + s + "\n")

    # 結果保存用ファイルクローズ
    outf.close()

sys.exit()

実行結果は、変わらないので掲載しません。sort2x2.csvは以下の通りです。


4,30,あか,300,10
2,30,しろ,100,30
9,20,あお,300,10
11,30,しろ,300,20
3,10,ちゃ,200,10
6,20,あか,200,50
8,30,ちゃ,200,10
1,20,しろ,300,50
5,30,あか,200,50
12,10,ちゃ,100,40
10,20,しろ,200,20
7,20,あお,100,40

シェアする

  • このエントリーをはてなブックマークに追加

フォローする