【Python】glob.globで読み込んだファイルの順番が名前順じゃないときの対応(Sortedを使って並べ替え)

Python

こんにちは、しらすです。

先日ファイル読み込み時にglob.glob使った際、ファイル名の順番ではなくバラバラに読み込まれる状態でした。

解決策 sortedを使う

files = sorted(glob.glob('data/*.jpg'))

sortedを使うことでファイル名順に並べ替えて出力してくれます。

数字を含む場合のソート

ようやく完了!と思っていましたが、2桁以上の数字が入ってきたときに並び順が自然でなくなってしましました。。。。

辞書的に順番で出力すると上記のようになってしまいますが、本当は1から順に並んでほしいですね。

ということでsortedの引数 keyを使うことで解消できます!少しだけ複雑ですが以下をコピペすればOK。

import re

def atoi(text):
    return int(text) if text.isdigit() else text

def natural_keys(text):
    return [ atoi(c) for c in re.split(r'(\d+)', text) ]

files = sorted(glob.glob('data/*.jpg'), key=natural_keys)

ようやく無事数値順に並べることができました。

参考

公式Howtoはこちら。数値を含む文字列の並び替えはこちらを参考にさせて頂きました。ありがとうございました。

コメント