Pythonでディレクトリ名・ファイル名の一覧取得(os, glob)

Pythonでディレクトリ名・ファイル名の一覧取得(os, glob)
スポンサーリンク
スポンサーリンク

Pythonのos, globモジュールを使ってディレクトリ名(フォルダ名)、ファイル名の一覧をリストで取得する方法について説明します。サブディレクトリ内も含めて再帰的に取得する方法も解説していきます。

スポンサーリンク

使用モジュール

モジュール :os (Python公式ドキュメント
インストール:不要
モジュール :glob (Python公式ドキュメント
インストール:不要 

ディレクトリ構成の例

以下のようなファイル、ディレクトリ構成を例とします。


└── test
   ├── dir1
   │   ├── file11.txt
   │   └── subdir01
   │          └── file12.txt
   ├── dir2
   ├── file1.txt
   ├── file2.txt
   └── file03.txt

ファイル名とディレクトリ名の一覧を取得

ディレクトリ名とファイル名を取得するには os.listdir() を使用します。

ただし、指定したディレクトリ直下のディレクトリとファイルのみの取得になります。

サブディレクトリも含めて全てのリストを取得したい場合は、後述の再帰的な取得方法を参照してください。


以下のように1行で書いてもOK

ファイル名の一覧を取得

ファイル名を取得する方法を解説します。

osモジュールを使用

まず os.listdir() でディレクトリ名とファイル名を取得します。

次に、指定したパスがファイルかどうかを判定するos.path.isfile() を使ってファイルのみを抽出します。

globモジュールを使用

globモジュールを使ってもファイル名を取得することもできます。

globモジュールは指定パス内でパターンに一致する全てのパス名を見つけるため、ファイルを抽出するためにワイルドカードを使い*.*を追加します。(.* で全ての拡張子を表します)

ただし、取得した結果には親ディレクトリ名も含まれてしまう為、ファイル名のみ必要な場合は、os.path.basename()で末尾のファイル名のみを抽出する必要があります。

ディレクトリ名の一覧を取得

ディレクトリ名を取得する方法を解説します。

osモジュールを使用

まず os.listdir() でディレクトリ名とファイル名を取得します。

次に 指定したパスがディレクトリかどうかを判定するos.path.isdir() を使い、ディレクトリのみ抽出します。

globモジュールを使用

globモジュールでは以下のように記述します。パスの末尾にディレクトリの区切り文字/を付けることでディレクトリ名のみを抽出することができます。


結果の親ディレクトリ名を除くには、末尾の\\を削除してからos.path.basename()でディレクトリ名を抽出します。

条件に一致するファイルやディレクトリを取得する

globモジュールを使用

指定したディレクトリ以下に配置されているサブディレクトリ名や、ファイル名を取得する場合には、glob.glob()を利用します。

第一引数に検索対象とするパスを指定しますが、この時にワイルドカードを使用することで条件にマッチしたリストを取得することができます。

使用できるワイルドカードは以下になります。

記号説明
*長さ0文字以上の任意の文字列
?任意の一文字
[ – ][ – ]の範囲内に含まれる文字列
**あらゆるファイルや0個以上のディレクトリ、サブディレクトリにマッチ
再帰的な処理で引数recursive=Trueとセットで利用する。Python3.5からサポート。


* を使用して、ディレクトリ内の全てのディレクトリとファイル名を取得する


?を使用して、file+任意の1文字を含むファイル名を取得します。


[ – ]を使用して、”file”+任意の半角英字1文字から始まるファイル名を取得します。

ファイル名とディレクトリ名を再帰的に取得

サブディレクトリも含めて全てのファイル名とディレクトリ名を取得する方法を解説します。

osモジュールを使用

os.walk() を使用します。引数には対象とする先頭ディレクトリのパスを指定します。

検索順序はデフォルトではトップダウン(上から下へ)ですが、第二引数でtopdown=Flase と指定すると、ボトムアップ(下から上へ)に変更できます。


ボトムアップの場合は以下のようになります。
結果のリストが、最下層からの順番に変わっています。

globモジュールを使用

glob.glob() を使用します。

引数に検索対象のパスとして test/** のようにワイルドカードを2個並べて、第二引数にrecursive=Trueを指定することで再帰的に走査する事ができます。

ただし、指定したパス自身も結果に含まれてしまうため、結果リストの1番目の要素を削除します。




対象パスに条件を指定して、マッチしたものだけを抽出することもできます。

以下の例では拡張子がtxtのファイルを対象として抽出しています。

Pythonのosモジュール、globモジュールを使ってディレクトリ名、ファイル名を取得する方法について解説しました。