文法・環境

【python】ファイル名、フォルダ名の一覧取得【osモジュール、globモジュール、再帰的な取得など】

pythonで、ファイル名やフォルダ名を取得する方法について、紹介します。

pythonの標準ライブラリである、osモジュールを用いる方法と、globモジュールを用いる方法について、それぞれサンプルコードを交えながら紹介します。

この記事で分かること

■osモジュールでファイル名やフォルダ名を取得

  • ファイル名、フォルダ名の一覧を取得
  • ファイル名のみの一覧を取得
  • フォルダ名のみの一覧を取得
  • パスの一覧を取得

■globモジュールでファイル名やフォルダ名を取得

  • ファイルパス、フォルダパスの一覧を取得
  • ファイルパスの一覧を取得
  • ファイル名の一覧を取得
  • 再帰的にファイルパス、フォルダパスの一覧を取得

スポンサーリンク

サンプルコードのフォルダ構成について

ファイル名、フォルダ名の取得方法を紹介する前に、
サンプルコードで使用するフォルダ構成を載せます。

フォルダ構成
フォルダ構成

では、さっそくファイル名、フォルダ名の取得方法について紹介していきます。
はじめに、osモジュールを用いる方法について紹介します。

osモジュールでファイル名やフォルダ名の一覧を取得

osモジュールを用いて、ファイル名やフォルダ名を取得する方法について、紹介します。

osモジュールはpythonの標準モジュールなので、pip等でのインストールをせずに使用することができます。

osモジュールでファイル名、フォルダ名を取得する場合は、listdir関数を使用します。

書き方

os.listdir( パス )

osモジュールのlistdir関数を使用すると、ファイル名とフォルダ名の両方をリストの要素として取得できます。

以下、サンプルコードです。

### osモジュールのlistdir関数で、ファイル名とフォルダ名を取得
import os

path = r'C:\"---任意のパス---"\folder'

folderfile = os.listdir(path)
print(folderfile)
# ['file1.txt', 'file2.txt', 'file3.txt', 'folder1', 'folder2', 'folder3', 'pic1.jpg', 'pic2.jpg', 'pic3.jpg']

> path = r'C:\"---任意のパス---"\folder'

「"---任意の保存先---"」の部分は、好きな場所に置き換えてください。

また、文字列の先頭に「r」をつけると、その文字列は 「raw文字列」 として扱われます

例えば、"\n"という文字列はpythonにより改行として扱われますが、raw文字列とすることで文字列の一部として扱われるようになります。

osモジュールを用いて、ファイル名のみの一覧を取得

先ほどの例では、listdir関数の返り値に、ファイル名とフォルダ名の両方が含まれていました。

次に、osモジュールのlistdir関数の出力結果から、ファイル名のみを取得する方法を紹介します。

ファイルかどうかを判定するために、os.path.isfile関数を使用します。

以下、listdir関数の出力結果から、ファイル名のみを取得するサンプルコードです。

###  osモジュールのlistdir関数を用いで、ファイル名のみを取得
import os

path = r'C:\"---任意のパス---"\folder'

folderfile = os.listdir(path)
print(folderfile)
# ['file1.txt', 'file2.txt', 'file3.txt', 'folder1', 'folder2', 'folder3', 'pic1.jpg', 'pic2.jpg', 'pic3.jpg']

file = [f for f in folderfile if os.path.isfile(os.path.join(path, f))]
print(file)
# ['file1.txt', 'file2.txt', 'file3.txt', 'pic1.jpg', 'pic2.jpg', 'pic3.jpg']

> file = [f for f in folderfile if os.path.isfile(os.path.join(path, f))]

リスト内包表記を用いて、条件を満たす要素を抽出し、新たなリストを作成しています。

リスト内包表記内の条件式は、if os.path.isfile(os.path.join(path, f)) の部分になります。

os.path.isfile関数にはパスの形で引数を渡さないといけないので、os.path.join関数でパスと文字列を連結し、パスの形にしています。

この条件式がTrueになった場合、つまりパスがファイルのパスだった場合に、その要素を新たなリストの要素とします。

この条件式の判定を、"folderfile"の要素すべてに適用することにより、
"folderfile"の要素から、ファイル名のみを抽出しています。

なお、内包表記の使い方については、下記の記事で紹介しています。

内包表記の基本的な使い方

osモジュールを用いて、フォルダ名のみの一覧を取得

次に、osモジュールのlistdir関数の出力結果から、フォルダ名のみを取得する方法を紹介します。

ファイルかどうかを判定するために、os.path.isdir関数を使用します。

以下、listdir関数の出力結果から、フォルダ名のみを取得するサンプルコードです。

前述の例から、os.path.isfile関数をos.path.isdir関数に変更しているだけになります。

###  osモジュールのlistdir関数を用いで、フォルダ名のみを取得
import os

path = r'C:\"---任意のパス---"\folder'

folderfile = os.listdir(path)
print(folderfile)
# ['file1.txt', 'file2.txt', 'file3.txt', 'folder1', 'folder2', 'folder3', 'pic1.jpg', 'pic2.jpg', 'pic3.jpg']

folder = [f for f in folderfile if os.path.isdir(os.path.join(path, f))]
print(folder)
# ['folder1', 'folder2', 'folder3']

osモジュールを用いて、ファイルパス、フォルダパスの一覧を取得

osモジュールのlistdir関数の場合は、返り値がファイル名、フォルダ名になります。

これをファイルパス、フォルダパスに変換する例を紹介します。

### osモジュールのlistdir関数を用いで、ファイルパス、フォルダパスを取得
import os
import pprint

path = r'C:\"---任意のパス---"\folder'

folderfile = os.listdir(path)
print(folderfile)
# ['file1.txt', 'file2.txt', 'file3.txt', 'folder1', 'folder2', 'folder3', 'pic1.jpg', 'pic2.jpg', 'pic3.jpg']

file_path = [os.path.join(path, f) for f in folderfile if os.path.isfile(os.path.join(path, f))]
pprint.pprint(file_path)
"""
['C:\\"---任意のパス---"\\folder\\file1.txt',
 'C:\\"---任意のパス---"\\folder\\file2.txt',
 'C:\\"---任意のパス---"\\folder\\file3.txt',
 'C:\\"---任意のパス---"\\folder\\pic1.jpg',
 'C:\\"---任意のパス---"\\folder\\pic2.jpg',
 'C:\\"---任意のパス---"\\folder\\pic3.jpg']
 """

folder_path = [os.path.join(path, f) for f in folderfile if os.path.isdir(os.path.join(path, f))]
pprint.pprint(folder_path)
"""
['C:\\"---任意のパス---"\\folder\\folder1',
 'C:\\"---任意のパス---"\\folder\\folder2',
 'C:\\"---任意のパス---"\\folder\\folder3']
"""

> import pprint

ファイルパスをprint関数で表示すると、非常に見にくくくなるので、pprintモジュールをインポートしています。

> file_path = [os.path.join(path, f) for f in folderfile if os.path.isfile(os.path.join(path, f))]

os.path.join(path, f) とすることで、新しいリストの要素を、パスの形にして出力しています。

スポンサーリンク

globモジュールでファイル名やフォルダ名の一覧を取得

globモジュールを用いて、ファイル名やフォルダ名を取得する方法について、紹介します。

globは英語で、"塊"という意味があります。
globモジュールを用いることで、検索パターンにマッチした、ファイル名、フォルダ名の一覧を取得できます
globで、検索パターンにマッチしたものを塊としてごっそり取得できる、とイメージしておくと分かりやすいですね。

globモジュールはpythonの標準モジュールなので、pip等でのインストールをせずに使用することができます。

globモジュールでファイル名、フォルダ名を取得する場合は、globモジュールの同名のglob関数を使用します。

書き方

glob.glob(検索するパターン)

検索するパターンは例えば、下記のように記述します。

特定のディレクトリ / *.jpg

「*」はワイルドカード文字と呼ばれるもので「任意の文字列」を表します。

上記のように検索パターンを記述することで、特定のディレクトリ内の拡張子.jpgのファイルのすべてのパスを取得できます。

以下、サンプルコードを交えながら、glob.glob関数の使い方を紹介します。

globモジュールを用いて、ファイルパス、フォルダパスの一覧を取得

初めに、glob.glob関数を用いて、ファイルパス、フォルダパスを両方同時に取得する方法を紹介します。

検索するパターンを「特定のディレクトリ / *」とすることで、
ファイルパスとフォルダパスを同時に取得できます。

### glob関数を用いてファイルパスとフォルダパスを同時に取得
import os
import glob
import pprint

path_search = r'C:\"---任意のパス---"\folder\*'

file_path = glob.glob(path_search)
pprint.pprint(file_path)
"""
['C:\\"---任意のパス---"\\folder\\file1.txt',
 'C:\\"---任意のパス---"\\folder\\file2.txt',
 'C:\\"---任意のパス---"\\folder\\file3.txt',
 'C:\\"---任意のパス---"\\folder\\folder1',
 'C:\\"---任意のパス---"\\folder\\folder2',
 'C:\\"---任意のパス---"\\folder\\folder3',
 'C:\\"---任意のパス---"\\folder\\pic1.jpg',
 'C:\\"---任意のパス---"\\folder\\pic2.jpg',
 'C:\\"---任意のパス---"\\folder\\pic3.jpg']
"""

globモジュールを用いて、ファイルパスの一覧を取得

次に、glob.glob関数を用いて、検索パターンに一致したファイルパスを取得する方法を紹介します。

以下、拡張子が .jpg のファイルパスを取得するサンプルコードです。

検索パターンを 「特定のディレクトリ / *.jpg」 としています。

### glob関数を用いてファイルパスを取得
import os
import glob
import pprint

path_search = r'C:\"---任意のパス---"\folder\*.jpg'

file_path = glob.glob(path_search)
pprint.pprint(file_path)
"""
['C:\\"---任意のパス---"\\folder\\pic1.jpg',
 'C:\\"---任意のパス---"\\folder\\pic2.jpg',
 'C:\\"---任意のパス---"\\folder\\pic3.jpg']
"""

globモジュールを用いて、ファイル名の一覧を取得

glob.glob関数の返り値はパスになります。

参考までに、glob.glob関数から出力されたファイルパスを、ファイル名に変換するサンプルコードを紹介します。

ファイルパスからファイル名を取得するために、osモジュールのos.path.basename関数を使用します。

### glob関数を用いて取得したファイルパスをファイル名に変換
import os
import glob
import pprint

path = r'C:\"---任意のパス---"\folder'
extension = '*.jpg'

path_search = os.path.join(path, extension)

file_path = glob.glob(path_search)
file = [os.path.basename(f) for f in file_path]
print(file)
# ['pic1.jpg', 'pic2.jpg', 'pic3.jpg']

> path_search = os.path.join(path, extension)

検索パターンを作成するのに、os.path.join関数を使用しています。

> file = [os.path.basename(f) for f in file_path]

os.path.basename関数で、パス文字列からファイル名を取得しています。

スポンサーリンク

globモジュールで再帰的にファイルパスやフォルダパスの一覧を取得

次に、globモジュールを用いて、ファイルパスやフォルダパスを再帰的に取得する方法を紹介します。

"「再帰的」にファイルパス、フォルダパスを取得する" とは、
現在のディレクトリから、さらに下層のディレクトリがある場合は、その下層のディレクトリ内のファイルフォルダまでパスを取得し、もっとも深い階層のファイルフォルダに到達するまでパスを取得することを指します。

glob.glob関数を用いて再帰的にファイルパス、フォルダパスを取得するためには、以下のように記述します。

再帰的に取得する書き方

glob.glob( 'ディレクトリ / **' , recursive = True)

引数に recursive = True を指定することで、再帰的にファイルパス、フォルダパスを取得できます
また、「**」を用いると、サブディレクトリをマッチさせることができ、複数階層のディレクトリまで情報を取得できるようになります。

以下、glob.glob関数を用いて、ファイルパスやフォルダパスを再帰的に取得するサンプルコードです。

### globモジュールを用いて、ファイルパスやフォルダパスを再帰的に取得
import os
import glob
import pprint

path = r'C:\"---任意のパス---"\folder'
extension = '**'

path_search = os.path.join(path, extension)

file_path = glob.glob(path_search, recursive=True)
print(len(file_path))
# 15
pprint.pprint(file_path)
"""
['C:\\"---任意のパス---"\\folder\\',
 'C:\\"---任意のパス---"\\folder\\file1.txt',
 'C:\\"---任意のパス---"\\folder\\file2.txt',
 'C:\\"---任意のパス---"\\folder\\file3.txt',
 'C:\\"---任意のパス---"\\folder\\folder1',
 'C:\\"---任意のパス---"\\folder\\folder1\\file1-1.txt',
 'C:\\"---任意のパス---"\\folder\\folder1\\file1-2.txt',
 'C:\\"---任意のパス---"\\folder\\folder1\\folder1-1',
 'C:\\"---任意のパス---"\\folder\\folder1\\folder1-2',
 'C:\\"---任意のパス---"\\folder\\folder1\\folder1-3',
 'C:\\"---任意のパス---"\\folder\\folder2',
 'C:\\"---任意のパス---"\\folder\\folder3',
 'C:\\"---任意のパス---"\\folder\\pic1.jpg',
 'C:\\"---任意のパス---"\\folder\\pic2.jpg',
 'C:\\"---任意のパス---"\\folder\\pic3.jpg']
"""

スポンサーリンク

まとめ

pythonで、ファイル名やフォルダ名を取得する方法について、紹介しました。

ファイル、フォルダの情報取得は、データ処理をするうえで必須になります。

osモジュール、globモジュールは便利なモジュールなので、基本的な使い方は覚えておくことをおすすめします。

スポンサーリンク

スポンサーリンク

-文法・環境
-