見出し画像

[Python] 辞書型のバリューに関数を設定し、キーに応じて呼び出す関数を分ける

はじめに

今回は、Pythonの辞書型を使用して、キーの値に応じて関数を呼び出す方法を実装する方法について説明します。

例えば、特定のフォルダ内にあるファイルの種類に応じて、呼び出す関数を分けたい場合があるとします。

フォルダ内には、次のようなファイルが保存されています。

フォルダ内のファイル

このように、ファイルの種類に応じて関数を分けることで、処理を実装していきます。

辞書型とデータ型

キーとバリュー(値)をセットで管理するデータ型です。
キーに設定できるデータ型は、変更することができないデータ型を設定することができます。例えば、文字列、数値、タプルなどを設定することが可能です。
バリューに設定できるデータ型は、制限なくあらゆるデータ型の設定が可能です。
今回、このバリューに関数を設定します。関数はオブジェクトとなるので、他データ型同様バリューとして設定することが可能になります。

使用するライブラリ

pandas

データ分析をサポートするライブラリです。

pathlib

ファイルやフォルダ(ディレクトリ)のパスをオブジェクトとして操作することができるライブラリです。

動作環境

  • windows11

  • Jupyter Notebook 6.4.5(Python 3.9.7)

  • Python 3.10.2

実装

1. ファイルの種類ごとに、呼び出す関数を定義

ファイルの種類ごとに呼び出したい関数を定義していきます。

import pandas as pd

def read_csv(file_name):
    df = pd.read_csv(file_name, encoding='CP932')
    return df

def read_excel(file_name):
    df = pd.read_excel(file_name, sheet_name=0)
    return df

def read_json(file_name):
    df = pd.read_json(file_name)
    return df

def read_txt(file_name):
    df = pd.read_table(file_name)
    return df

CSVファイル、Excelファイル、JSONファイル、テキストファイルの4つのファイル形式に対応する関数を定義します。

2. 辞書型の変数の定義

辞書型の変数を定義し、キーにはファイルの拡張子を、バリューにはそれぞれに対応した関数を定義します。

ex_dict = {
    '.txt' : read_txt,
    '.csv' : read_csv,
    '.xlsx' : read_excel,
    '.json' : read_json
}

3. フォルダからファイル一覧を取得し、1ファイルずつ処理

指定のフォルダから、ファイル一覧を取得し、1ファイルずつファイルを読み込んでいきます。

from pathlib import Path

path_dir = Path('test_dict_value_function')

pathlibライブラリを使用して、指定フォルダのPathオブジェクトを生成します。

for file_path in path_dir.iterdir():
    if file_path.suffix in ex_dict:
        print(file_path.name, type(ex_dict[file_path.suffix]))
        df = ex_dict[file_path.suffix](file_path)
        display(df.head())

1行目のfor文では、Pathオブジェクトのiterdirメソッドを使って、ディレクトリ直下のパス一覧のイテレータを取得し、1ファイルずつ取得していきます。

次に、2行目では、suffix属性でファイルの拡張子を取得し、その拡張子が辞書のキー内に存在するかを確認しています。
もし辞書に指定したキー(拡張子名)が存在する場合、4行目で辞書[キー]を指定してバリューを取得します。
このバリューには関数が格納されているため、()をつけて引数を指定して実行することで、それぞれの関数を呼び出して実行していきます。

実行結果は下記となります。

実行結果

まとめ

今回は、Pythonの辞書型を使用して、キーの値に応じて関数を呼び出す方法を実装する方法についてまとめました。

参考サイト


この記事が気に入ったらサポートをしてみませんか?