3行のデータが、カテゴリ別の合計になる
架空データで試す例です。顧客の実績ではありません。
入力はこれ
books 1,200 software 600 books 800
こうまとまる
books 2,000 software 600
まず、できあがりを見る
category,amount
books,2000
software,600
Console: 2600 total; 2 categoriesbooksは1,200+800で2,000、softwareは600。合計2,600は変わらず、3行が2カテゴリにまとまります。amountは同じ単位の0以上の整数で試してください。引用符の閉じ忘れ・列の増減・負数・小数・データ行なしの場合は、結果を書き出す前に停止します。
同じ結果を出す手順
用意するデータ
category,amount
books,1200
software,600
books,800
やること
- Python 3が使えるか確認する。WindowsではPowerShellを開き、python --versionまたはpy --versionを実行する。macOS/Linuxではターミナルでpython3 --versionを実行し、Python 3.xと表示されたコマンドを使う。追加パッケージは不要。
- 空の作業フォルダを作る。入力例をweekly.csv、下のコードをsummarize.pyとして、どちらもプレーンテキスト・UTF-8で保存する。weekly.csv.txtのように末尾へ.txtが付いていないことも確認する。
- WindowsのPowerShell、またはmacOS/Linuxのターミナルでcd "作業フォルダのフルパス"を実行する。PowerShellではGet-Location、macOS/Linuxではpwdで作業場所が合っているか確認する。続けてPowerShellではdir、macOS/Linuxではlsでweekly.csvとsummarize.pyの両方が見えることを確認する。
- 確認したコマンドで実行する。Windowsはpython summarize.pyまたはpy summarize.py、macOS/Linuxはpython3 summarize.py。
- できたtotals.csvと画面の合計を、上の完成例と比べる。合計は2,600、カテゴリは2つ。エラーが出たら下の「直し方」で原因を確認し、結果を使わない。
- 再実行は別の空フォルダへ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
- ショップ: 楽天ブックス
出版社の目次・書誌情報をもとにした候補です。読了レビューや効果の実測ではありません。購入前に版と紙・電子の形式を確認してください。
判断基準を詳しく見る
| 判断項目 | 実用上の答え |
|---|---|
| 読者の悩み | 毎日同じPC作業に時間を取られている |
| 判断基準 | 入力が毎回同じならPython、画面が変わるならまず手順を固定する |
| 比較 | ファイル処理は安定しやすいが、画面操作は変更に弱く保守が増える |
| 具体的な検証 | 同じ列の週次CSVをカテゴリ別に合計し、入力を残して新しいCSVへ出す |
| 避けたい失敗 | いきなり複数サイトの画面操作を自動化して保守不能にする |
| 最初の一手 | 10分以上かかる繰り返し作業を一つ選び、入力・出力・所要時間を記録する |
| 確認する根拠 | Python公式ドキュメントで使う標準機能と制約を確認する |
| このガイドで試すこと | 比較表・CSVの具体例・最初のスクリプトチェックリスト |
購入を検討する前に、この表で最小限の検証方法を決めてください。
リンクと広告について
関連商品には楽天アフィリエイトのリンクを使います。総額と最新条件を確認し、試して分かった不足を補える場合だけ購入を検討してください。広告/PRは明示し、誇大表現や収益保証はしません。
参考ソース
- Python csv: DictReader, DictWriter, and newline handling (公式リファレンス)
- Python setup and usage: installation and commands by operating system (公開Web資料)
- Microsoft Support: opening UTF-8 CSV files correctly in Excel (公開Web資料)
- Automate the Boring Stuff with Python, 3rd edition: Japanese publisher's contents and book details (公開Web資料)
