pathをソートする
pathを自然ソート(数字通りのソート)をするなら、下記の様にkey
にラムダ式を入れれば良い。
natsorted(list(pathlib.Path(パス).glob("*")),key=lambda x:x.name)
以下余談
pathごとソートしたら辞書ソートになってしまう話
大量の画像をPDF化するときに画像データをソートする必要があった。画像ファイルの名前はこんな感じ。
1.jpg
200.jpg
12.jpg
...
これを数字通りに並べたいから辞書ソートじゃなくて自然ソートしたい。
pathlib
で取得、natsort
を使ってソートしたら、こんな感じなった。
PosixPath('/Users/usrname/images/1.jpg'),
PosixPath('/Users/usrname/images/10.jpg'),
PosixPath('/Users/usrname/images/20.jpg'),
...
辞書ソートやんけ
いやnatsort
さん仕事してくださいよ。と思ったけどpathだとソートしてくれないっぽい。でもリファレンスにしっかり対策が書いてあった。
natsortのリファレンスより抜粋.py
>>> a = ['apple2.50', '2.3apple']
>>> natsorted(a, key=lambda x: x.replace('apple', ''), alg=ns.REAL)
['2.3apple', 'apple2.50']
sort
と同じ様にkey
を指定してあげれば良さそう。投げるのはソート対象のファイル名。こっちはpathlib
のリファレンスにしっかり書かれてて、
pathlibのリファレンスより抜粋.py
>>> PurePosixPath('my/library/setup.py').name
'setup.py'
つまり.name
でpathの末尾を取れる。こいつらを組み合わせて使えばソートできそう。
式は冒頭にあるので省略。使ってみるとこんな感じになった。
PosixPath('/Users/usrname/images/1.jpg'),
PosixPath('/Users/usrname/images/2.jpg'),
PosixPath('/Users/usrname/images/3.jpg'),
...
しっかりソートされました。めでたしめでたし