こんにちは、かつコーチです。
「毎月、支店ごとの売上CSVを1つずつ開いて、Excelで合計を出している」
そんな作業に、地味に時間を取られていませんか。
この記事では、複数のCSVファイルをまとめて読み込み、集計まで自動で行うスクリプトの作り方を解説します。
「実践Tips・自動化スクリプト」シリーズの1本目として、フォルダ内の全CSVを一括処理する実例を紹介します。
読み終える頃には、手作業の集計から卒業できる自動化スクリプトが書けるようになります。
基本の実装手順
手順1:サンプルのCSVファイルを準備する
dataフォルダの中に、支店ごとの売上CSVを3つ用意します。
data/
├── tokyo.csv
├── osaka.csv
└── nagoya.csv
tokyo.csvの中身は、次のような形式です。
date,product,amount
2026-08-01,ノートPC,120000
2026-08-02,マウス,2500
2026-08-03,ノートPC,118000
手順2:1つのCSVを読み込んで合計する
まずは1ファイルだけを対象に、csvモジュールで合計金額を計算します。
import csv
def sum_amount(filepath):
"""CSVファイル内のamount列を合計する"""
total = 0
with open(filepath, encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
total += int(row["amount"])
return total
result = sum_amount("data/tokyo.csv")
print(f"tokyo.csv の合計: {result}円")
実行結果は次の通りです。
tokyo.csv の合計: 240500円
csv.DictReaderを使うと、ヘッダー行がそのままキーになるため、row["amount"]のように列名でアクセスできます。
手順3:フォルダ内の全CSVをまとめて処理する
pathlibを使って、dataフォルダ内のCSVファイルを自動で列挙します。
from pathlib import Path
import csv
def sum_amount(filepath):
total = 0
with open(filepath, encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
total += int(row["amount"])
return total
def process_all_csv(folder):
"""フォルダ内の全CSVを一括集計する"""
results = {}
for csv_path in sorted(Path(folder).glob("*.csv")):
results[csv_path.stem] = sum_amount(csv_path)
return results
results = process_all_csv("data")
for name, total in results.items():
print(f"{name}: {total}円")
print(f"全支店合計: {sum(results.values())}円")
実行結果は次の通りです。
nagoya: 156000円
osaka: 198200円
tokyo: 240500円
全支店合計: 594700円
Path(folder).glob("*.csv")で、フォルダ内の.csv拡張子ファイルを一括取得しています。
csv_path.stemは、拡張子を除いたファイル名(tokyo.csvならtokyo)を取得できるプロパティです。
手順4:集計結果を1つのCSVに出力する
最後に、集計結果をまとめて新しいCSVに書き出します。
def export_summary(results, output_path):
"""集計結果をCSVに出力する"""
with open(output_path, "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerow(["branch", "total_amount"])
for name, total in results.items():
writer.writerow([name, total])
export_summary(results, "data/summary.csv")
summary.csvが作成され、支店ごとの合計が1ファイルにまとまります。
つまずきやすい設定・注意点
CSVを扱う際は、open()のencoding指定を忘れないようにしましょう。
Excelで作成したCSVはshift_jis(cp932)のことが多く、utf-8と混在すると文字化けの原因になります。
書き込み時のnewline=""も、Windows環境で余分な空行が入るのを防ぐために必須です。
よくあるつまずきポイント・エラー対処
文字コードの指定漏れで文字化けする
筆者が実際にハマったのが、Excelで編集したCSVをutf-8のまま読み込んでしまったケースです。
❌ Before(文字化けする書き方)
def sum_amount(filepath):
total = 0
with open(filepath, encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
total += int(row["amount"])
return total
result = sum_amount("data/osaka_excel.csv")
実行すると、次のエラーメッセージが表示されました。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 2: invalid start byte
Excelで保存したCSVは、初期設定だとshift_jis(cp932)で保存されることが多く、utf-8として読み込もうとするとバイト列が正しく解釈できません。
✅ After(文字コードを合わせた書き方)
def sum_amount(filepath):
total = 0
with open(filepath, encoding="cp932") as f:
reader = csv.DictReader(f)
for row in reader:
total += int(row["amount"])
return total
result = sum_amount("data/osaka_excel.csv")
encoding="cp932"に変更したところ、エラーなく読み込めるようになりました。
複数の部署からファイルを集める場合、文字コードが統一されていないことも多いため、try文でutf-8とcp932の両方を試す実装にしておくと、より安定します。
まとめ
この記事のポイント
csv.DictReaderを使うと、列名でCSVの値にアクセスできるpathlibのglob("*.csv")で、フォルダ内のCSVを一括で列挙できるcsv.writerで、集計結果を新しいCSVに書き出せる- ExcelのCSVは
shift_jis(cp932)のことが多く、文字コードのミスマッチに注意する - 書き込み時の
newline=""も、余分な空行を防ぐために必要
次に読むべき記事
- csvモジュールでCSVファイルを読み書きする
- pathlibでファイルパスをモダンに扱う
- フォルダ内のファイルを自動で整理するスクリプトを作る
タグ: Python, 中級者向け, 自動化