【Python入門】指定ディレクトリのファイル一覧を取得する方法|os・glob・pathlibの使い分け

Python

作業をしているとサブディレクトリを含む全てのファイル名を取得したい場合があると思います。

Pythonで特定のフォルダ(ディレクトリ)内にあるファイル名を一覧で取得したいときは、osモジュールやglobモジュール、pathlibなどを使うのが一般的です。本記事では、初心者の方でもわかりやすいように、それぞれの方法の使い方・違い・注意点を具体例付きで解説します。

この記事の対象

  • glob、osの使用方法を知りたい方
  • ファイル名を簡単に取得したい方
  • ルートディレクトリでファイルを取得したい方
スポンサーリンク
スポンサーリンク

ファイル一覧を取得する主な3つの方法

方法特徴Pythonバージョン
os.listdir()標準的で古くからあるすべて対応
glob.glob()ワイルドカードで柔軟な検索が可能すべて対応
pathlibオブジェクト指向で書きやすい3.4以降推奨

os.listdir() を使った基本例

import os

files = os.listdir('sample_dir')
print(files)  # ファイル名とフォルダ名がリストで返る

ディレクトリ内の「ファイル」だけでなく「サブフォルダ」も含まれる点に注意。

glob.glob() を使った方法

import glob

files = glob.glob('sample_dir/*')  # フルパスで取得
print(files)

*.txt と指定すれば、特定の拡張子だけ取得できます。

pathlib を使う(Pythonicな書き方)

from pathlib import Path

p = Path('sample_dir')
files = [f.name for f in p.iterdir() if f.is_file()]
print(files)

拡張性が高く、オブジェクト指向で記述がきれいになります。

ファイルだけを抽出する(isfileの利用)

import os

files = [f for f in os.listdir('sample_dir') if os.path.isfile(os.path.join('sample_dir', f))]
print(files)

os.path.isfile() を使うことでサブディレクトリを除外できます。

具体的な使用例

ファルダ内にあるexcelファル名を取得して出力しました。

globを用いた場合

カレントディレクトリのみ

import glob
#1---フォルダ内のxlsxファイルの一覧を取得
files = sorted(glob.glob('*.csv'))
print(files)

ファイルの一覧を取得するには「glob()」関数を用いることが簡単です。

「glob.glob(‘*.csv’)」として、フォルダ内の全てのcsvファイルを指定しています。「sorted()」関数では出力時、見やすいように並び替えをしています。

最後に出力です。

結果
['7731_2010.csv', '7731_2011.csv', '7731_2012.csv', '7731_2013.csv', '7731_2014.csv', '7731_2015.csv', '7731_2016.csv', '7731_2017.csv', '7731_2018.csv', '7731_2019.csv', '7731_2020.csv']

サブディレクトリを含む

import glob
for f in glob.glob("./**/*.*", recursive=True):
    print(f)

サブディレクトリ内のファイル名を取得したい場合は、引数にpath(ワイルドカードを用いて)と「recursive」をTrueにする事で簡単に取得できます。

osを用いた場合

import os

#1---ファイルを検索するルートディレクトリのパス
root_dir = r'C:\hoge\hoge\src'

#2---ルートディレクトリ以下の全てのファイルを取得
for dirpath, dirnames, filenames in os.walk(root_dir):
    for filename in filenames:
        #3---ファイルパスを取得
        file_path = os.path.join(dirpath, filename)
        print(file_path)

上記のコードでは、os.walk()メソッドを使用して、指定されたルートディレクトリ以下の全てのファイルを再帰的に検索しています。

以下は解説になります。

#1---ファイルを検索するルートディレクトリのパス
root_dir = r'C:\hoge\hoge\src'

1の部分ではディレクトリを指定しています。

#2---ルートディレクトリ以下の全てのファイルを取得
for dirpath, dirnames, filenames in os.walk(root_dir):

2の部分ではos.walk()メソッドを用いてファイル名を取得しています。

#3---ファイルパスを取得
file_path = os.path.join(dirpath, filename)
print(file_path)

最後にファイルのpathを作成して出力しています。

まとめ:使い分けのポイント

状況推奨手法
とにかく一覧を取得したいos.listdir()
拡張子やパターンで絞りたいglob.glob()
直感的で拡張性の高いコードを書きたいpathlib

関連記事

ファイル名を取得したら、次はファイルの読み書き方法も学んでみましょう!

タイトルとURLをコピーしました