ディレクトリに含まれるファイルとディレクトリの一覧を取得する

Python の os モジュールで用意されている os.listdir 関数を使って指定したディレクトリに含まれるファイルとディレクトリ名の一覧を取得する方法について解説します。あわせて os.path.isfile 関数および os.path.isdir 関数を使ってファイルかディレクトリかを判別する方法についても解説します。

※ pathlib モジュールを使ってファイルとディレクトリの一覧を取得するには「ディレクトリに含まれるファイルとディレクトリの一覧を取得する(pathlibモジュール)」を参照されてください。

(Last modified: )

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

指定したディレクトリに含まれるファイルとディレクトリの一覧を取得するには、 os モジュールに含まれる listdir 関数を使用します。書式は次の通りです。

os.listdir(path='.')

引数にディレクトリを指定すると、そのディレクトリに含まれるファイル名とディレクトリ名が要素として格納されたリストを返します。

例えば次のように記述します。

import os

path = './test/'
filelist = os.listdir(path)
print(filelist)
>> ['address.txt', 'doc', 'img', 'name.txt']

ファイル名もディレクトリ名も区別なくリストに要素として格納されます。

なお引数に指定したディレクトリ名と、取得したファイル名またはディレクトリ名を結合することで、パスを取得することができますが、このような場合に os.path モジュールで用意されている join 関数を使用すると便利です。

os.path.join(path, *paths)

複数のパスの要素を引数に指定すると、ディレクトリの区切り文字を間に挟んで結合した結果を返してくれます。実際の使い方はこのあとのサンプルをみてください。

サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 sample5-1.py という名前で保存します。

import os

path = './test/'
filelist = os.listdir(path)

for f in filelist:
  print(f)
  print(os.path.join(path, f))

プログラムと同じディレクトリの中に test という名前のディレクトリがあり、 test ディレクトリの中に次のようにファイルとディレクトリが含まれています。

ファイルとディレクトリの一覧を取得する(1)

その後で、次のように実行してください。

python sample5-1.py

ファイルとディレクトリの一覧を取得する(2)

指定したパスに含まれるファイル名またはディレクトリ名と、それぞれのパスを取得して画面に出力しました。

ファイルかディレクトリなのかを調べる

指定したパスがファイルかディレクトリなのかを調べるには os.path モジュールで用意されている isfile 関数および isdir 関数を使用します。

os.path.isfile(path)

引数に指定したパスが実際に存在し、且つファイルだった場合に True を返します。

os.path.isdir(path)

引数に指定したパスが実際に存在し、且つディレクトリだった場合に True を返します。

どちらの関数も実際に存在しなかった場合には False を返します。

例えば次のように記述します。

import os

path = './test/'
print(os.path.isfile(path))
>> False
print(os.path.isdir(path))
>> True

path = './test/address.txt'
print(os.path.isfile(path))
>> True
print(os.path.isdir(path))
>> False
サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 sample5-2.py という名前で保存します。

import os

path = './test/'
filelist = os.listdir(path)

for f in filelist:
  if os.path.isfile(os.path.join(path, f)):
    print('[F]:' + f)
  else:
    print('[D]:' + f)

プログラムと同じディレクトリの中に test という名前のディレクトリがあり、 test ディレクトリの中に次のようにファイルとディレクトリが含まれています。

指定のパスがファイルかディレクトリなのかを判別する(1)

その後で、次のように実行してください。

python sample5-2.py

指定のパスがファイルかディレクトリなのかを判別する(2)

指定したパスに含まれるファイルまたはディレクトリに対して、ファイルなのかディレクトリなのかを調べて表示しました。

ファイルやディレクトリに関する情報も併せて取得する

指定したディレクトリに含まれるファイルとディレクトリの一覧を取得する別の方法として、 os モジュールに含まれる scandir 関数を使用します。書式は次の通りです。

os.scandir(path='.')

引数にパスを指定すると、そのパスに含まれるファイルとディレクトリに関する情報を持つ os.DirEntry オブジェクトのイテレータを返します。ファイルやディレクトリの名前だけでなく、ファイルなのかディレクトリなのかの情報や、ファイルのサイズや作成時刻などの情報を持っています。

os.DirEntry クラスの属性である name を参照することでファイル名またはディレクトリ名を取得することができ、 path 属性を参照することでパスを取得することができます。

例えば次のように記述します。

import os

path = './test/'
itr = os.scandir(path)
f = next(itr)

print(f.name)
>> address.txt

print(f.path)
>> ./test/address.txt

イテレータから要素を一つ取り出してファイル名とパスをそれぞれ出力しました。

また os.DirEntry クラスで用意されている isfile メソッド、または isdir メソッドを使用することでファイルかディレクトリかを識別することができます。

is_file(*, follow_symlinks=True)

この項目が実際に存在し、且つファイルまたはファイルへのシンボリックリンクである場合 True を返します。

is_dir(*, follow_symlinks=True)

この項目が実際に存在し、且つディレクトリまたはディレクトリへのシンボリックリンクである場合 True を返します。

例えば次のように記述します。

import os

path = './test/'
itr = os.scandir(path)
f = next(itr)

print(f.name)
>> address.txt

print(f.is_file())
>> True

print(f.is_dir())
>> False

イテレータから要素を一つ取り出してファイル名またはディレクトリ名を出力し、ファイルなのかディレクトリなのかを出力しました。

サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 sample5-3.py という名前で保存します。

import os

path = './test/'
for i in os.scandir(path):
  if i.is_file():
    print('[F]:' + i.name + ' ' + i.path)
  else:
    print('[D]:' + i.name + ' ' + i.path)

プログラムと同じディレクトリの中に test という名前のディレクトリがあり、 test ディレクトリの中に次のようにファイルとディレクトリが含まれています。

ファイルやディレクトリに関する情報も併せて取得する(1)

その後で、次のように実行してください。

python sample5-3.py

ファイルやディレクトリに関する情報も併せて取得する(2)

指定したパスに含まれるファイル名またはディレクトリ名と、それぞれのパスを取得して画面に出力しました。

-- --

Python を使って指定したディレクトリに含まれるファイルとディレクトリ名の一覧を取得する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。