LEVEL 6 ・ ファイル / Lesson 12

CSVを読んで、集計して、書き出す

売上のCSVを1行ずつ読み、部署別に合計し、結果を新しいCSVに書き出します。

目安 20分 ・ インストール不要

このレッスンが終わったら

「CSVは、1行ずつ辞書として読める。数字は文字で入ってくるので、int() で変換してから計算する」と言える。

STEP 1

できることを見る

Excelから「CSV」という形式で保存したファイルを、Pythonで読んでみましょう。ここに、3か月分の売上が入った sales.csv があります。

sales.csvサンプルファイル
月,部署,売上
1月,営業,320000
1月,企画,150000
2月,営業,410000
2月,企画,180000
3月,営業,380000
3月,企画,210000

1行目が「見出し」、2行目からがデータです。項目は、カンマ(,)で区切られています。

Pythonでは、CSVを次のように読みます。1行ずつ、見出しの名前を使って取り出せます。

import csv

with open("sales.csv", encoding="utf-8") as f:
    for row in csv.DictReader(f):
        print(row["月"], row["部署"], row["売上"])
STEP 2

動かしてみる

CSVを1行ずつ読むサンプルファイル付き・書き換えOK
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

6行分のデータが、表示されましたか。Excelで見ていた表の各行を、Pythonが1行ずつ取り出してくれました。

STEP 3

1行ずつ読む

1行ずつ日本語にしてみる
import csvCSVを扱うための、便利機能セット(ライブラリ)を使う
with open("sales.csv", encoding="utf-8") as f:sales.csv を開いて、「f」と呼ぶ
for row in csv.DictReader(f):fの中身を、見出し付きで1行ずつ取り出して、「row」と呼ぶ
print(row["月"], row["部署"], row["売上"])取り出した1行から、「月」「部署」「売上」の中身を取り出して、表示する

日本語にすると

sales.csv を開いて、1行ずつ取り出します。取り出した行から、月・部署・売上の中身を表示してください。

row の正体は、Lesson 08 で学んだ辞書です。たとえば1行目は、{"月": "1月", "部署": "営業", "売上": "320000"} という形をしています。だから、row["売上"] のように、見出しの名前で中身を取り出せるのです。

STEP 4

1か所だけ変える

① 売上を、全部足す。 売上を合計してみましょう。ここに、大事な落とし穴があります。CSVから読んだ値は、数字に見えても、じつは文字です。そのため、int()(数字に変える)を付けてから足します。

売上の合計を出すサンプルファイル付き・書き換えOK
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

② 条件に合う行だけ足す。 LEVEL 2 の if を組み合わせると、「営業部だけの合計」も出せます。

営業部だけの合計サンプルファイル付き・書き換えOK
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

③ int() を忘れると? わざと外して、エラーを出してみましょう。

int を付け忘れた場合サンプルファイル付き・書き換えOK
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

TypeError(文字と数字は足せません)と出ます。エラー講座のTypeErrorと同じです。直し方は、int(row["売上"]) + 1000 です。

④ 結果をCSVに書き出す。 集計した結果を、新しいCSVに書き出します。

集計結果をCSVに書くコードは書き換えられます
Ctrl / ⌘ + Enter でも実行
結果
▶ 実行を押すと、ここに結果が出ます

writer.writerow([...]) は、リストを1行として書き込みます。newline="" は、CSVを書くときのおまじないです。

STEP 5

自分で書く

お題① 「企画部」の売上の合計を表示してください。(正解は540000です)

お題①:企画部の合計サンプルファイル付き・書き換えOK
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます
ヒントを見る

if row["部署"] == "企画": に変えて、int(row["売上"]) を足していきます。最後に print(total) を書くのを忘れずに。

答えの例を見る
import csv

total = 0
with open("sales.csv", encoding="utf-8") as f:
  for row in csv.DictReader(f):
      if row["部署"] == "企画":
          total = total + int(row["売上"])
print(total)

お題② 売上が40万円(400000)以上の行について、月と部署を表示してください。

お題②:40万円以上の行サンプルファイル付き・書き換えOK
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます
ヒントを見る

if int(row["売上"]) >= 400000: の中で、print(row["月"], row["部署"]) と書きます。

答えの例を見る
import csv

with open("sales.csv", encoding="utf-8") as f:
  for row in csv.DictReader(f):
      if int(row["売上"]) >= 400000:
          print(row["月"], row["部署"])
STEP 6

仕事ならどう使う?