ChatGPTに、複数のフォルダに格納されているExcelファイルを読み込んで指定データを集約して出力するPythonコードを書いてもらった

ChatGPTに、複数のフォルダに格納されているExcelファイルを読み込んで指定データを集約して出力するPythonコードを書いてもらいました。

数千~数万のエクセルファイルから特定の列の値だけを取り出して、合計したり、リストにして取り出したい時などを想定してます。

例 : 

.
├── data
│   ├── list1.xlsx
│   ├── list2.xlsx
│   └── sub
│       └── list3.xlsx
└── excel_marge.py

上記のようなフォルダとファイルの構成で、excel_marge.py を実行すると、dataフォルダ以下のexcelすべてを読み込んで集約する、というものです。list3.xlsxだけは、dataフォルダから、もう一階層下のsubフォルダにあります。

 

指示文(プロンプト):

指定したフォルダ内にあるすべてのexcelファイルから、指定した情報を取得して最後にcsvにまとめて出力するPythonコードを書いてください。サブフォルダも対象としてください。取得する情報は、シート名と列名を指定できるようにしてください。

回答:

以下は、指定されたフォルダとサブフォルダ内にあるすべてのExcelファイルから指定した情報を取得し、最後にまとめて出力するPythonコードの例です。取得する情報は、シート名と列名を指定できるようにしています。


import os
import pandas as pd

def get_data_from_excel(folder_path, sheet_name, column_name):

    data = []
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            if file.endswith('.xlsx') or file.endswith('.xls'):
                file_path = os.path.join(root, file)
                try:
                    df = pd.read_excel(file_path, sheet_name=sheet_name)
                except ValueError:
                    print(f'Warning: Sheet "{sheet_name}" not found in file "{file_path}"')
                    continue
                if column_name not in df.columns:
                    print(f'Warning: Column "{column_name}" not found in file "{file_path}"')
                    continue
                data.append(df[column_name])
    if len(data) == 0:
        raise ValueError('No data found in the specified folder.')
    return pd.concat(data)


# 使用例
folder_path = '/****/data'
sheet_name = 'sheet1'
column_name = 'number_a'
result_df = get_data_from_excel(folder_path, sheet_name, column_name)
result_df.to_csv('result.csv', index=False)

    

上記のコードでは、osモジュールを使用して指定されたフォルダ内にあるExcelファイルを探索し、pandasモジュールを使用してデータを読み取ります。取得した情報は、指定された列名が含まれる場合に限り、リストに追加されます。最後に、すべての情報が含まれるDataFrameが作成され、CSVファイルに出力されます。

パラメーターは以下の通りです。
folder_path (str): フォルダのパス。
sheet_name (str): 取得するシート名。
column_name (str): 取得する列名。

結果:

以下のように成功しました。テスト用に用意した3つのエクセルファイルのシート名「sheet1」のカラム「number_a」をすべて集約したcsvが生成されてます。