LEVEL 6 ・ ファイル / Lesson 12
CSVを読んで、集計して、書き出す
売上のCSVを1行ずつ読み、部署別に合計し、結果を新しいCSVに書き出します。
このレッスンが終わったら
「CSVは、1行ずつ辞書として読める。数字は文字で入ってくるので、int() で変換してから計算する」と言える。
できることを見る
Excelから「CSV」という形式で保存したファイルを、Pythonで読んでみましょう。ここに、3か月分の売上が入った 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["売上"])動かしてみる
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
6行分のデータが、表示されましたか。Excelで見ていた表の各行を、Pythonが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行から、「月」「部署」「売上」の中身を取り出して、表示する日本語にすると
row の正体は、Lesson 08 で学んだ辞書です。たとえば1行目は、{"月": "1月", "部署": "営業", "売上": "320000"} という形をしています。だから、row["売上"] のように、見出しの名前で中身を取り出せるのです。
1か所だけ変える
① 売上を、全部足す。 売上を合計してみましょう。ここに、大事な落とし穴があります。CSVから読んだ値は、数字に見えても、じつは文字です。そのため、int()(数字に変える)を付けてから足します。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
② 条件に合う行だけ足す。 LEVEL 2 の if を組み合わせると、「営業部だけの合計」も出せます。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
③ int() を忘れると? わざと外して、エラーを出してみましょう。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
TypeError(文字と数字は足せません)と出ます。エラー講座のTypeErrorと同じです。直し方は、int(row["売上"]) + 1000 です。
④ 結果をCSVに書き出す。 集計した結果を、新しいCSVに書き出します。
▶ 実行を押すと、ここに結果が出ます
writer.writerow([...]) は、リストを1行として書き込みます。newline="" は、CSVを書くときのおまじないです。
自分で書く
お題① 「企画部」の売上の合計を表示してください。(正解は540000です)
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
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)以上の行について、月と部署を表示してください。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
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["部署"])