Pythonでフォルダ中のファイル一覧を取得する

公開日:2019-05-07
最終更新:2019-05-09

概要

Pythonを用いて、任意のフォルダ内に存在するファイルの一覧を取得する方法を記述する。

実行環境

  • Windows 10
  • Python 3.6

なお、Windowsで実行する場合、パスの指定では\\/の両方を利用できるが、下記の例では\\を利用している。

フォルダー構造

検索対象のフォルダ構造は下記の通りとする。

C:\TEST_DIR  
│  hoge.json  
│  hogehoge.log  
│  hoge.txt  
│  
├─hoge  
│      hoge_sub_dir.txt  
│  
├─sub.c  
├─sub_a  
│      hoge_sub_a.txt  
│      hoge_sub_ab.txt  
│  
└─sub_b  
        hoge_sub_b.txt  

まずはとりあえず一覧を取得

フォルダ中の全ファイルを取得して出力するには下記の通りとする。基本的にはglobを利用すればいい。

>>> import glob  
>>> glob.glob("c:\\test_dir\\*")  
['c:\\test_dir\\hoge', 'c:\\test_dir\\hoge.json', 'c:\\test_dir\\hogehoge.log', 'c:\\test_dir\\hoge.txt', 'c:\\test_dir\\sub.c', 'c:\\test_dir\\sub_a', 'c:\\test_dir\\sub_b']  

ただし、この場合はappフォルダ配下に存在するフォルダー名も一緒に出力される。

なお、相対パスでも指定できる。

>>> glob.glob(".\\*")  
['.\\hoge', '.\\hoge.json', '.\\hogehoge.log', '.\\hoge.txt', '.\\sub.c', '.\\sub_a', '.\\sub_b']  

相対パスで指定した場合は、出力内容も相対パスとして返ってくる。

ワイルドカードによる条件指定

ワイルドカードとして条件指定できる文字は下記の通り。

  • *:すべてにマッチする。
  • ?:任意の1文字にマッチする。
  • [seq]:seq にある任意の文字にマッチする。[0-9]とすると任意の数字1文字が指定できる。
  • [!seq]:seq にない任意の文字にマッチする。[!0-9]とすると任意の数字1文字以外が指定できる。

サブフォルダを含めて一覧を取得

サブフォルダを含めて検索して全ファイルを出力対象とする場合は、recursiveオプションを付与しTrueを指定する。それと、検索対象のパスにアスタリスクを2つ記述する。

>>> glob.glob(".\\**", recursive=True)  
['.\\', '.\\hoge', '.\\hoge\\hoge_sub_dir.txt', '.\\hoge.json', '.\\hogehoge.log', '.\\hoge.txt', '.\\sub.c', '.\\sub_a', '.\\sub_a\\hoge_sub_a.txt', '.\\sub_a\\hoge_sub_ab.txt', '.\\sub_b', '.\\sub_b\\hoge_sub_b.txt']  
>>> glob.glob("c:\\test_dir\\**", recursive=True)  
['c:\\test_dir\\', 'c:\\test_dir\\hoge', 'c:\\test_dir\\hoge\\hoge_sub_dir.txt', 'c:\\test_dir\\hoge.json', 'c:\\test_dir\\hogehoge.log', 'c:\\test_dir\\hoge.txt', 'c:\\test_dir\\sub.c', 'c:\\test_dir\\sub_a', 'c:\\test_dir\\sub_a\\hoge_sub_a.txt', 'c:\\test_dir\\sub_a\\hoge_sub_ab.txt', 'c:\\test_dir\\sub_b', 'c:\\test_dir\\sub_b\\hoge_sub_b.txt']  

この場合でも相対パスで指定した場合は、出力内容も相対パスとなる。

ちなみに、アスタリスクを2つ記述する方法はバージョン3.5以降でサポートされているので、それより前のバージョンではこの方法は利用できない。

特定の拡張子であるファイルの一覧を取得

拡張子で出力対象を指定できる。

>>> glob.glob(".\\*.txt")  
['.\\hoge.txt']  
>>> glob.glob(".\\*.log")  
['.\\hogehoge.log']  

前述のワイルドカードを用いた指定もできる。

>>> glob.glob(".\\*.*o*")  
['.\\hoge.json', '.\\hogehoge.log']  

ドットを含むフォルダーが存在する場合pathlib.Path()を使う

ファイルだけを検索対象としたい場合で、下記のように記述したとする。

>>> glob.glob(".\\*.*")  
['.\\hoge.json', '.\\hoge.txt', '.\\hogehoge.log', '.\\sub.c']  

すると、「sub.c」が出力されて、本来は除外したいフォルダーまでが結果に含まれてしまう。これはフォルダーにドット(ピリオド)を含んでいるため。globでは単純に文字列として条件に一致するかどうかを見ているので、「フォルダーかファイルか」の判断は行えない。

厳密にフォルダー、あるいはファイルのみを対象としたい場合はpathlibを利用する。

>>> from pathlib import Path  
>>> p = Path(".")  
>>> print(type(p))  
<class 'pathlib.WindowsPath'>  
>>> [x for x in p.iterdir() if x.is_dir()]  
[WindowsPath('hoge'), WindowsPath('sub.c'), WindowsPath('sub_a'), WindowsPath('sub_b')]  
>>> [x for x in p.iterdir() if x.is_file()]  
[WindowsPath('hoge.json'), WindowsPath('hoge.txt'), WindowsPath('hogehoge.log')]  

あるいは絶対パスで指定する。

>>> p = Path("c:\\test_dir\\")  
>>> print(type(p))  
<class 'pathlib.WindowsPath'>  
>>> [x for x in p.iterdir() if x.is_dir()]  
[WindowsPath('c:/test_dir/hoge'), WindowsPath('c:/test_dir/sub.c'), WindowsPath('c:/test_dir/sub_a'), WindowsPath('c:/test_dir/sub_b')]  
>>> [x for x in p.iterdir() if x.is_file()]  
[WindowsPath('c:/test_dir/hoge.json'), WindowsPath('c:/test_dir/hoge.txt'), WindowsPath('c:/test_dir/hogehoge.log')]  

is_dir()を利用すればフォルダーのみ、is_file()を利用すればファイルのみを抽出できる。

記事が少しでもいいなと思ったらクラップを送ってみよう!
16
+1
@webmaster909の技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする