#python #function #recursion #directory #subdirectory
Вопрос:
Мне нужно вызвать функцию «handledisclaimer()» для каждого файла .py, который не пуст в каждой папке и подпапке. Иногда есть только одна подпапка, иногда их две или три, например.
Projects
->jenkins
.jenkinsfile
->tests
->A
->A.a
init.py
test.py
->A.aa
init.py
Results.tar
test.py
->B
->B.b
->B.b.1
init.py
test.py
->B.b.2
init.py
test.py
init.py
conftest.py
init.py
helpers.py
Папок гораздо больше, но, конечно, я не перечисляю всех.
Я пробовал среди вещей что-то подобное.
def navigate_through_directory():
for dirpath, dirs, files in os.walk("C:/Users/MuellerM/PycharmProjects/Projects"):
for subdirectory in dirs:
for filename in dirs:
fname = os.path.join(dirpath, filename)
if fname.endswith(".py") and os.stat(fname).st_size >0:
handle_disclaimer()
continue
else:
continue
Однако в подкаталоге в dirs просто указан один подкаталог.
Я нашел много предложений по stackoverflow, как это можно сделать, но, похоже, для меня ничего не работает. Корневой каталог находится «C:/Users/MuellerM/PycharmProjects/Projects».
Комментарии:
1. Я не понимаю, в чем ваша проблема. Если вы хотите запускать
handledisclaimer
каждый файл, то, возможно, вам следует отправить его в качестве аргументаhandledisclaimer(fname)
2. у вас неправильные
for
петли. Вы должны отдельно бежатьfor subdirectory in dirs: ...
и отдельноfor filename in files: ...
, а неin dirs
3. возможно, сначала используйте
print()
, чтобы увидеть, какая часть кода выполняется и что у вас есть в переменных. Это называется"print debuging"
. В данный момент вы используете неправильные переменные вfor
циклах. Это должно быть... in file
вместо...in dirs
Ответ №1:
Я не могу проверить это в вашем файле, но вы неправильно используете for
-loop и используете неправильную ОС импорта переменных
def navigate_through_directory(directory):
for root, dirs, files in os.walk(directory):
print('[DEBUG] root:', root)
# - work with dirnames -
for dirname in dirs:
fullpath = os.path.join(root, dirname)
print('[DEBUG] dir:', fullpath)
# - work with filenames -
for filename in files: # <-- files, not dirs
fullpath = os.path.join(root, filename)
print('[DEBUG] file:', fullpath)
if fullpath.endswith(".py") and os.stat(fullpath).st_size > 0:
handle_disclaimer(fullpath)
#navigate_through_directory("C:/Users/MuellerM/PycharmProjects/Projects")
navigate_through_directory("/home/furas/test")
Комментарии:
1. большое вам спасибо, что решили мою проблему 🙂