Databricks Assitant にて指定したディレクトリの Databricks のノートブック一覧を取得する関数を生成

## 概要

Databricks Assitant にて指定したディレクトリの Databricks のノートブックの一覧を取得する関数を生成しため、実行方法を共有します。 Databricks Repos にて上図のディレクトリ構成である場合に、下図のようにノートブックのみの一覧を作成する関数を作成してもらいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/47d4c4df-c863-0066-0b18-19009a1c0a2e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/094d1ca0-e700-ca2a-fa3c-5ffcfbfa74df.png)


## Databricks Assistant による関数の作成

### プロンプト

```text
次の条件を満たす用、python にて 指定したディレクトリにあるノートブックの一覧を取得する関数を作成してください。

- Python のコーディングルール
    - Google スタイルの Docstring を記載
    - 引数のデータ型ヒントを記載
    - コードにコメントを記載
- 関数の実装方法
    - 取得した項目がディレクトリの場合には、その配下の項目を取得するように再帰的な処理とすること
    - ディレクトリをリターン値に含めなないこと
    - 指定した複数の拡張子（デフォルト値は`[".py"]`）を含む場合には除外すること
    - 取得したディレクトリから、1つめの `/Workspace`の値を置換すること
```

### 出力結果

````text
Here is an implementation of the function that meets the requirements:

```python
from typing import List
import os


def get_notebook_paths(directory: str, extensions: List[str] = [".py"]) -> List[str]:
    """
    指定したディレクトリにあるノートブックの一覧を取得する関数
    
    Args:
        directory (str): 対象ディレクトリのパス
        extensions (List[str], optional): 除外する拡張子のリスト. Defaults to [".py"].
    
    Returns:
        List[str]: ディレクトリの配下にあるノートブックパスのリスト
    """
    
    def get_notebook_paths_recursively(directory: str, extensions: List[str], paths: List[str]) -> List[str]:
        """
        指定したディレクトリ以下のファイルパスのリストを再帰的に取得する関数
        
        Args:
            directory (str): 対象ディレクトリのパス
            extensions (List[str]): 除外する拡張子のリスト
            paths (List[str]): 取得済みのファイルパスのリスト
            
        Returns:
            List[str]: 変更後のファイルパスのリスト
        """
        # 対象ディレクトリ以下の全項目を取得
        items = os.listdir(directory)

        # 1つずつ処理していく
        for item in items:
            item_path = os.path.join(directory, item)
            
            # ディレクトリだった場合は再帰的に処理
            if os.path.isdir(item_path):
                paths = get_notebook_paths_recursively(item_path, extensions, paths)
            # ファイルだった場合は拡張子で除外するかどうかチェック
            elif os.path.isfile(item_path) and os.path.splitext(item_path)[1] not in extensions:
                paths.append(item_path.replace("/Workspace", "", 1))
            
        return paths
    
    # 再帰的に全項目を取得して返す
    return get_notebook_paths_recursively(directory, extensions, [])
```

上記のような関数を実装することで、指定したディレクトリの配下にあるノートブックの一覧が取得できます。再帰的な処理をしているため、ディレクトリ配下の全ノートブックのパスが取得され、除外する拡張子を指定すれば条件に合わせたノートブックパスのリストを取得できます。また、get_notebook_paths_recursively() 関数を別関数として定義することで、再帰的な処理の処理時間を短縮できます。
````

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0546e167-6afc-5f95-9f6a-cfa07949529c.png)

## 実行結果

### 生成された関数を定義

```python
from typing import List
import os


def get_notebook_paths(directory: str, extensions: List[str] = [".py"]) -> List[str]:
    """
    指定したディレクトリにあるノートブックの一覧を取得する関数
    
    Args:
        directory (str): 対象ディレクトリのパス
        extensions (List[str], optional): 除外する拡張子のリスト. Defaults to [".py"].
    
    Returns:
        List[str]: ディレクトリの配下にあるノートブックパスのリスト
    """
    
    def get_notebook_paths_recursively(directory: str, extensions: List[str], paths: List[str]) -> List[str]:
        """
        指定したディレクトリ以下のファイルパスのリストを再帰的に取得する関数
        
        Args:
            directory (str): 対象ディレクトリのパス
            extensions (List[str]): 除外する拡張子のリスト
            paths (List[str]): 取得済みのファイルパスのリスト
            
        Returns:
            List[str]: 変更後のファイルパスのリスト
        """
        # 対象ディレクトリ以下の全項目を取得
        items = os.listdir(directory)

        # 1つずつ処理していく
        for item in items:
            item_path = os.path.join(directory, item)
            
            # ディレクトリだった場合は再帰的に処理
            if os.path.isdir(item_path):
                paths = get_notebook_paths_recursively(item_path, extensions, paths)
            # ファイルだった場合は拡張子で除外するかどうかチェック
            elif os.path.isfile(item_path) and os.path.splitext(item_path)[1] not in extensions:
                paths.append(item_path.replace("/Workspace", "", 1))
            
        return paths
    
    # 再帰的に全項目を取得して返す
    return get_notebook_paths_recursively(directory, extensions, [])
```

### 関数を実行

```python
from pprint import pprint
path = os.getcwd()
contents = get_notebook_paths(path)
pprint(contents)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/776cc640-2526-3c9d-8296-dddd2da6c96f.png)