m.r.m.40 Ответов: 3

Рекурсивная функция Python для перечисления всех файлов системы


Привет,
Я пишу программу с использованием python на ubuntu 18.04.
Цель этой программы - перечислить все файлы на компьютере в каждом каталоге.
Для достижения этой цели я использую цикл for и рекурсивное программирование.
Я пишу код ниже:
def listDirectory(RootPath):
    os.chdir(RootPath)

    print(
        '\n\033[31mCurrently at \033[37m'+
        os.getcwd())

    currentpaths = os.listdir()

    pathList = [RootPath,currentpaths]        
    print('\n\033[32m pathList: \033[37m')
    print(pathList)
    AllPaths.append(pathList)
    
    for path in currentpaths:
        # if the path is a directory crawl it
        # if the path is not a directory go for the next item
        try:
            listDirectory(path)
        except:
            pass


проблема вот в чем...

Он становится истинным в первом же каталоге, который он видит.
Но он не возвращается к следующему каталогу.
Это не повторяется, как я ожидаю.
Поэтому он дает мне только три списка путей, которые являются первыми возможными маршрутами, которые он находит.

учитывая корневую тропу
/

он просто идет по этим каталогам
/

/lib

/lib/hdparm


Он не возвращает другие адреса, и заканчивается очень быстро.


Заранее благодарю вас за потраченное время.

Что я уже пробовал:

Я ищу проблему в своем рекурсивном алгоритме.

3 Ответов

Рейтинг:
23

Luc Pattyn

Рекурсивная функция не должна возвращаться с вашей системой в другом состоянии, все должно быть так, как было раньше. Где ты расстегиваешься chdir?


Richard MacCutchan

Хорошо подмечено.

m.r.m.40

Да. Вот и ответ.
Спасибо.

Рейтинг:
1

Patrice T

Цитата:
Я ищу проблему в своем рекурсивном алгоритме.

Наблюдение за выполнением кода-это невероятный способ узнать, как он работает или нет. Инструменты выбора - это отладчик.
-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

27.3. ПДБ — отладчика Python — питон 3.6.1 документации[^]
Отладка в Python | Python покоряет Вселенную[^]
pdb – интерактивный отладчик - Python модуль недели[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


m.r.m.40

:D :D
Хорошо! Я понял.

Рейтинг:
0

OriginalGriff

Если ваш код не работает - а это случается часто, даже когда у вас есть опыт, - вам нужно научиться самостоятельно выяснять, почему это происходит, чтобы вы могли это исправить. Рассказывая вам, что это неправильно, вы ничего не узнаете о том, как избежать ошибок в будущем.

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.
Научитесь пользоваться им - это самый мощный инструмент в вашей коробке, и вы, вероятно, потратите на него больше времени, чем на Редактор - мы все это делаем!

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


m.r.m.40

- Да, ты прав. Спасибо. :)
Нужна ли была последняя строчка? :Д