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が生成されてます。