Path.globでファイル名に[]を含む場合のエスケープ。で、ワイルドカードに[]が入っていると動作がおかしくなるのでそれをエスケープするというのをやりましたが、同じく glob ネタ。
Explorerではひらがな・カタカナを区別せずにソートしているっぽいですが、Path.glob()とかバッチファイルだとワイルドカードが文字コード順にソートされるので、処理順序がExplorerでの表示順と異なります。ちょっと気持ち悪いので、それっぽくできないかと考えてみました。ちなみに、Explorerでの並び順と正確に同じかどうかは検証してません。それっぽければ問題ないので。
sortedglob.py
#!python3
# -*- coding: utf-8 -*-
# vim:fenc=utf-8 ff=unix ft=python ts=4 sw=4 sts=4 si et fdm fdl=99:
# vim:cinw=if,elif,else,for,while,try,except,finally,def,class:
"""
sortedglob.py:
与えられたパターンに一致するファイル名を取得して、
Explorer風のソートを行い、リストを返す
created : Jun 26, 2022
"""
from pathlib import Path
from jaconv import z2h, kata2hira
def sortedglob(pattern: str):
"""Explorer風にソートするglob.
patternで渡されたワイルドカードパターンを展開して、
Explorer風にソートした順番で返す。
Args:
pattern (str): globに渡すパターン
Yields:
Path: ソートされたPathオブジェクト
"""
dir = Path(pattern).absolute().parent
p = Path(pattern).name
pathlist = {}
for f in dir.glob(p):
key = kata2hira(z2h(str(f.absolute()), kana=False, ascii=True, digit=True))
pathlist[key] = f
result = sorted(pathlist.items(), key=lambda x: x[0])
for f in result:
yield f[1]
if __name__ == "__main__":
for s in sortedglob("M:/Files/Documents/*"):
print(s)
jaconvで全角英数を半角にして、カタカナは全部ひらがなに揃えて、それをキーにしてソートします。さらに漢数字対応とかしてもいいかも。
0 件のコメント:
コメントを投稿