演習8: File I/Oの利用とこれまでの復習(CSV形式データの読み込みと集計処理)


ペアのdriver担当

達成目標


演習8: CSV形式データの読み込みと集計処理を実装してみよう。


演習8.1: CSVファイルを読み込みモードで開き、中身を返す関数read_csvfile()を作成せよ。

# read_csvfile() の実行例
# (以下はインタプリタの例だが、実行結果を確認できるならスクリプトファイルでもOK)
>>> filename = 'score.csv'
>>> data = read_csvfile(filename)
>>> print(len(data))
6
>>> print(data)
['account,report1_score,report2_score,report3_score\n', 'e175701,95,89,89\n', 'e175702,81,89,79\n', 'e175703,70,60,60\n', 'e175704,110,95,100\n', 'e175705,0,0,0\n']

演習8.2: read_csvfile()で読み込んだデータには、行末の改行コード\nが含まれている。read_csvfile()を修正して、行末コードを削除した要素となるようにせよ。

# 修正版 read_csvfile() の実行例
>>> data = read_csvfile(filename)
>>> print(data)
['account,report1_score,report2_score,report3_score', 'e175701,95,89,89', 'e175702,81,89,79', 'e175703,70,60,60', 'e175704,110,95,100', 'e175705,0,0,0']

演習8.3: 読み込んだデータを処理しやすい形にいくつかの前処理をする関数 preprocess() を作成せよ。

# preprocess()の実行例
>>> data = read_csvfile(filename)
>>> target = preprocess(data)
>>> len(target)
5
>>> print(target)
[['e175701', 95, 89, 89], ['e175702', 81, 89, 79], ['e175703', 70, 60, 60], ['e175704', 110, 95, 100], ['e175705', 0, 0, 0]]
# 実行例2
# preprocess()相当の機能を複数の関数に分割して実装した例。
# 実行例1, 実行例2のように、最終出力が同一であれば関数設計は自由で構わない。
>>> data = read_csvfile(filename)
>>> data2 = remove_comment_line(data)
>>> print(data2)
['e175701,95,89,89', 'e175702,81,89,79', 'e175703,70,60,60', 'e175704,110,95,100', 'e175705,0,0,0']
>>> data3 = split_data(data2)
>>> print(data3)
[['e175701', '95', '89', '89'], ['e175702', '81', '89' , '79'], ['e175703', '70', '60', '60'], ['e175704', '110', '95', '100'], ['e175705', '0', '0', '0']]
>>> target = scores_to_int(data3)
>>> print(target)
[['e175701', 95, 89, 89], ['e175702', 81, 89 , 79], ['e175703', 70, 60, 60], ['e175704', 110, 95, 100], ['e175705', 0, 0, 0]]

演習8.4: 学生個々人の最小・平均・最大点数を算出する関数 analysis() を作成せよ。

# analysis()の実行例
>>> data = read_csvfile(filename)
>>> target = preprocess(data)
>>> result = analysis(target)
>>> result
[['e175701', 89, 91.0, 95], ['e175702', 79, 83.0, 89], ['e175703', 60, 63.333333333333336, 70], ['e175704', 95, 101.66666666666667, 110], ['e175705', 0, 0.0, 0]]

演習8.5: 分析結果をファイルにCSV形式で出力する関数 output() を作成せよ。

>>> data = read_csvfile(filename)
>>> target = preprocess(data)
>>> result = analysis(target)
>>> out_filename = 'result.csv'
>>> output(result, out_filename)
>>>
# ターミナル上の出力なし。

演習8.6: ドキュメントとユニットテストの作成。


(余裕のあるペア向け) 演習8.x: 辞書型を使ってみよう。