スポンサーリンク

【Python】フォルダ内の全ファイルパスを再帰的に取得する方法

Python
たろ
たろ

フォルダ内の全てのファイルパスを取得するにはどうしたらいんだろう・・・

こんな疑問にお答えします。

本記事の内容
  • Pythonでフォルダ内のファイルパスを取得する方法
  • 利用するライブラリ「glob」の使い方の説明
  • コードを交えた具体的な説明
スポンサーリンク

Pythonでファイルパスを取得できるの?

globというモジュールを使うことでさくっと取得できます。

具体的にはPython標準モジュールの「glob」を使います。

glob モジュールは Unix シェルで使われているルールに従い指定されたパターンに一致するすべてのパス名を見つけ出します。返される結果の順序は不定です。

glob — Unix 形式のパス名のパターン展開

環境

$ python3 -V
Python 3.7.2

globを使った実演

フォルダ内のファイルは以下のように保存されているとします。

.
├── folder
│   ├── folder_img
│   │   ├── image1.png
│   │   ├── image2.png
│   │   └── image3.png
│   └── folder_txt
│       ├── folder_document
│       │   ├── doc1.txt
│       │   ├── doc2.txt
│       │   └── doc3.txt
│       ├── text1.txt
│       ├── text2.txt
│       └── text3.txt
└── t.py

Pythonスクリプト内のコードは以下のように実装しています。

import glob

path = './folder/'
file_path_lists = glob.glob("{}/**".format(path), recursive=True)
print(file_path_lists)

recursive=True とし“**” と記載することで、“**” 以下のあらゆるファイルにマッチすることになります。

上のコードを実行すると下記のようになります。

$ python3 t.py 
['./folder/', './folder/folder_txt', './folder/folder_txt/folder_document', './folder/folder_txt/folder_document/doc1.txt', './folder/folder_txt/folder_document/doc3.txt', './folder/folder_txt/folder_document/doc2.txt', './folder/folder_txt/text1.txt', './folder/folder_txt/text3.txt', './folder/folder_txt/text2.txt', './folder/folder_img', './folder/folder_img/image1.png', './folder/folder_img/image2.png', './folder/folder_img/image3.png']

また、recursive=Trueやパスに“**”を指定しない場合の例を確認します。

path = './folder/'
file_path_lists = glob.glob("{}/*".format(path), recursive=True)
print(file_path_lists)

print('============================================')

path = './folder/'
file_path_lists = glob.glob("{}/**".format(path))
print(file_path_lists)

再帰的な探索が行われない点に注意する必要があります。

$ python3 t.py 
['./folder/folder_txt', './folder/folder_img']
============================================
['./folder/folder_txt', './folder/folder_img']

取得したパスリストからディレクトリパスだけを抽出する

例えば取得したパスリストからディレクトリのパスリストを抽出したい場合は以下のように実装します。

import os
import glob

path = './folder/'
file_path_lists = glob.glob("{}/**".format(path), recursive=True)

for file_path in file_path_lists:
    if (os.path.isdir(file_path)):
        print(file_path)

実行結果はこちら↓

$ python3 t.py 
./folder/
./folder/folder_txt
./folder/folder_txt/folder_document
./folder/folder_img

取得したパスリストからファイルのタイムスタンプを取得する

ファイルのタイムスタンプを取得する場合は以下のように実装します。

import os
import glob
import datetime

path = './folder/'
file_path_lists = glob.glob("{}/**".format(path), recursive=True)

for file_path in file_path_lists:
    if (os.path.isfile(file_path)):
        stat = os.stat(file_path)
        last_modified = stat.st_mtime # 最後に変更された時刻を取得
        print(file_path)
        print(datetime.datetime.fromtimestamp(last_modified))

実行結果はこちら↓

$ python3 t.py 
./folder/folder_txt/folder_document/doc1.txt
2022-02-08 09:29:27.248062
./folder/folder_txt/folder_document/doc3.txt
2022-02-08 09:29:30.330200
./folder/folder_txt/folder_document/doc2.txt
2022-02-08 09:29:28.757535
./folder/folder_txt/text1.txt
2022-02-08 09:19:51.563566
./folder/folder_txt/text3.txt
2022-02-08 09:19:54.475132
./folder/folder_txt/text2.txt
2022-02-08 09:19:52.846139
./folder/folder_img/image1.png
2022-02-08 09:20:05.410837
./folder/folder_img/image2.png
2022-02-08 09:20:07.314396
./folder/folder_img/image3.png
2022-02-08 09:20:08.833873

おわりに

まとめ
  • Pythonでフォルダ内の全てのパスを取得する方法を紹介しました。
  • モジュールはglobを使います。
  • パス情報を使って様々な応用ができることを確認しました。

コメント

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