🐈
内包表記で jpg ファイルを見つけてリスト化する方法
概要
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