Pandasでファイルを読み込む時にread_excel、read_csvと指定するのが面倒だなと思っていました。
そこで考えたのが拡張子をもとエクセル、csvどちらがきても自動判別して取り込む独自関数を作成しました。
今回はこの関数を利用して、ディレクトリ内の複数ファイルを1つに集約する方法をご紹介いたします。
- エクセル、csv、テキストを意識せずにPandasのDataFrameに取り込む方法がわかる
- ディレクトリ内の複数ファイルを1つに集約する方法がわかる
※拡張子や内容は同一の必要があります - ディレクトリ内のファイルを拡張子で自動判別して1つに集約する方法がわかる(1,2と応用)
尚、検証環境はwindows10,jupyter notebookを利用しております。jupyter notebookのインストール方法については過去記事のPythonとJupyterLab DesktopとAnacondaの環境構築とデメリットにてご紹介しております。
必要ライブラリのimport
今回利用するライブラリのimportをはじめに行います。基本デフォルトで導入されているライブラリですがインストール方法が不明な方は過去記事のをご覧くださいませ。
import pandas as pd
import glob,os
import re
拡張子を意識せずにPandasに取り込む方法
拡張子を自動判定
エクセルやcsvを意識せずにPandasに取り込むために拡張子から自動判定することを思いつきました。
エクセルであれば代表的な拡張子は右記 .xlsx .xls .xlsm xlsb
csvは .csv
テキストは .txt
対象pathを指定して拡張子を抽出できれば判定ができますね。拡張子を抽出するにはos.path.splitextを使うと拡張子以外と拡張子の2つに分割され後方が拡張子です。
#ここではpathをr"C:\Users\abi00\Desktop\sample_1.csv"とします。
os.path.splitext(r"C:\Users\abi00\Desktop\sample_1.csv")
#結果 ('C:\\Users\\abi00\\Desktop\\sample_1', '.csv')
必ず2つに分割され後方が拡張子である特徴から下記のようにすれば拡張子が取得できます。
os.path.splitext(r"C:\Users\abi00\Desktop\sample_1.csv")[1]
#結果 '.csv'
拡張子自動判定後にDataFrameに取り込む
エクセルとCsvのどちらが来ても自動で判別してDataFrameに取り込むコードです。拡張子を抽出後にif文で読み込む方法を変えています。dtye_とencoding_も関数上で指定できるようにしデフォルトをstr,utf-8としました。
#関数
def pd_read_(input_path,dtye_=str,encoding_="utf-8"):
#拡張子を抽出
extension_=os.path.splitext(input_path)[1]
if extension_ == ".xlsx" or extension_ == ".xls":
df1=pd.read_excel(input_path,dtype=dtye_)
elif extension_ == ".csv":
df1=pd.read_csv(input_path,dtype=dtye_,encoding=encoding_)
elif extension_ == ".txt":
df1=pd.read_csv(input_path,dtype=dtye_,encoding=encoding_)
else:
print("対象の拡張子がありません")
return df1
#実行
input_path = r"C:\Users\abi00\Desktop\sample_1.csv"
pd_read_(input_path)
これでファイルの結果がdf1の変数にインプットできたと思います。
ディレクトリ内の複数ファイル一覧と拡張子の抽出
ディレクトリ内のファイル拡張子とファイル形式が同一である必要があります。
まず対象ディレクトリのファイル一覧をglobで抽出し、reで正規表現で拡張子を指定し抽出します。if文と正規表現を利用して抽出する方法の詳細が知りたい方は過去記事のフォルダ内の複数ファイルを拡張子利用でPythonで集約する方法をご覧くださいませ。
input_dir= r"C:\Users\abi00\Desktop\test"
extension_ =".xlsx|.csv$|.txt$"
[path for path in glob.glob(input_dir + "\**",recursive = True) if re.search(extension_,path)]
#結果
#['C:\\Users\\abi00\\Desktop\\test\\sample_1 - コピー.csv','C:\\Users\\abi00\\Desktop\\test\\sample_1.csv']
拡張子を意識せずにディレクトリ内の複数ファイルを1つに集約
今まで実施してきた応用です。
<実践内容>
対象ディレクトリ内の複数ファイルを拡張子を意識せずに1つに集約しDataFrameに格納します。
def FileSum_(path,extension_):
#ディレクトリ内の複数ファイル一覧を抽出
PathList_ = [path for path in glob.glob(input_dir + "\**",recursive = True) if re.search(extension_,path)]
#データを積み上げるための空のDF作成
df_ = pd.DataFrame()
for path in PathList_:
df1=pd_read_(path)#拡張子の自動判定してDFに取り込む
df_=pd.concat([df_,df1])#データを1つに集約
return df_
#実行
input_dir= r"C:\Users\abi00\Desktop\test"
extension_ =".xlsx|.csv$|.txt$"
FileSum_(input_dir,extension_)
これを実行するとディレクトリ内の全てのファイルが1つに集約できたかと思います。
コメント