python 3.8 で find して、ディレクトリに os.sep を付けたい。

概要

  • find {$target_dir} したい。
  • find {$target_dir} ではついてないけどディレクトリにはtrailing slashがついていて欲しい。
    • ついでにいうと先頭の {$target_dir} 部分は要らない
  • 補足: python 3.8

ないの?

  • 分からない。ちょっと見当たらなかった。なのでチラ裏へのメモがてら。
    • find の方も実はtrailing slashをつけるのはoptionではなくてちょっとしたワンライナーが必要っぽいしエンジニア一般としては嬉しくない機能なのだろうか。
  • もし、あるよ!これだよ!ってのがあったら教えて欲しい。みんな欲しくないものなのかな。

実装

from pathlib import Path
target_dir  = Path(your, target, dir) # like (target_dir = Path('.','target_dir'))
def rel_trail(descendant_path):
    rel_path = descendant_path.relative_to(target_dir)
    # 先頭の {$target_dir} 部分は要らないので相対パスに
    if descendant_path.is_dir():
        trail = os.sep
    else:
        trail = ''
    return f"{rel_path}{trail}"
    # 今回やりたかったこと。上4行で末尾の文字を決定している
descendant_list = sorted(map(rel_trail, target_dir.rglob('*')))
# globした各要素に上の関数 rel_trail を作用させる
from pprint import pprint
pprint(descendant_list)
# 表示してみる

解説

  • descendant は子孫の意味です。
  • map によって返される map objectlist にしなくても sorted でソートして出すことができます。

歓迎するもの

  • 上記の機能が標準に存在しているならその機能についてのリファレンスを
  • 上記実装に関しての改善案。(些末な事ではなく設計全体に関してだと尚うれしい)
  • ないことを不思議に思う点での共感