Python / 自動化

CSV集計、まだコピペ?Pythonでまとめる実例

3件のデータを、2カテゴリの合計に。合計2,600は変えず、元ファイルも残します。まずはサンプルで試してみてください。

3行のデータが、カテゴリ別の合計になる

架空データで試す例です。顧客の実績ではありません。

入力はこれ

books 1,200
software 600
books 800

こうまとまる

books 2,000
software 600
説明用の3件。合計は、集計の前も後も2,600。

まず、できあがりを見る

category,amount
books,2000
software,600

Console: 2600 total; 2 categories

booksは1,200+800で2,000、softwareは600。合計2,600は変わらず、3行が2カテゴリにまとまります。amountは同じ単位の0以上の整数で試してください。引用符の閉じ忘れ・列の増減・負数・小数・データ行なしの場合は、結果を書き出す前に停止します。

同じ結果を出す手順

用意するデータ

category,amount
books,1200
software,600
books,800

やること

  1. Python 3が使えるか確認する。WindowsではPowerShellを開き、python --versionまたはpy --versionを実行する。macOS/Linuxではターミナルでpython3 --versionを実行し、Python 3.xと表示されたコマンドを使う。追加パッケージは不要。
  2. 空の作業フォルダを作る。入力例をweekly.csv、下のコードをsummarize.pyとして、どちらもプレーンテキスト・UTF-8で保存する。weekly.csv.txtのように末尾へ.txtが付いていないことも確認する。
  3. WindowsのPowerShell、またはmacOS/Linuxのターミナルでcd "作業フォルダのフルパス"を実行する。PowerShellではGet-Location、macOS/Linuxではpwdで作業場所が合っているか確認する。続けてPowerShellではdir、macOS/Linuxではlsでweekly.csvとsummarize.pyの両方が見えることを確認する。
  4. 確認したコマンドで実行する。Windowsはpython summarize.pyまたはpy summarize.py、macOS/Linuxはpython3 summarize.py。
  5. できたtotals.csvと画面の合計を、上の完成例と比べる。合計は2,600、カテゴリは2つ。エラーが出たら下の「直し方」で原因を確認し、結果を使わない。
  6. 再実行は別の空フォルダへweekly.csvとsummarize.pyをコピーして試す。既存のtotals.csvがある場合、上書きせずに停止する。

実行するコード

import csv
from collections import defaultdict
from pathlib import Path

totals = defaultdict(int)
with Path("weekly.csv").open(encoding="utf-8-sig", newline="") as source:
    reader = csv.DictReader(source, strict=True)
    if len(reader.fieldnames or []) != 2 or set(reader.fieldnames) != {"category", "amount"}:
        raise ValueError("Expected category and amount columns")
    for line, row in enumerate(reader, start=2):
        if None in row or any(value is None for value in row.values()):
            raise ValueError(f"Wrong column count on line {line}")
        category = row["category"].strip()
        raw_amount = row["amount"].strip()
        if not category or category[0] in "=+-@" or not raw_amount.isascii() or not raw_amount.isdigit():
            raise ValueError(f"Invalid category or non-negative integer amount on line {line}")
        totals[category] += int(raw_amount)

if not totals:
    raise ValueError("No data rows; check the input export")

# Exclusive creation: an existing result is never overwritten.
with Path("totals.csv").open("x", encoding="utf-8", newline="") as target:
    writer = csv.writer(target)
    writer.writerow(["category", "amount"])
    writer.writerows(sorted(totals.items()))
print(f"{sum(totals.values())} total; {len(totals)} categories")

エラーが出たときの直し方

Pythonが見つからない/Microsoft Storeが開く

最初のバージョン確認でPython 3.xが出ていません。Python公式サイトのOS別インストール案内を確認し、導入後にターミナルを開き直します。Python 3.xと表示されたコマンドで実行してください。pipで追加パッケージを入れる必要はありません。

FileNotFoundError/summarize.pyを開けない

作業場所かファイル名が違います。WindowsではPowerShellを開き、手順のcdとGet-Locationで移動先を確認します。コマンドプロンプトを使う場合はcd /d "作業フォルダのフルパス"が必要です。cdだけでは別ドライブへ移れません。macOS/Linuxはcdとpwdで確認し、dirまたはlsで2ファイルを探します。.txtが付いていたら、元の内容を確かめて正しい名前で保存し直してください。

FileExistsError: totals.csv

前の結果を守るために止まっています。weekly.csvとsummarize.pyだけを別の空フォルダへコピーして実行してください。コードの"x"を"w"へ変えると上書きになるため、その変更で通そうとしないでください。

UnicodeDecodeError/Excelで日本語が文字化けする

読み込み時のUnicodeDecodeErrorは、入力が指定したUTF-8でない可能性があります。コピーをUTF-8で保存し直します。処理は成功したのにExcelの表示だけが文字化けする場合は、「データ」→「テキストまたはCSVから」でtotals.csvを選び、文字コードUTF-8を指定して読み込みます。

csv.Error/列数・金額のValueError

引用符の閉じ忘れ、余分な列、空欄、桁区切りのカンマ、負数・小数を確認します。例としてbooks,"1200"0は壊れたCSVです。元データと照合し、CSVを書き出したソフトからコピーを作り直してください。エラー行を削除したり、金額を0に置き換えたりして通さないでください。

ValueError: No data rows

見出しだけでデータがありません。出力0件を売上0件などの実績に置き換えず、入力ファイル・書き出し条件・対象期間を確認してください。まずこのページの3件の例で動作を確かめます。

できたら、ここを確認

  • 実データはコピーで試し、weekly.csvの内容が変わっていないことを確認したか
  • 列名がcategoryとamountの2つで、文字コードと金額の単位をそろえたか
  • 入力の合計2,600と出力の合計2,600が一致し、同じカテゴリが正しくまとまったか
  • 準備・実行・結果確認・修正まで含めた時間を手動集計と比較したか

ほかの方法と比べて選ぶ

表は横にスクロールして読めます。

方法向く条件負担・制約
表計算で手動集計一度きりの少量データで、目視で結果を照合できる準備は少ない。毎週の貼り付けや範囲指定を忘れると集計がずれる
Pythonのcsv標準ライブラリcategoryとamountの列が毎週同じで、処理を繰り返す初回に入力検査を作る。列名が変わったら停止して修正する
画面クリックの自動化CSVを書き出す手段がなく、画面の操作だけが残る画面変更に弱い。この例では不要なので導入しない

次に判断すること

まずは同じ形式のコピーで3回試し、結果と手間を確かめましょう。この集計だけが目的なら、本や有料ツールは不要です。

Python公式文書のcsvのページでは、DictReaderで列名から値を読む方法、writerでCSVへ書き出す方法、改行を正しく扱うためのnewline=""の指定を確認できます。コードを変えるときは、使う機能の説明と例を見比べてください。

日本語で文法から学び、ExcelやSQLiteの処理にも進みたい人は『退屈なことはPythonにやらせよう 第3版』を検討できます。800ページの本なので、短い答えだけが必要な人には負担です。出版社の目次を見て、学びたい作業が含まれるかで選んでください。

この例は有料商品の購入なしで試せます。

この例の先を、書籍で学びたいとき

退屈なことはPythonにやらせよう(第3版)

候補になる条件
CSV集計を試して、変数・条件分岐・関数から日本語で学び直したいと分かった人。出版社の目次では、基礎に加えてExcel、SQLite、CSV・JSON・XMLの処理を扱っています。
見送ってよい条件
今回のCSV集計だけが目的なら購入不要です。Python公式文書のcsvの説明と、このページのサンプルで試せます。800ページの本なので、短い回答だけが必要な人や、すでに自力で修正できる人には負担になり得ます。
  • 価格・送料・在庫は楽天ブックスの商品ページで確認してください。
  • ISBN: 9784814401529
  • ショップ: 楽天ブックス

出版社の目次・書誌情報をもとにした候補です。読了レビューや効果の実測ではありません。購入前に版と紙・電子の形式を確認してください。

この版を楽天ブックスで確認する

Supported by Rakuten Developers

判断基準を詳しく見る
判断項目実用上の答え
読者の悩み毎日同じPC作業に時間を取られている
判断基準入力が毎回同じならPython、画面が変わるならまず手順を固定する
比較ファイル処理は安定しやすいが、画面操作は変更に弱く保守が増える
具体的な検証同じ列の週次CSVをカテゴリ別に合計し、入力を残して新しいCSVへ出す
避けたい失敗いきなり複数サイトの画面操作を自動化して保守不能にする
最初の一手10分以上かかる繰り返し作業を一つ選び、入力・出力・所要時間を記録する
確認する根拠Python公式ドキュメントで使う標準機能と制約を確認する
このガイドで試すこと比較表・CSVの具体例・最初のスクリプトチェックリスト

購入を検討する前に、この表で最小限の検証方法を決めてください。

リンクと広告について

関連商品には楽天アフィリエイトのリンクを使います。総額と最新条件を確認し、試して分かった不足を補える場合だけ購入を検討してください。広告/PRは明示し、誇大表現や収益保証はしません。

参考ソース

ほかのガイドを見る