まず os.walk()
を使用することにより、指定したフォルダ内にあるフォルダ名を走査し、フォルダ名をPATH付きで得るにことが出来ます。
この時に、os.path.relpath()
を使用することで、指定フォルダからの相対PATHに変換することがです。
Python
1import os
2
3startpath = r'C:\Users\name\Desktop\test'
4
5folder_list = []
6for root, dirs, files in os.walk(startpath):
7 # startpath からの相対パスに変換
8 rel_path = os.path.relpath(root, startpath)
9 # 子のフォルダリストが空だったらリストに追加 (この仕様でよいの??)
10 if not dirs:
11 folder_list.append(path2list(rel_path))
12
13print(folder_list)
14# => ['dir1/doc1', 'dir1/doc2', 'dir1/doc3', 'dir2/doc4', 'dir2/doc5', 'dir2/doc6', 'dir3/doc7', 'dir3/doc8', 'dir3/doc9']
これでほぼ目的は達せられていると思いますが、表示などに自由度を持たせたいときなどはos.path.split()
を再帰的に使用して上記の相対PATHをリスト形式に分割することができます。
Python
1import os
2
3def path2list(path):
4 folders = []
5 while True:
6 path, folder = os.path.split(path)
7 if folder:
8 folders.append(folder)
9 else:
10 if path:
11 folders.append(path)
12 break
13 return folders[::-1]
14
15
16lst = path2list('dir1/dir2/dir3')
17print(lst)
18# => ['dir1', 'dir2', 'dir3']
これら2つを組み合わせると
Python
1import os
2
3def path2list(path):
4 folders = []
5 while True:
6 path, folder = os.path.split(path)
7 if folder:
8 folders.append(folder)
9 else:
10 if path:
11 folders.append(path)
12 break
13 return folders[::-1]
14
15
16startpath = r'C:\Users\name\Desktop\test'
17
18folder_list = []
19for root, dirs, files in os.walk(startpath):
20 # startpath からの相対パスに変換
21 rel_path = os.path.relpath(root, startpath)
22 # 子ディレクトリを持っていなかったらリストに追加
23 if not dirs:
24 folder_list.append(path2list(rel_path))
25
26print(folder_list)
27# => [['dir1', 'doc1'], ['dir1', 'doc2'], ['dir1', 'doc3'], ['dir2', 'doc4'], ['dir2', 'doc5'], ['dir2', 'doc6'], ['dir3', 'doc7'], ['dir3', 'doc8'], ['dir3', 'doc9']]
となりますので、あとは適当に表示を行ってください。
Python
1for f in folder_list:
2 print(' -> '.join(f))
3# => dir1 -> doc1
4 dir1 -> doc2
5 dir1 -> doc3
6 dir2 -> doc4
7 dir2 -> doc5
8 dir2 -> doc6
9 dir3 -> doc7
10 dir3 -> doc8
11 dir3 -> doc9
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/25 11:50