🐈

内包表記で jpg ファイルを見つけてリスト化する方法

2024/04/19に公開

概要

Pythonの内包表記を使って拡張子がJPGのファイルを見つける方法を書きます。
拡張子にこだわりはありません、XMLだったりPNGでもOKです。

はじめに

例えばタイトルの通り「.jpgファイルを見つける」ものをPythonで単純に書きます。

test1.py
import glob

file_list = glob.glob('./*.jpg')

これくらいなら簡単ですが、では.JPGという拡張子も許容しないといけない場合はどうすればいいでしょうか?
単純に書けば、

test2.py
import glob

jpg_list = glob.glob('./*.jpg')
JPG_list = glob.glob('./*.JPG')

ですが、意地悪して.JpGなんて拡張子だった場合(こういう書き方はまずありませんが)、それに対応したものをまた書かなければなりません。

test3.py
import glob

jpg_list = glob.glob('./*.jpg')
JPG_list = glob.glob('./*.JPG')
JpG_list = glob.glob('./*.JpG')

こんなのナンセンスですね。だからこうしましょう

test4.py
import glob

jpg_list = list()
file_list = glob.glob('./**')
for f in file_list:
    if f.lower().endswith('.jpg'):
        jpg_list.append(f) 

ミソはif f.lower().endswith('.jpg')で、ファイル名を小文字に変換してから.jpgにマッチするものを見つけているところです。

これでもいいんですが、なんか行が多いですよね。

解法

そこで、内包表記を使います。こんな感じで、

getjpg.py
import glob

jpg_list = [f for f in glob.glob('./**') if f.lower().endswith('.jpg')]

すっきりしました、書いてあることはtest4.py同等です。

欲張りな方法

これにもう少し欲張った方法を追加して、再帰的に検索をできるようにすると

getjpg_r.py
import glob

jpg_list = [f for f in glob.glob('./**',recursive=True) if f.lower().endswith('.jpg')]

となります。

じゃぁ、.jpeg があったらどうなるのさ?

という問いに対する答えもあります。

getjpeg_r.py
import glob

jpeg_list = [f for f in glob.glob('./**',recursive=True) if f.lower().endswith('.jpg') or f.lower().endswith('.jpeg')]

おわりに

内包表記は一行でもかなり有効なものが書かける優れものです。ぜひご活用ください。

Discussion