LoginSignup
2
2

More than 3 years have passed since last update.

PythonでPathを自然ソートする

Posted at

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'),
...

しっかりソートされました。めでたしめでたし

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2