フォルダ内の複数ファイルを拡張子利用でPythonで集約する方法

※記事内に広告が含まれる場合があります。
複数ファイルを1つに集約する テクノロジー
スポンサーリンク

Pandasでファイルを読み込む時にread_excel、read_csvと指定するのが面倒だなと思っていました。

そこで考えたのが拡張子をもとエクセル、csvどちらがきても自動判別して取り込む独自関数を作成しました。

今回はこの関数を利用して、ディレクトリ内の複数ファイルを1つに集約する方法をご紹介いたします。

こんな人のお役にたてます
  1. エクセル、csv、テキストを意識せずにPandasのDataFrameに取り込む方法がわかる
  2. ディレクトリ内の複数ファイルを1つに集約する方法がわかる
    ※拡張子や内容は同一の必要があります
  3. ディレクトリ内のファイルを拡張子で自動判別して1つに集約する方法がわかる(1,2と応用)

尚、検証環境はwindows10,jupyter notebookを利用しております。jupyter notebookのインストール方法については過去記事の公式PythonとJupyterLab DesktopとAnacondaの仮想環境構築にてご紹介しております。

スポンサーリンク

必要ライブラリのimport

今回利用するライブラリのimportをはじめに行います。基本デフォルトで導入されているライブラリですがインストール方法が不明な方は過去記事のpipでPythonライブラリのinstall方法 エラー回避とPROXY回避をご覧くださいませ。

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つに集約できたかと思います。

最後に私がPythonの勉強をして入門者から中級者までにこの本1冊あれば習得できるおすすめ本記事も書いております【本1冊で】Python入門から中級までなれるおすすめ本ご興味がある方は御覧くださいませ。

他にもPython関連の記事を書いておりますのでご興味のあるかたはご覧くださいませ。

Python関連記事の一覧→テクノロジー

タイトルとURLをコピーしました