[Python] ファイル名やフォルダ名の一覧を取得する

Python ファイル操作

指定したパス内のファイル名やフォルダ名の一覧をリストで取得するには、os.listdir()を使う方法と、glob.blob()を使う方法があります。
os.listdir()は、os.isfile()や正規表現と組み合わせることで特定の条件のファイル名やフォルダ名を抽出することも出来ますが、glob.glob()は同様の動作をこの関数だけで実現できます。
本記事ではこれらの関数の使い方と併せて、os.walk()を使ったサブフォルダ内の中身まで全て取得できる方法についてもまとめます。
# 2019/3/3 記事更新

確認した環境

  • OS: Ubuntu 16.04LTS
  • Python: ver3.6.4

フォルダ構成の例

以下のフォルダ構成を例にして解説していきます。

#カレントディレクトリの絶対パス
$ pwd
/home/hibikisan/rensyu/testdir

#testdirフォルダの中身
$ tree
.
├── sample
│   ├── file0.txt
│   └── subdir01
│       └── file1.txt
├── sample_1
├── sample_2.txt
├── sample_3.py
├── sample_4.txt
└── sample_5.txt

2 directories, 7 files

ファイル名とフォルダ名を取得する(os.listdir)

フォルダ内のファイルとフォルダの一覧を取得するには、os.listdir()関数を使います。

  • 使い方は下記の通り、ファイル名やフォルダ名の一覧を取得したいディレクトリパスを文字列で引数pathに指定します。
  • ディレクトリ内のファイル名やフォルダ名が一覧でリスト形式で返ります。(但し順番は不定)
>>> import os
>>> path = '/home/hibikisan/rensyu/testdir'

#フォルダ内のファイル名とフォルダ名をリストで出力
>>> os.listdir(path)
['sample_1', 'sample_2.txt', 'sample', 'sample_3.py', 'sample_4.txt', 'sample_5.txt']

応用例

フォルダ内のファイルのみを取得(os.path.isfileとの組み合わせ)

os.path.isfile()関数は、指定したpathがファイルであればTrueを、そうでなければFalseを返す関数です。これを使って、ファイルのみを抽出する例を下記に示します。

>>> path = '/home/hibikisan/rensyu/testdir'
>>> files = []
>>> for filename in os.listdir(path):
...     if os.path.isfile(os.path.join(path, filename)): #ファイルのみ取得
...         files.append(filename)
... 
>>> files
['sample_1', 'sample_2.txt', 'sample_3.py', 'sample_4.txt', 'sample_5.txt']

<参考記事>os.path.isfile()については以下の記事でまとめています。

特定の文字列を含んだファイルのみを抽出(正規表現を使った方法)

正規表現を使って、特定の文字列(ここでは.txt)を含んだファイル名を抽出する例を下記に示します。

>>> import re
>>> txtfiles = []
>>> regex = re.compile(r'(.txt)$')
>>> for name in files:  #filesは上記例で得られたリスト
...     if regex.search(name):
...         txtfiles.append(name)
... 
>>> txtfiles
['sample_2.txt', 'sample_4.txt', 'sample_5.txt']

<参考記事>正規表現についてはこちらの記事でもまとめています。

glob.glob()を使ったファイル名/フォルダ名の取得

これまでに見てきたようなフォルダ名・ファイル名の一覧を取得したり、特定の条件のファイル名を取得する動作はglob.glob()関数を使っても実現できます。

この関数は上記の正規表現を使った方法をもっと簡単にしたような機能を持っていて、第一引数で設定したpathnameにマッチしたパス名のリストを返します。
pathnameは絶対パスでも相対パスでも指定可能。また、ワイルドカードも使用可。

glob.glob(pathname, *, recursive=False)
  • フォルダ内のファイル名とフォルダ名を取得する例
>>> import glob
>>> path = '/home/hibikisan/rensyu/testdir'

# ワイルドカード(*)のみを指定すると全てのファイル名とフォルダ名が取得できます
>>> glob.glob(os.path.join(path, '*'))
['/home/hibikisan/rensyu/testdir/sample_1',
 '/home/hibikisan/rensyu/testdir/sample_2.txt',
 '/home/hibikisan/rensyu/testdir/sample',
 '/home/hibikisan/rensyu/testdir/sample_3.py', 
 '/home/hibikisan/rensyu/testdir/sample_4.txt', 
 '/home/hibikisan/rensyu/testdir/sample_5.txt']
  • 特定の文字列を含んだ(ここでは.txt)ファイルを抽出する例
>>> import glob
>>> path = '/home/hibikisan/rensyu/testdir'

# ワイルドカード(*)を使った文字列パターンを指定
>>> glob.glob(os.path.join(path, '*.txt'))
['/home/hibikisan/rensyu/testdir/sample_2.txt',
 '/home/hibikisan/rensyu/testdir/sample_4.txt',
 '/home/hibikisan/rensyu/testdir/sample_5.txt']

#カレントディレクトリに移動すると、ファイル名のみ取得できる
>>> os.chdir(path)
>>> glob.glob('*.txt')
['sample_2.txt', 'sample_4.txt', 'sample_5.txt']

フォルダ内のサブフォルダを全て調べる

os.walk()関数を使うと、サブフォルダの中身まで含めて取得することが出来ます。

os.walk(top, topdown=True, onerror=None, followlinks=False)
  • 調べたいフォルダのパスを第一引数topに指定します。
  • 返り値は3つ要素のタプル(dirpath, dirname, filenames)です。
    • dirpath :ディレクトリパス
    • dirname :dirpathで指定したディレクトリ内のサブディレクトリ名のリスト
    • filename :dirpath内のファイル名(ディレクトリでない)のリスト

尚、topdownパラメータはルートディレクトリからサブディレクトリに向かって検索していくかどうかを設定します(デフォルトはTrue)。例を以下に示します。

>>> import os
>>> path = '/home/hibikisan/rensyu/testdir'
>>> for d, s, f in os.walk(path):
...     print('')
...     print('── {}'.format(d))
...     print(' └── {}'.format(s))
...     print('   └── {}'.format(f))
... 
#結果
── /home/hibikisan/rensyu/testdir
 └── ['sample']
   └── ['sample_1', 'sample_2.txt', 'sample_3.py', 'sample_4.txt', 'sample_5.txt']

── /home/hibikisan/rensyu/testdir/sample
 └── ['subdir01']
   └── ['file0.txt']

── /home/hibikisan/rensyu/testdir/sample/subdir01
 └── []
   └── ['file1.txt']

Topdownパラメータ=Falseと設定した場合

>>> for d, s, f in os.walk(path, topdown=False):
...     print('')
...     print('── {}'.format(d))
...     print(' └── {}'.format(s))
...     print('   └── {}'.format(f))
... 
#結果
── /home/hibikisan/rensyu/testdir/sample/subdir01
 └── []
   └── ['file1.txt']

── /home/hibikisan/rensyu/testdir/sample
 └── ['subdir01']
   └── ['file0.txt']

── /home/hibikisan/rensyu/testdir
 └── ['sample']
   └── ['sample_1', 'sample_2.txt', 'sample_3.py', 'sample_4.txt', 'sample_5.txt']

まとめ

指定したフォルダ内のファイル名やフォルダ名の一覧を取得する方法についてまとめました。

  • os.listdir()関数を使ったフォルダ内のファイルとフォルダの一覧を取得方法
    • os.path.isfile()関数os.path.isdir()関数正規表現を組み合わせて、特定の条件のファイルやフォルダを抽出する方法
  • glob.glob()関数を使ったファイル名とフォルダ名の一覧を取得方法
    • ワイルドカードをうまく使うことにより特定の条件のファイルやフォルダも抽出可能。

  • os.walk()関数を使ったサブフォルダの中身まで全部取得する方法

参考書籍

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project

コメント

  1. […] (2)プログラムの考え方  (A)フォルダ内のサブフォルダの一覧を取得するには、os.listdirモジュールを使う。  (B)フォルダ内のファイルの一覧を取得するには、glob.globモジュールを使う。  (C)ファイルのコピーは、shutilモジュールを使う。    下記のWEBページにお世話になりました。ありがとうございます。    ・[Python] ファイル名やフォルダ名の一覧を取得する […]