第23回|Python総合演習:CSVファイルを読み込んで集計しよう|csvモジュールと平均計算をやさしく実践|はじめてのPython

当サイトでは、コンテンツの一部に広告を掲載しています。
第23回|Python総合演習:CSVファイルを読み込んで集計しよう|csvモジュールと平均計算をやさしく実践|はじめてのPython

はじめてのPython | 第23回

目次

1. はじめに

この回では、CSVファイルを読み込んで集計する総合演習を行います。前回は、入力、リスト、ファイル書き込み、関数を組み合わせてメモを保存するプログラムを作りました。

今回は、ファイル読み込み、csv モジュール、数値変換、合計と平均の計算を組み合わせます。複数の基本をつなげて、表形式のデータを扱う流れを確認します。

2. この回で学ぶこと

  • CSVとは何か
  • csv モジュールの使い方
  • ファイル読み込み
  • 数値変換
  • 合計・平均の計算

3. 概念の説明

CSVは、データをカンマで区切って保存する形式です。たとえば、次のような内容です。

name,score
田中,80
佐藤,95
鈴木,70

1行目は見出しで、2行目以降にデータが入っています。

PythonでCSVを扱うときは、csv モジュールを使うと便利です。

import csv

CSVファイルを読み込む基本形は次のようになります。

import csv

with open("scores.csv", "r", encoding="utf-8") as file:
    reader = csv.reader(file)

    for row in reader:
        print(row)

csv.reader(file) は、CSVの各行をリストとして読み取ります。たとえば、田中,80 の行は ["田中", "80"] という形になります。

ただし、CSVから読み込んだ値は文字列です。そのため、点数を計算に使いたいときは、int() で数値に変換する必要があります。

score = int(row[1])

合計を求めるときは、変数に足していきます。平均を求めるときは、合計を件数で割ります。

total = total + score
average = total / count

このように、CSV読み込み、数値変換、集計を順番につなげることで、表形式のデータを処理できます。

4. サンプルコード

次のコードを見てください。

import csv


total = 0
count = 0

with open("scores.csv", "r", encoding="utf-8") as file:
    reader = csv.reader(file)
    next(reader)

    for row in reader:
        score = int(row[1])
        total = total + score
        count = count + 1


average = total / count

print("合計:", total)
print("平均:", average)

このコードでは、CSVファイルの2列目にある点数を読み取り、合計と平均を計算しています。next(reader) は、見出しの1行目を読み飛ばすために使っています。

5. 実行手順

まず、scores.csv というファイルを作ります。

touch scores.csv

scores.csv をエディターで開き、次の内容を書いて保存します。

name,score
田中,80
佐藤,95
鈴木,70

次に、csv_summary.py というファイルを作ります。

touch csv_summary.py

csv_summary.py をエディターで開き、次のコードを書いて保存します。

import csv


total = 0
count = 0

with open("scores.csv", "r", encoding="utf-8") as file:
    reader = csv.reader(file)
    next(reader)

    for row in reader:
        score = int(row[1])
        total = total + score
        count = count + 1


average = total / count

print("合計:", total)
print("平均:", average)

保存したら、ターミナルで次のコマンドを実行します。

python3 csv_summary.py

実行結果は次のようになります。

合計: 245
平均: 81.66666666666667

6. コードの読み方

  • import csv は、CSVファイルを扱うための csv モジュールを読み込んでいます。
  • total = 0count = 0 は、合計点と件数を数えるための変数です。
  • with open("scores.csv", "r", encoding="utf-8") as file: は、scores.csv を読み込みモードで開いています。
  • reader = csv.reader(file) は、CSVファイルを1行ずつ読み取る準備をしています。
  • next(reader) は、最初の1行を先に読み進めています。
  • 今回は1行目が見出しなので、計算に使わないために読み飛ばしています。
  • for row in reader: は、2行目以降のデータを1行ずつ取り出しています。
  • row はリストで、たとえば ["田中", "80"] のような形です。
  • score = int(row[1]) は、2列目の点数を取り出して整数に変換しています。
  • row[1] は文字列なので、そのままでは数値計算に使えません。
  • total = total + score は合計を増やしています。
  • count = count + 1 は、何件読んだかを数えています。
  • 最後の average = total / count で平均を求めています。
  • そのあとで print() を使って、合計と平均を表示しています。

7. 初学者がつまずきやすい点

  • CSVはカンマ区切りのデータ形式
  • csv.reader() で各行をリストとして読める
  • 読み込んだ値は文字列なので、点数は int() で変換する必要がある
  • 見出し行がある場合は、そのまま計算に使わない
  • 合計と平均を出すには、合計だけでなく件数も必要

特に、row[1] は見た目が数字でも文字列です。そのため、計算前に int(row[1]) と書く必要があります。

また、見出しを読み飛ばさずに int(row[1]) を実行すると、"score" を数値に変換しようとしてエラーになります。

8. よくあるエラー

1つ目は、見出し行をそのまま数値変換してしまう場合です。

for row in reader:
    score = int(row[1])

1行目が name,score のままだと、次のようなエラーになります。

ValueError: invalid literal for int() with base 10: 'score'

この場合は、next(reader) で見出しを読み飛ばす必要があります。

2つ目は、数値変換をしていない場合です。

score = row[1]
total = total + score

このときは、次のようなエラーになります。

TypeError: unsupported operand type(s) for +: 'int' and 'str'

row[1] は文字列なので、int(row[1]) としてから足す必要があります。

3つ目は、CSVファイルが存在しない場合です。

with open("no_scores.csv", "r", encoding="utf-8") as file:
    reader = csv.reader(file)

このときは、次のようなエラーになります。

FileNotFoundError: [Errno 2] No such file or directory: 'no_scores.csv'

ファイル名が正しいか、保存場所が同じかを確認する必要があります。

9. 練習用コード

次のコードを practice_csv_summary.py として保存して実行してください。

import csv


total = 0
count = 0

with open("scores.csv", "r", encoding="utf-8") as file:
    reader = csv.reader(file)
    next(reader)

    for row in reader:
        score = int(row[1])
        total = total + score
        count = count + 1


print("件数:", count)
print("合計:", total)

実行したあとで、件数と合計が正しく表示されることを確認してください。

余裕があれば、平均も表示するコードを追加してください。

10. この回で理解しておくこと

  • CSVはカンマ区切りのデータ
  • csv モジュールでCSVを読み込める
  • CSVから読んだ値は文字列なので、必要に応じて数値変換する
  • 合計を出すには足し算を繰り返す
  • 平均を出すには合計と件数の両方が必要

11. まとめ

今回は、CSVファイルを読み込んで集計する総合演習を行いました。csv モジュール、ファイル読み込み、数値変換、合計と平均の計算を組み合わせることで、表形式のデータを処理できます。

ここまでで、入力、リスト、辞書、関数、ファイル操作、エラー処理など、基本的な部品がそろっています。次回は最後に、これまで学んだ内容を全体として整理します。

12. 次回予告

次回は、この連載のまとめです。Pythonの基本をどう組み合わせて使うかを振り返り、次に学ぶ候補も確認します。

復習してみよう

復習したい方は、こちらもあわせてご覧ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

Created by UNIX Cafe

目次