はじめに
前回は以下記事を書きました。
今回は、Pythonでのフォルダ配下の複数ファイルの読込です。
前回同様、Power QueryのM式と比較してアウトプットしたいと思います。
フォルダ配下のCSVファイル複数読込の場合
Python Pandasで読込む場合
今回はPathlibモジュールを使います。
Pathクラスを使用することで、my_pathにフォルダのパス情報を格納します。
import pathlib
import pandas as pd
my_path = pathlib.Path(r'Data\Multi')
df=pd.DataFrame()
for p in my_path.glob('*.csv'):
df_current= pd.read_csv(p, encoding="utf-8-sig")
df = pd.concat([df, df_current], ignore_index=True)
print(df.shape)
display(df.head())
DataFrameクラスを使用することで、dfに空のデータフレームを格納します。
globメソッドで、拡張子.csvのものを取り出します。イテラブルになってます。
※以下ファイル構成の場合、csvの3つのファイルのみ取得します。xlsxは対象外
for文で対象のファイルパスを変数p に一つずつ取り出します。
Data\Multi
├── StudentScore_1.csv 対象
├── StudentScore_2.csv 対象
├── StudentScore_3.csv 対象
├── StudentScore_1.xlsx 対象外
├── StudentScore_2.xlsx 対象外
└── StudentScore_3.xlsx 対象外
for文の中では以下の処理をしています。
- read_csv関数を使ってcsvファイルをdf_currentのデータフレームに読み込む
- concat関数を使ってdfのデータフレームにcsvファイルの内容を縦に追加する
Pathlibはファイルやフォルダのパスを扱いやすくするためのモジュールです。
組み込みモジュールのためインストールは不要です。
Power Queryで読込む場合
Folder.Files関数を使います。
let
ソース = Folder.Files("C:\Data\Multi"),
フィルターされた行 = Table.SelectRows(ソース, each ([Extension] = ".csv")),
追加されたカスタム = Table.AddColumn(フィルターされた行, "カスタム",
each Table.PromoteHeaders(
Csv.Document([Content],[Delimiter=",", Columns=null, Encoding=65001, QuoteStyle=QuoteStyle.Csv]))),
削除された他の列 = Table.SelectColumns(追加されたカスタム,{"カスタム"}),
#"展開された カスタム" = Table.ExpandTableColumn(削除された他の列, "カスタム", {"学籍番号", "テスト点数", "出席率", "クラス", "受験日"})
in
#"展開された カスタム"
Folder.Files関数を使って特定フォルダ内のファイルを一覧にします。
Table.SelectRows関数で拡張子が.csvのファイルのみ抽出します。
Data\Mult
├── StudentScore_1.csv 対象
├── StudentScore_2.csv 対象
├── StudentScore_3.csv 対象
├── StudentScore_1.xlsx 対象外
├── StudentScore_2.xlsx 対象外
└── StudentScore_3.xlsx 対象外
Table.AddColumn関数は新しくカスタムという列を作ります。
長いですが以下処理になります。
- Csv.Document関数で各CSVの中身を取り出す
- Table.PromoteHeaders関数で各CSVの1行目をヘッダーにする
Table.SelectColumns関数でカスタム列以外を削除します。
Table.ExpandTableColumn関数でテーブルを展開します。
フォルダ配下のExcelファイル複数読込の場合
Python Pandasで読込む場合
先ほどの、CSVファイルを読込むコードとほとんど同じです。
以下の点のみ異なります。
- globメソッドで.xlsxの拡張子を読込む点
- read_excel関数を使用する点
import pathlib
import pandas as pd
my_path = pathlib.Path(r'Data\Multi')
df=pd.DataFrame()
for p in my_path.glob('*.xlsx'):
df_current= pd.read_excel(p, sheet_name='Sheet1')
df = pd.concat([df, df_current], ignore_index=True)
print(df.shape)
display(df.head())
Power Queryで読込む場合
同じくFolder.Files関数を使います。
let
ソース = Folder.Files("C:\Data\Multi"),
フィルターされた行 = Table.SelectRows(ソース, each ([Extension] = ".xlsx")),
追加されたカスタム = Table.AddColumn(フィルターされた行, "カスタム",
each Excel.Workbook([Content],true,true)),
削除された他の列 = Table.SelectColumns(追加されたカスタム,{"カスタム"}),
#"展開された カスタム" = Table.ExpandTableColumn(削除された他の列, "カスタム", {"Name", "Data", "Item", "Kind", "Hidden"}),
削除された他の列1 = Table.SelectColumns(#"展開された カスタム",{"Data"}),
#"展開された Data" = Table.ExpandTableColumn(削除された他の列1, "Data", {"学籍番号", "テスト点数", "出席率", "クラス", "受験日"})
in
#"展開された Data"
Folder.Files関数を使って特定フォルダ内のファイルを一覧にします。
Table.SelectRows関数で拡張子が.xlsxのファイルのみ抽出します。
Data\Mult
├── StudentScore_1.csv 対象外
├── StudentScore_2.csv 対象外
├── StudentScore_3.csv 対象外
├── StudentScore_1.xlsx 対象
├── StudentScore_2.xlsx 対象
└── StudentScore_3.xlsx 対象
Table.AddColumn関数は新しくカスタムという列を作ります。
以下処理になります。
- Excel.Workbook関数で各Excelの中身を取り出す
- 2つめの引数trueは各Excelの中身のデータに対して1行目をヘッダーにする
- 3つめの引数trueは型変換を行わないようにする
Table.SelectColumns関数でカスタム列以外を削除します。
Table.ExpandTableColumn関数でExcelの中身を1段階展開します。
※Excelからデータを取り出すのではなくExcelの各シートからデータを取り出します
Table.SelectColumns関数でData列以外を削除します。
Table.ExpandTableColumn関数でデータを展開します。
次回の内容
今度はPython PandasでCSVとExcelに出力をしてみたいと思います。
Power Queryの場合は「閉じて適用」を行うことで、データをPower Queryエディター外に出力することができますが、Python Pandasでは書き出しのコードを書く必要がありますので、試してみたいと思います。