Создание папок внутри подпапок

Я новичок в python и ищу способ создавать подпапки внутри подпапок. Мое файловое дерево выглядит так:

>> Main Folder
   >> Folder a
      >> Folder 1
      >> Folder 2
   >> Folder b
      >> Folder 1
      >> Folder 2

Я ищу способ создать новую папку на самом нижнем уровне (папка 1 и папка 2).

Я пробовал использовать os.walk и os.path, вот так

for dirpath, subdirs, files in os.walk(current_path):
    for subdir in subdirs:
        filePath = os.path.abspath(subdir)
        newFolder = (filePath + "/new")
        if not os.path.exists(newFolder):
            os.mkdir(newFolder)

Но это только создает новую папку на втором уровне (папка a и папка b), а затем дает мне ошибку:

FileNotFoundError: [Errno 2] Нет такого файла или каталога: '/Users/diunt-02/Desktop/Brown_Brothers/TEST/new/new'

Я думаю, что цикл создает новые папки, и os.walk не может найти к ним путь. Есть ли какие-либо предложения, чтобы заставить os.walk перейти на следующий уровень и создать там папку?


person katienypl5757    schedule 22.06.2018    source источник
comment
В какой строке возникает ошибка? Он дает номер строки?   -  person rickjerrity    schedule 23.06.2018
comment
кроме того, придерживайтесь os.path.join для нового пути   -  person Evgeny    schedule 23.06.2018
comment
Спасибо за помощь! Я получаю сообщение об ошибке в строке os.mkdir(newFolder).   -  person katienypl5757    schedule 25.06.2018


Ответы (3)


Если вы просто пытаетесь создать подкаталог в каждом дочернем каталоге корневого каталога, использование os.walk только сделает ситуацию еще более запутанной. Я объясню почему, но сначала объясню более простой способ.

Просто явно зациклите на два уровня вниз:

for child in os.scandir(current_path):
    if child.is_dir():
        for grandchild in os.scandir(child.path):
            newpath = os.path.join(grandchild.path, 'new')
            os.path.mkdir(newpath)

Теперь, почему ваш существующий код не работает?

walk обходит все дерево. Он посещает корень, и детей, и внуков, и правнуков, и даже новых внуков, которых вы создаете, пока находитесь в процессе ходьбы.

Например, попробуйте следующее:

for dirpath, _, _ in os.walk(current_path):
    print(dirpath)

Что вы получаете:

.
./Folder b
./Folder b/Folder 2
./Folder b/Folder 1
./Folder a
./Folder a/Folder 2
./Folder a/Folder 1

Это смешивание всех разных «уровней» вместе. Но вы не хотите делать то же самое на каждом уровне. Вы хотите создавать новые каталоги только во внуках, а не в детях, и не в правнуках, и особенно не в потомках, которых вы создаете по пути.

Конечно, вы можете попытаться отслеживать уровень, когда вы поднимаетесь и опускаетесь, или вы, вероятно, можете увидеть, как вы можете воссоздать его на лету из dirpath, но зачем? Если вы хотите сделать что-то ровно на 2 уровня ниже, не зацикливайтесь на всех уровнях, а затем проверяйте уровень 2, просто спуститесь на 2 уровня ниже.

person abarnert    schedule 22.06.2018
comment
Это очень полезно и хорошо объяснено! Я знал, что мне нужно спуститься на уровень ниже, но я просто мог понять, как это сделать. Вы очень хорошо объяснили! - person katienypl5757; 25.06.2018

Это код, который я получил, который работает очень хорошо! Спасибо @abarnert за прекрасное объяснение, почему os.walk бесполезен!

for child in os.scandir(current_path):
if child.is_dir():
    for grandchild in os.scandir(child.path):
        # newpath = os.path.join(grandchild.path, 'new')
        # os.mkdir(newpath)
        if grandchild.is_dir():
            newpath = os.path.join(grandchild.path, 'new')
            os.mkdir(newpath)
person katienypl5757    schedule 25.06.2018

Просто используйте os.makedirs. Он автоматически создает необходимые родительские папки.

path = 'Main Folder/Folder a/Folder 1'
if not (os.path.exists(path)):
    os.makedirs(path)

Вы можете использовать его рекурсивным способом для своей проблемы.

person Sadi Mohammad Siddiquee    schedule 14.01.2020