Python

【Python】複数のCSVを1つのExcelにまとめる作業を自動化してみた

takahide

おはようございます。タカヒデです。

「Pythonで業務の自動化」よく聞くキーワードですね。

私もこれをやっていきたいと思います。

「どんなことやろうかな?」と思ったのですが、せっかくなのでなるべく業務で使えるものにしたい…

ということで「複数のCSVを1つのExcelにまとめる」という作業を自動化していきます。

具体的には、「毎月の明細データをボタン一つでExcelに積み上げていく」という作業です。

同じように業務自動化を検討されている方は参考にしてください。

【前提】自動化する作業の完成イメージ

ではまず今回自動化する作業の完成イメージから見ていきましょう。

やりたいことは、「複数のCSVを1つのExcelにまとめる」という作業を自動化することです。

以下の3か月分の明細データがあります。

これを以下のように1つのExcelとしてデータを積み上げていきます。

もちろんコピペをすれば誰でもできます。

しかし、今回は「自動化」なので、ボタン一つで作業が完了することを目指していきます。

【STEP1】作業の流れを整理

まずは実際にコードを書き始める前に今回の作業を分解して整理します。

  1. 明細CSVデータを特定フォルダに格納する
  2. Pythonがフォルダ内のCSVデータをすべて探す
  3. CSVを1つずつ読み込む
  4. 必要な列だけ取り出す
  5. 「marge.xlsx」という積み上げるファイルにまとめて書き込む
  6. すでに取り込んだCSVを二重登録しないようにする
  7. ボタン一つで実行できるようにする

今回でいうと、このなかで②~⑥の作業を自動化します。

つまり私たちが手動で行うのは①と⑦のみとなります。

【STEP2】フォルダ構成を考える

続けて、どのようなフォルダ構成にするか考えます。

今回は以下の構成にしてみました。

05_python_credit_card_auto/
├ data/  ⇐CSVデータを格納するフォルダ
│ ├ enavi202601.csv
│ ├ enavi202602.csv
│ └ enavi202603.csv
├ output/
│ └ marge.xlsx  ⇐データを積み上げたExcel
├ merge_csv.py  ⇐自動化のコードが書かれたPython
└ 実行.bat  ⇐実行ボタン

毎月の所作としては、「dataフォルダ」に明細データを確認し、「実行.bat」を実行するだけのイメージです。

【STEP3】Pythonのライブラリをインストール

今回使うPythonのライブラリは以下の2つです。

  • pandas:CSVやExcelのデータを読み込んだり、まとめたりする
  • openpyxl:Excelファイルを細かく編集する

どちらも事前にターミナルでインストールしておきましょう。

pip install pandas openpyxl

【STEP4】Pythonで自動化のコードを記載

ようやくPythonで自動化のコードを記載していきます。

「dataフォルダ」と同階層に「merge_csv.py」を作成し、以下のコードを記載しましょう。

import pandas as pd
from pathlib import Path

# フォルダの設定
BASE_DIR = Path(__file__).resolve().parent
DATA_DIR = BASE_DIR / "data"
# 出力先の設定
OUTPUT_DIR = BASE_DIR / "output"
OUTPUT_FILE = OUTPUT_DIR / "merge.xlsx"

# フォルダが無ければ作成
OUTPUT_DIR.mkdir(exist_ok=True)

# dataフォルダ内のCSVファイルを取得
csv_files = list(DATA_DIR.glob("*.csv"))

# 「merge.xlsx」が存在するかを確認
if OUTPUT_FILE.exists():
    existing_df = pd.read_excel(OUTPUT_FILE)
    imported_files = set(existing_df["取込元ファイル"].unique())
else:
    existing_df = pd.DataFrame()
    imported_files = set()

# 結合用リスト
df_list = []

# CSVファイルの読み込み
for file in csv_files:

    # 過去に取込済であればスキップ
    if file.name in imported_files:
        print(f"{file.name}は取込済です")
        continue

    df = pd.read_csv(file, encoding="utf-8-sig")

    # 列名の変更ルールを格納
    rename_columns = {}

    # 列名を確認
    for column in df.columns:
        if "支払金額" in column:
            rename_columns[column] = "当月支払金額"

        if "繰越残高" in column:
            rename_columns[column] = "繰越残高"

    # 列名を変更
    df = df.rename(columns=rename_columns)

    # 取り込み元となるファイル名を列に追加
    df["取込元ファイル"] = file.name

    # 結合用リストに追加
    df_list.append(df)

# 新たなファイルがある場合だけCSVを結合
if df_list:
    new_df = pd.concat(df_list, ignore_index=True)

    if existing_df.empty:
        merged_df = new_df
    else:
        merged_df = pd.concat([existing_df, new_df], ignore_index=True)

    # Excelに出力
    merged_df.to_excel(OUTPUT_FILE, index=False)

    print("Excel出力完了", OUTPUT_FILE)
else:
    print("新たなファイルはありません")

ここで行っている大まかな流れは以下です。

  1. CSVを読み込む
  2. 必要な形に整える
  3. 既存データと比較する
  4. 新しい分だけ追加する
  5. Excelに保存する

実際にやっていることはコードを見ていただければと思いますが、ポイントとして2点紹介します。

ポイント①:カラム名の統一

元の明細データを見ていただければ分かりますが、月によってカラム名が異なります。

「1月支払金額」「2月繰越残高」の2か所です。

そこで、以下のコードを追加しています。

    # 列名を確認
    for column in df.columns:
        if "支払金額" in column:
            rename_columns[column] = "当月支払金額"

        if "繰越残高" in column:
            rename_columns[column] = "繰越残高"

    # 列名を変更
    df = df.rename(columns=rename_columns)

これによって、

  • 「支払金額」が含まれる場合⇒「当月支払金額」
  • 「繰越残高」が含まれる場合⇒「繰越残高」

に変更することで、カラム名を統一しています。

ポイント②:取込元ファイルのカラムを追加

基本的に明細データを積み上げているだけなので、どのファイルから拾ってきたデータなのかを追加する必要はありません。

しかし、元のデータを追いかけられるよう、「取込元ファイル」というカラムを追加しています。

    # 取り込み元となるファイル名を列に追加
    df["取込元ファイル"] = file.name

これによって、各レコードに取込元となるCSVファイル名が追加されるようになっています。

【STEP5】Pythonファイルを実行する「.bat」ファイルを作る

最期にボタン一つで動作するよう「.bat」ファイルを作ります。

「.bat」ファイルではWindowsでコマンドを実行することができます。

もしMacやLinuxの場合は「.sh」ファイルで、同じようなことができるはずです。

「merge_csv.py」と同じフォルダ内に「実行.bat」を作成しましょう。

そして、「実行.bat」に以下のコードを記載します。

@echo off
cd /d C:\programming\05_python_credit_card_auto
python merge_csv.py
pause

「cd /d」以降はご自身の作業をしていたフォルダを参照させてください。

これで「毎月の明細データを1つのExcelに積み上げていく」という作業の自動化の完成です。

実際に実行してみる

最期に、正しく自動化できるか、実際に実行してみましょう。

現在のファイル構成は以下です。

「実行.bat」を実行してみましょう。

「Excel出力完了」と出ます。

「outputファイル」が新たに作成されていることが分かります。

「merge.xlsx」を開くと、3か月分の明細データが蓄積されていることが分かります。

正しくできましたね。

誰かの参考になれば幸いです。

お疲れさまでした。

ABOUT ME
タカヒデ
タカヒデ
ITを楽しく勉強中
通信会社の企画職で働く30代
非エンジニアでありながら半分趣味でITエンジニアリングやプログラミングを学習中
IT初心者が楽しいと思えるように発信することを目指しています
↓Xもやっているのでフォローしてね
記事URLをコピーしました