Pythonを使って機械学習をはじめると、CSVなどのファイルを読み込んで、データをプログラムに取り込みたくなることがありますよね。
そんなときは、直接ファイルパスを指定して対応することもできますが、ファイル数が多い場合やランダムにつけられたファイル名を読み込む場合などには不便です。
そこで、ディレクトリやファイルの一覧を取得したいという要求が出てくるわけですが、今回はそんな要求に答えてくれる関数「listdir」の使い方について紹介します。
ファイルやディレクトリの一覧を取得する方法
まずは、「os」というモジュールをインポートします。
import os
osモジュールは、OSに依存しているさまざまな機能を利用できるモジュールで、ファイルやパスの操作が可能です。
ここでは、osモジュールの「listdir」関数を使ってファイルやディレクトリの一覧を取得します。
たとえば、次のようなディレクトリ構造の一覧を取得したい場合、以下のサンプルプログラム(listdir_test.py)で取得することができます。
├ listdir_test.py └ data/ ├ dir1/ ├ dir2/ ├ dir3/ ├ csv1.csv ├ text1.txt └ text2.txt
◆サンプルプログラム(listdir_test.py):
import os path = 'data/' directory = os.listdir(path) print(directory)
◆実行結果:
['dir1', 'dir2', 'dir3', 'csv1.csv', 'text1.txt', 'text2.txt']
指定したディレクトリ「data」のファイルとディレクトリの一覧を取得することができましたね。
ちなみに、サンプルプログラムは以下のように入力すれば実行できます。
python listdir.py
ファイルのみの一覧を取得する方法
先ほどはファイルとディレクトリの一覧を取得しましたが、場合によってはファイルのみ、ディレクトリのみを取得したいことがあります。
ファイルのみを取得したい場合は、「path.isfile」関数を使ってファイルのみを抽出します。
◆サンプルプログラム:
import os path = 'data/' files = [] for i in os.listdir(path): if os.path.isfile(path + i): files.append(i) print(files)
◆実行結果:
['csv1.csv', 'text1.txt', 'text2.txt']
ファイルのみを取得することができましたね。
このプログラムでは、for文でlistdir関数を使って取得したパスがファイルかどうかを判定し、ファイルの場合はfilesに追加するようにしています。
ディレクトリのみの一覧を取得する方法
ディレクトリのみを取得したい場合は、先ほどの「path.isfile」関数を「path.isdir」関数に置き換えて、ディレクトリのみを抽出するようにします。
◆サンプルプログラム:
import os path = 'data/' files = [] for i in os.listdir(path): if os.path.isdir(path + i): files.append(i) print(files)
◆実行結果:
['dir1', 'dir2', 'dir3']
ディレクトリのみも取得することができましたね。
拡張子を指定して一覧を取得する方法
では、最後に拡張子を指定して一覧を取得する方法について紹介します。ただし、この場合は「listdir」ではなく、「glob」という関数を使います。
たとえば、「.txt」の拡張子のみを取得したい場合、ワイルドカード(*)を使って、以下のサンプルプログラムで実現できます。
◆サンプルプログラム:
import glob path = 'data/*.txt' files = glob.glob(path) print(files)
◆実行結果:
['data\\text1.txt', 'data\\text2.txt']
これで拡張子を指定して一覧を取得することができました。
あとは、今回紹介した方法を組み合わせて使えば、ディレクトリやファイル、拡張子の一覧を取得して、必要なデータをプログラムに取り込むことができますよ。
コメント