Вызов функции для каждого файла .py, который не пуст в каждой папке и подпапке в python

#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. большое вам спасибо, что решили мою проблему 🙂