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 件のコメント:
コメントを投稿