【Python】CSVファイルを一括処理する自動化スクリプトを書く

Python

こんにちは、かつコーチです。

「毎月、支店ごとの売上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_jiscp932)のことが多く、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_jiscp932)で保存されることが多く、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-8cp932の両方を試す実装にしておくと、より安定します。

まとめ

この記事のポイント

  • csv.DictReaderを使うと、列名でCSVの値にアクセスできる
  • pathlibglob("*.csv")で、フォルダ内のCSVを一括で列挙できる
  • csv.writerで、集計結果を新しいCSVに書き出せる
  • ExcelのCSVはshift_jiscp932)のことが多く、文字コードのミスマッチに注意する
  • 書き込み時のnewline=""も、余分な空行を防ぐために必要

次に読むべき記事

  • csvモジュールでCSVファイルを読み書きする
  • pathlibでファイルパスをモダンに扱う
  • フォルダ内のファイルを自動で整理するスクリプトを作る

タグ: Python, 中級者向け, 自動化

タイトルとURLをコピーしました