Получить определенный слой имени подпапки в Python

Для папки с именем test со структурой подкаталогов в среде Windows:

├─a
│  ├─a1
│  ├─a2
│  └─a3
│      ├─a3_1
│      ├─a3_2
│      └─a3_3
├─b
│  ├─b1
│  ├─b2
│  ├─b3
│  └─b4
└─c
    ├─c1
    ├─c2
    └─c3

Я хочу получить название подпапок второго слоя и сохранить их в list:a1, a2, a3, b1, b2, b3, b4, c1, c2, c3...

base_dir = r"..\test"

for root, dirs, files in os.walk(base_dir):
    print(root)

Выход:

..\test
..\test\a
..\test\a\a1
..\test\a\a2
..\test\a\a3
..\test\a\a3\a3_1
..\test\a\a3\a3_2
..\test\a\a3\a3_3
..\test\b
..\test\b\b1
..\test\b\b2
..\test\b\b3
..\test\b\b4
..\test\c
..\test\c\c1
..\test\c\c2
..\test\c\c3

ОБНОВЛЕНИЕ: я пытаюсь использовать метод split с обратной косой чертой и сохранять в mylist:

base_dir = r"..\test"
mylist = []

**Method 1:**
for root, dirs, files in os.walk(base_dir):
    li = root.split('\\')
    #Only if the list has 3 elements of more, get the 3rd element
    if len(li) > 3:
        #print(li[3])
        mylist.append(li[3])
        #print(mylist)
mylist = list(set(mylist))
mylist.sort()
print(mylist)

**Method 2:**        
for root, dirs, files in os.walk(base_dir):
    try:
        li = root.split('\\')
        mylist.append(li[3])
    except IndexError:
        pass
mylist = list(set(mylist))
mylist.sort()
print(mylist)

Выход:

['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'b4', 'c1', 'c2', 'c3']

Сейчас все в порядке, спасибо.


person ah bon    schedule 06.05.2019    source источник
comment
Возможный дубликат Список всех подкаталогов на заданном уровне в Python   -  person Georgy    schedule 05.10.2019


Ответы (2)


Из вашего вывода ясно, что root.split('\\') не всегда содержит 3 элемента, поэтому print(root.split('\\')[2]) выбрасывает индекс за пределы диапазона, я бы предложил сначала проверить длину списка, а затем получить 3-й элемент

for root, dirs, files in os.walk(base_dir):
    li = root.split('\\')
    #Only if the list has 3 elements of more, get the 3rd element
    if len(li) > 2:
        print(li[2])

Результат будет

a
a
a
a
a
a
b
b
b
b
c
c
c

Затем, чтобы сделать свой mylist в соответствии с обновленным вопросом, вы можете сначала добавить все элементы в мой список, а затем использовать itertools.groupby для удаления последовательных дубликатов за один раз вместо создания списка из набора на каждом этапе

from itertools import groupby

mylist = []
for root, dirs, files in os.walk(base_dir):
    li = root.split('\\')
    #Only if the list has 3 elements of more, get the 3rd element
    if len(li) > 3:
        val = li[3].strip()
        #If element is non-empty append to list
        if val:
          mylist.append(val)

#Remove consecutive repeated elements by using groupby
result = [x[0] for x in groupby(mylist)]
print(result)

Результат будет

['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'b4', 'c1', 'c2', 'c3']
person Devesh Kumar Singh    schedule 06.05.2019

Вы получаете ошибку индекса, когда в [2] нет подкаталога (например, что-то вроде C:\\SomeEmptyFolder)

Это должно работать нормально

for root, dirs, files in os.walk(base_dir):
    try:
        print(root.split('\\')[2])
    except IndexError:
        pass
person Matt M    schedule 06.05.2019