はじめに
Windowsの話です。
tree
コマンドは、ディレクトリの構造を木構造形式で見ることができるアレです。
├─CrystalBeadsCurtain00002
│ │ crystal_bead_curtain_diffuse.tga
│ │ crystal_bead_curtain_transparency.png
│ │ DemoProducts_CrystalBeadsCurtain00002_0001.max
│ │ DemoProducts_CrystalBeadsCurtain00002_0001.rfa
│ │ FRONT_LOD0_DemoProducts_CrystalBeadsCurtain00002.dwg
│ │ PLAN_LOD0_DemoProducts_CrystalBeadsCurtain00002.dwg
│ │ SIDE_LOD0_DemoProducts_CrystalBeadsCurtain00002.dwg
│ │
│ └─SOURCE_DATA
├─ENA101Art00001
│ │ DemoProducts_ENA101Art00001_0001.max
│ │ DemoProducts_ENA101Art00001_0001.rfa
│ │ DemoProducts_ENA101Art00001_render.jpg
│ │ FRONT_LOD0_DemoProducts_ENA101Art00001.dwg
│ │ PLAN_LOD0_DemoProducts_ENA101Art00001.dwg
│ │ SIDE_LOD0_DemoProducts_ENA101Art00001.dwg
│ │
│ └─SOURCE_DATA
│ EN_A_101_A_103_A104_190603.fbx
│
一覧性がいいので、必要なファイルが揃っているかなどを確認したいときに便利です。
自分は割とよく使います。
ただ、ちょっとだけ改善出来たらいいなと思うところがあります。
それが 並び順 についてです。
Windowsのtreeコマンド
Windowsのtree
コマンドは、Linuxのtree
コマンドと違って、オプションが2つしかありません。
このオプションにソート(並び換え)に関するものはありません。
常に単純な名前順になってしまいます。
もっと見やすく並べられたらなぁというのが希望です。
出来ることなら、重要なファイルから順に並んでくれたらなおいいと思います。
これをPythonでなんとかします。
ディレクトリの一覧を取得する
まずはディレクトリの一覧を作ります。
こちらの方のブログ記事を参考にしました。
Powershellでディレクトリの一覧
当初、Powershellでそういうことが出来ないかとトライしてみました。
Windows10ではPowershellのウィンドウをとても簡単に "その場所" で開くことが出来ます。
そうするとパスの指定が不要になり、コマンドの実行が非常に簡単だからです。1
ただ、自分がPowershellに慣れてなくて、結局諦めました...。
テストコード
そもそも、並び替えをどしたらよいのかわかりません。
リストを順番に見ていってスワップするような関数を書くとか?でしょうか。
なんか面倒くさそうな...。
でもPythonならもっと簡単に書けるはず!
Pythonでディレクトリの一覧
Python3で書きました。
pathlibを使用します。
from pathlib import Path
def tree(path=None, level=0):
p = Path(path)
if p.exists():
ff = list(p.glob('*'))
for f in ff:
print( '{0}{1}{2}'.format('\n' if level == 0 else '' , '\t' * level, f.name.split('\\').pop() ) )
if f.is_dir():
tree(f, level + 1)
path = r'Z:\PROJECTS\MODELS'
tree(path, 0)
結果 ↓
DFC8638BAA
control.jpg <--- テクスチャ画像は一番後ろへまとめて並べたい
DEMO_DFC8638BAA_0001.max
DEMO_DFC8638BAA_0001.rfa
DEMO_DFC8638BAA_render.jpg
DEMO_logo.tga <--- テクスチャ画像は一番後ろへまとめて並べたい
DR03-109-01-DFC79.jpg <--- テクスチャ画像は一番後ろへまとめて並べたい
FRONT_LOD0_DEMO_DFC8638BAA.dwg
FRONT_LOD1_DEMO_DFC8638BAA.dwg
lonseal_lonrium_5116.png <--- テクスチャ画像は一番後ろへまとめて並べたい dwgの間に入るなんてもってのほか!
PLAN_LOD0_DEMO_DFC8638BAA.dwg
PLAN_LOD1_DEMO_DFC8638BAA.dwg
SIDE_LOD0_DEMO_DFC8638BAA.dwg
SIDE_LOD1_DEMO_DFC8638BAA.dwg
SOURCE_DATA
DFC86-AA15-AA10_rev1.dwg
SUS_diffuse.png
SUS_glossiness.png
SUS_normal.png
top.jpg <--- できれば拡張子ごとにきれいに並んでほしい
fan_alpha.png
fan_diffuse.png
DFD41AH18AA
DEMO_DFD41AH18AA_0001.max
DEMO_DFD41AH18AA_0001.rfa
DEMO_DFD41AH18AA_render.jpg
DEMO_logo.tga <--- テクスチャ画像は一番後ろへまとめて並べたい
FRONT_LOD0_DEMO_DFD41AH18AA.dwg
FRONT_LOD1_DEMO_DFD41AH18AA.dwg
PLAN_LOD0_DEMO_DFD41AH18AA.dwg
PLAN_LOD1_DEMO_DFD41AH18AA.dwg
SIDE_LOD0_DEMO_DFD41AH18AA.dwg
SIDE_LOD1_DEMO_DFD41AH18AA.dwg
SOURCE_DATA
DFD41-AH18-AA00_rev2.dwg
カタログ_P121.pdf
top.jpg
普通にやると、やっぱり、"いい感じ" に並んでくれないです。 2
この並び順を直すには、glob
で集めたリストをソートしてやればいいわけです。
sortedのkeyに自作の関数を指定する
ソートにはsorted
を使います。そして key
パラメータに自作の関数を指定します。
無名関数を当てているのをよく見ると思いますが、key
に関数を指定すると並び順を設定できます。
今回は、自分の意図した通りに並んでほしいので、自分ルールを定義します。
自分ルール用の関数の意図としては、"ファイルの種類ごとに並んでほしいんだけど、重要なファイルを先頭に持ってきて!" です。
def sort_by_suffix(f):
keys = [ 'max', 'rfa', 'dwg', 'dxf', 'jpg', 'jpeg', 'png', 'tga', 'psd', 'mb', 'ma', 'fbx', 'obj', 'fmz', 'fzb', 'bak', 'pdf', 'ms', 'txt', 'bat', 'vbs', 'log', 'zip', 'rar', 'xlsx', 'xls', '.swatches']
values = list(range(0,len(keys)))
d = dict(zip(keys, values))
ext = Path(f).suffix[1:]
if ext in keys:
return d[ext]*10
else:
return 1000
拡張子の辞書を作って、インデックスを返すようにしました。3
比較できるものを返す関数を定義する
正直なところ、はじめ、どんな関数を作ればいいのかよくわからなかったのですが、
要は数字か文字みたいな比較できるものを返せばいいみたいです。
ff = sorted( list(p.glob('*')) , key=sort_by_suffix )
このようにして出力すると
DFC8638BAA
DEMO_DFC8638BAA_0001.max
DEMO_DFC8638BAA_0001.rfa
FRONT_LOD0_DEMO_DFC8638BAA.dwg
FRONT_LOD1_DEMO_DFC8638BAA.dwg
PLAN_LOD0_DEMO_DFC8638BAA.dwg
PLAN_LOD1_DEMO_DFC8638BAA.dwg
SIDE_LOD0_DEMO_DFC8638BAA.dwg
SIDE_LOD1_DEMO_DFC8638BAA.dwg
DEMO_DFC8638BAA_render.jpg
control.jpg
DR03-109-01-DFC79.jpg
top.jpg
lonseal_lonrium_5116.png
SUS_diffuse.png
SUS_glossiness.png
SUS_normal.png
fan_alpha.png
fan_diffuse.png
DEMO_logo.tga
SOURCE_DATA
DFC86-AA15-AA10_rev1.dwg
整理されて見やすくなりました。
より使いやすくするには、もうひと工夫必要ですが、とりあえず目的は達成しました。