Каталог рекурсии идет только на один каталог - PullRequest
2 голосов
/ 26 февраля 2020

Я делаю скрипт в Python, чтобы удалить все оставшиеся файлы .exe из компиляции:

import os

main_dir = '../RemoveExes'


def remove_all_in_dir(path):
    print(f'Currently in {path}. Listdir:', os.listdir(path))
    for current_name in os.listdir(path):
        if os.path.isdir(current_name):
            print(f'{path}/{current_name} is a directory. Entering')
            remove_all_in_dir(f'{path}/{current_name}')
        elif current_name.endswith('.exe'):
            print(f'Would remove: {current_name}')
        else:
            print(f'{current_name} is not an .exe or a directory. Omitting.')


remove_all_in_dir(main_dir)

.. / RemoveExes - это каталог со следующей структурой:

? RemoveExes
 ├ ? bar
 │  ├ ? subdir
 │  │  ├ bulb.exe
 │  │  └ some_text.txt
 │  ├ doc.docs
 │  └ een.jpg
 ├ ? foo
 │  ├ exe.exe
 │  └ txt.txt
 ├ cleanup.py
 ├ prog.exe
 ├ script.py
 └ text.txt

Программа успешно «удаляет» exe.exe (глубиной 1 каталог) и prog.exe (глубиной 0 каталогов), но не затрагивает bulb.exe (глубиной 2 директории). Это для ограничения рекурсии в Python, или я делаю что-то не так?

1 Ответ

2 голосов
/ 26 февраля 2020

os.listdir возвращает список только имен файлов, без имен каталогов, поэтому вы должны объединить имена каталогов с именами файлов, чтобы сформировать вместо них полные пути:

def remove_all_in_dir(path):
    print(f'Currently in {path}. Listdir:', os.listdir(path))
    for current_name in os.listdir(path):
        full_path = os.path.join(path, current_name)
        if os.path.isdir(full_path):
            print(f'{full_path} is a directory. Entering')
            remove_all_in_dir(f'{full_path}')
        elif current_name.endswith('.exe'):
            print(f'Would remove: {full_path}')
        else:
            print(f'{full_path} is not an .exe or a directory. Omitting.')
...