[Python] 指定フォルダ内のフォルダ名の一覧を取得する方法

Pythonで指定フォルダ内のフォルダ名の一覧を取得するには、標準ライブラリのosモジュールやpathlibモジュールを使用します。

osモジュールではos.listdir()os.scandir()を使い、pathlibモジュールではPath.iterdir()を使います。

これらのメソッドでディレクトリ内の全てのエントリを取得し、os.path.isdir()Path.is_dir()でフォルダかどうかを判定してフォルダ名のみを抽出します。

この記事でわかること
  • フォルダ名を取得する基本的な方法
  • フォルダ名のフィルタリング手法
  • サブフォルダを再帰的に取得する方法
  • フォルダ名をソートする方法
  • フォルダ名をファイルに保存する方法

目次から探す

フォルダ名の一覧を取得する基本的な方法

Pythonでは、指定したフォルダ内のフォルダ名を取得するために、主にosモジュールとpathlibモジュールを使用します。

以下では、それぞれの方法について詳しく解説します。

osモジュールを使ったフォルダ名の取得

os.listdir()を使う方法

os.listdir()関数は、指定したディレクトリ内の全てのファイルとフォルダの名前をリストとして返します。

以下はその使用例です。

import os
# 指定したフォルダのパス
folder_path = '指定したフォルダのパス'
# フォルダ内の全てのファイルとフォルダ名を取得
folder_names = os.listdir(folder_path)
# フォルダ名を表示
print(folder_names)
['フォルダ1', 'フォルダ2', 'ファイル1.txt', 'ファイル2.txt']

この方法では、フォルダとファイルが混在したリストが返されるため、フォルダのみを抽出する必要があります。

os.scandir()を使う方法

os.scandir()関数は、指定したディレクトリ内のエントリをイテレートし、各エントリの情報を取得できます。

これにより、フォルダのみを簡単にフィルタリングできます。

import os
# 指定したフォルダのパス
folder_path = '指定したフォルダのパス'
# フォルダ内のエントリを取得
with os.scandir(folder_path) as entries:
    folder_names = [entry.name for entry in entries if entry.is_dir()]
# フォルダ名を表示
print(folder_names)
['フォルダ1', 'フォルダ2']

この方法では、フォルダのみをリストに格納することができます。

os.walk()を使う方法

os.walk()関数は、指定したディレクトリ以下の全てのフォルダとファイルを再帰的に取得します。

これを利用して、特定のフォルダ内のフォルダ名を取得することができます。

import os
# 指定したフォルダのパス
folder_path = '指定したフォルダのパス'
# フォルダ内の全てのフォルダ名を取得
folder_names = [dirpath for dirpath, dirnames, filenames in os.walk(folder_path) for dirname in dirnames]
# フォルダ名を表示
print(folder_names)
['指定したフォルダのパス/フォルダ1', '指定したフォルダのパス/フォルダ2']

この方法では、サブフォルダも含めて全てのフォルダ名を取得できます。

pathlibモジュールを使ったフォルダ名の取得

pathlibモジュールは、パス操作をオブジェクト指向で行うための便利なモジュールです。

以下では、pathlibを使ったフォルダ名の取得方法を紹介します。

Path.iterdir()を使う方法

Path.iterdir()メソッドは、指定したパス内の全てのエントリをイテレートし、フォルダ名を取得することができます。

from pathlib import Path
# 指定したフォルダのパス
folder_path = Path('指定したフォルダのパス')
# フォルダ内の全てのエントリを取得
folder_names = [entry.name for entry in folder_path.iterdir() if entry.is_dir()]
# フォルダ名を表示
print(folder_names)
['フォルダ1', 'フォルダ2']

この方法も、フォルダのみを簡単に取得できます。

Path.glob()を使う方法

Path.glob()メソッドは、指定したパターンに一致するファイルやフォルダを取得することができます。

以下は、全てのフォルダを取得する例です。

from pathlib import Path
# 指定したフォルダのパス
folder_path = Path('指定したフォルダのパス')
# フォルダ内の全てのフォルダ名を取得
folder_names = [entry.name for entry in folder_path.glob('*') if entry.is_dir()]
# フォルダ名を表示
print(folder_names)
['フォルダ1', 'フォルダ2']

この方法では、特定のパターンに基づいてフォルダを取得することができます。

Path.rglob()を使う方法

Path.rglob()メソッドは、再帰的に指定したパターンに一致するファイルやフォルダを取得します。

これを利用して、サブフォルダも含めたフォルダ名を取得できます。

from pathlib import Path
# 指定したフォルダのパス
folder_path = Path('指定したフォルダのパス')
# フォルダ内の全てのフォルダ名を取得
folder_names = [entry.name for entry in folder_path.rglob('*') if entry.is_dir()]
# フォルダ名を表示
print(folder_names)
['フォルダ1', 'フォルダ2', 'サブフォルダ1', 'サブフォルダ2']

この方法では、指定したフォルダ以下の全てのフォルダ名を取得することができます。

フォルダ名のフィルタリング

フォルダ名を取得した後、特定の条件に基づいてフォルダをフィルタリングすることがよくあります。

ここでは、フォルダのみを抽出する方法と、特定の条件でフォルダをフィルタリングする方法について解説します。

フォルダのみを抽出する方法

フォルダ名を取得した際に、ファイルも含まれている場合があります。

ここでは、フォルダのみを抽出する方法を紹介します。

os.path.isdir()を使った判定

os.path.isdir()関数を使用して、取得したエントリがフォルダかどうかを判定することができます。

以下はその使用例です。

import os
# 指定したフォルダのパス
folder_path = '指定したフォルダのパス'
# フォルダ内の全てのエントリを取得
all_entries = os.listdir(folder_path)
# フォルダのみを抽出
folder_names = [entry for entry in all_entries if os.path.isdir(os.path.join(folder_path, entry))]
# フォルダ名を表示
print(folder_names)
['フォルダ1', 'フォルダ2']

この方法では、os.path.isdir()を使って、各エントリがフォルダであるかを確認しています。

Path.is_dir()を使った判定

pathlibモジュールを使用する場合、Path.is_dir()メソッドを使ってフォルダかどうかを判定できます。

以下はその例です。

from pathlib import Path
# 指定したフォルダのパス
folder_path = Path('指定したフォルダのパス')
# フォルダ内の全てのエントリを取得
all_entries = folder_path.iterdir()
# フォルダのみを抽出
folder_names = [entry.name for entry in all_entries if entry.is_dir()]
# フォルダ名を表示
print(folder_names)
['フォルダ1', 'フォルダ2']

この方法では、Path.is_dir()を使って、各エントリがフォルダであるかを確認しています。

特定の条件でフォルダをフィルタリングする

フォルダ名を取得した後、特定の条件に基づいてフィルタリングすることも可能です。

以下では、フォルダ名に特定の文字列が含まれる場合と、特定のパターンに一致する場合について解説します。

フォルダ名に特定の文字列が含まれる場合

特定の文字列がフォルダ名に含まれている場合にフィルタリングする方法です。

以下はその例です。

import os
# 指定したフォルダのパス
folder_path = '指定したフォルダのパス'
# フォルダ内の全てのエントリを取得
all_entries = os.listdir(folder_path)
# 特定の文字列を含むフォルダのみを抽出
keyword = '特定の文字列'
folder_names = [entry for entry in all_entries if os.path.isdir(os.path.join(folder_path, entry)) and keyword in entry]
# フォルダ名を表示
print(folder_names)
['特定の文字列を含むフォルダ1', '特定の文字列を含むフォルダ2']

この方法では、指定した文字列がフォルダ名に含まれているかを確認しています。

フォルダ名が特定のパターンに一致する場合

フォルダ名が特定のパターンに一致する場合にフィルタリングする方法です。

以下はその例です。

from pathlib import Path
# 指定したフォルダのパス
folder_path = Path('指定したフォルダのパス')
# フォルダ内の全てのエントリを取得
all_entries = folder_path.iterdir()
# 特定のパターンに一致するフォルダのみを抽出
pattern = '特定のパターン*'
folder_names = [entry.name for entry in all_entries if entry.is_dir() and entry.match(pattern)]
# フォルダ名を表示
print(folder_names)
['特定のパターン1', '特定のパターン2']

この方法では、Path.match()メソッドを使用して、フォルダ名が特定のパターンに一致するかを確認しています。

応用例

フォルダ名の取得やフィルタリングの基本的な方法を理解した後、さらに応用的な操作を行うことができます。

ここでは、サブフォルダの再帰的取得、フォルダ名のソート、フォルダ名のファイルへの保存方法について解説します。

サブフォルダを再帰的に取得する方法

サブフォルダを再帰的に取得することで、指定したフォルダ以下の全てのフォルダを取得することができます。

os.walk()を使った再帰的取得

os.walk()関数を使用すると、指定したディレクトリ以下の全てのフォルダとファイルを再帰的に取得できます。

以下はその使用例です。

import os
# 指定したフォルダのパス
folder_path = '指定したフォルダのパス'
# サブフォルダを再帰的に取得
folder_names = []
for dirpath, dirnames, filenames in os.walk(folder_path):
    for dirname in dirnames:
        folder_names.append(os.path.join(dirpath, dirname))
# フォルダ名を表示
print(folder_names)
['指定したフォルダのパス/フォルダ1', '指定したフォルダのパス/フォルダ2', '指定したフォルダのパス/フォルダ1/サブフォルダ1']

この方法では、全てのサブフォルダを含むリストを取得できます。

Path.rglob()を使った再帰的取得

pathlibモジュールのPath.rglob()メソッドを使用することで、再帰的にフォルダを取得することも可能です。

from pathlib import Path
# 指定したフォルダのパス
folder_path = Path('指定したフォルダのパス')
# サブフォルダを再帰的に取得
folder_names = [entry for entry in folder_path.rglob('*') if entry.is_dir()]
# フォルダ名を表示
print(folder_names)
[PosixPath('指定したフォルダのパス/フォルダ1'), PosixPath('指定したフォルダのパス/フォルダ2'), PosixPath('指定したフォルダのパス/フォルダ1/サブフォルダ1')]

この方法では、全てのサブフォルダを簡単に取得できます。

フォルダ名をソートして取得する方法

取得したフォルダ名を特定の基準でソートすることも可能です。

アルファベット順にソート

フォルダ名をアルファベット順にソートする方法です。

import os
# 指定したフォルダのパス
folder_path = '指定したフォルダのパス'
# フォルダ内の全てのエントリを取得
folder_names = [entry for entry in os.listdir(folder_path) if os.path.isdir(os.path.join(folder_path, entry))]
# アルファベット順にソート
folder_names.sort()
# フォルダ名を表示
print(folder_names)
['フォルダ1', 'フォルダ2', 'フォルダ3']

この方法では、フォルダ名をアルファベット順に整列させることができます。

作成日時順にソート

フォルダ名を作成日時順にソートする方法です。

import os
# 指定したフォルダのパス
folder_path = '指定したフォルダのパス'
# フォルダ内の全てのエントリを取得
folder_names = [entry for entry in os.listdir(folder_path) if os.path.isdir(os.path.join(folder_path, entry))]
# 作成日時順にソート
folder_names.sort(key=lambda x: os.path.getctime(os.path.join(folder_path, x)))
# フォルダ名を表示
print(folder_names)
['古いフォルダ', '新しいフォルダ']

この方法では、フォルダの作成日時に基づいてソートすることができます。

フォルダ名をファイルに保存する方法

取得したフォルダ名をファイルに保存することもできます。

ここでは、テキストファイルとCSVファイルへの保存方法を紹介します。

テキストファイルに保存

フォルダ名をテキストファイルに保存する方法です。

import os
# 指定したフォルダのパス
folder_path = '指定したフォルダのパス'
# フォルダ内の全てのエントリを取得
folder_names = [entry for entry in os.listdir(folder_path) if os.path.isdir(os.path.join(folder_path, entry))]
# テキストファイルに保存
with open('folder_names.txt', 'w', encoding='utf-8') as f:
    for name in folder_names:
        f.write(name + '\n')

このコードを実行すると、folder_names.txtというファイルにフォルダ名が保存されます。

CSVファイルに保存

フォルダ名をCSVファイルに保存する方法です。

import os
import csv
# 指定したフォルダのパス
folder_path = '指定したフォルダのパス'
# フォルダ内の全てのエントリを取得
folder_names = [entry for entry in os.listdir(folder_path) if os.path.isdir(os.path.join(folder_path, entry))]
# CSVファイルに保存
with open('folder_names.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    for name in folder_names:
        writer.writerow([name])

このコードを実行すると、folder_names.csvというファイルにフォルダ名が保存されます。

よくある質問

os.listdir()とos.scandir()の違いは?

os.listdir()os.scandir()はどちらもディレクトリ内のエントリを取得するための関数ですが、いくつかの重要な違いがあります。

  • 戻り値の形式:
  • os.listdir()は、指定したディレクトリ内の全てのファイルとフォルダの名前をリストとして返します。
  • os.scandir()は、エントリの情報を持つos.DirEntryオブジェクトのイテレータを返します。

このオブジェクトは、エントリがフォルダかどうかを判定するためのメソッドis_dir()is_file()を持っています。

  • パフォーマンス:
  • os.scandir()は、エントリの情報を取得する際に、ファイルシステムへのアクセスを最小限に抑えるため、os.listdir()よりもパフォーマンスが良い場合があります。

フォルダが存在しない場合のエラーハンドリングは?

フォルダが存在しない場合、os.listdir()os.scandir()を使用するとFileNotFoundErrorが発生します。

このエラーを適切に処理するためには、tryexcept文を使用します。

以下はその例です。

import os
folder_path = '指定したフォルダのパス'
try:
    folder_names = os.listdir(folder_path)
    print(folder_names)
except FileNotFoundError:
    print(f"指定したフォルダ '{folder_path}' は存在しません。")

このようにすることで、フォルダが存在しない場合でもプログラムがクラッシュすることなく、エラーメッセージを表示することができます。

隠しフォルダを除外するにはどうすればいいですか?

隠しフォルダを除外するためには、フォルダ名が特定の条件(通常は名前がドット.で始まる)を満たすかどうかを確認する必要があります。

以下は、os.listdir()を使用して隠しフォルダを除外する方法の例です。

import os
folder_path = '指定したフォルダのパス'
# フォルダ内の全てのエントリを取得し、隠しフォルダを除外
folder_names = [entry for entry in os.listdir(folder_path) if os.path.isdir(os.path.join(folder_path, entry)) and not entry.startswith('.')]
# フォルダ名を表示
print(folder_names)

このコードでは、フォルダ名がドットで始まる場合(隠しフォルダ)を除外しています。

pathlibモジュールを使用する場合も同様に、Pathオブジェクトを使って隠しフォルダを除外できます。

from pathlib import Path
folder_path = Path('指定したフォルダのパス')
# フォルダ内の全てのエントリを取得し、隠しフォルダを除外
folder_names = [entry.name for entry in folder_path.iterdir() if entry.is_dir() and not entry.name.startswith('.')]
# フォルダ名を表示
print(folder_names)

このように、隠しフォルダを除外するためには、フォルダ名の条件をチェックすることで簡単に実現できます。

まとめ

この記事では、Pythonを使用して指定フォルダ内のフォルダ名を取得する方法について詳しく解説しました。

具体的には、osモジュールやpathlibモジュールを利用したフォルダ名の取得、フォルダ名のフィルタリング、サブフォルダの再帰的取得、フォルダ名のソート、さらにはフォルダ名をファイルに保存する方法について触れました。

これらの知識を活用することで、ファイルシステムを効率的に操作し、必要な情報を迅速に取得することが可能になります。

ぜひ、実際のプロジェクトや日常のタスクにこれらのテクニックを取り入れて、Pythonプログラミングのスキルをさらに向上させてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • ファイル (122)
  • 標準入出力 (26)
  • URLをコピーしました!
目次から探す