Path.glob()でExplorer風にソートしてみる。

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

コメントを投稿

Vimの補完プラグインをインストール。その4

Vimの補完プラグインをインストール。その3 で、 ddc-tabnine が使えそうです、などと書いたのですが、早速やってみました。 まず、tabnineのバイナリを用意しないといけません。がどうにもTabNineのサイトがわかりにくいので、 tabnine-nvim にあるダ...