Каталог списка Python только для каталогов списка

#python #flask #jinja2

#python #flask #jinja2

Вопрос:

Мне нужно перечислить каталог и обнаружить папки и файлы внутри,

Для этого я хотел создать 2 vars, один content_folders из которых будет возвращать папку, а другой — для файлов, но у меня возникла проблема content_folders .

 def folder_check(root_path):
     for item in root_path:
          if os.path.isdir(item):
               return item
  

вот как я пытаюсь составить список content_folders , а затем использовать его :

 elif content == "brandings":
    title="Brandings"
    root_path = os.listdir(os.path.join(
                                    app.static_folder,
                                    f'content/{content}/'))
    content_folders = folder_check(root_path)
    return render_template('base.html', 
                                    content=content, 
                                    title=title, 
                                    content_folders=content_folders
                                    )
  

и он возвращает none в моем шаблоне jinja, поэтому я не могу создать цикл for.

Комментарии:

1. вы предполагаете, что вы выполнили свое if условие в первом фрагменте, которым вы поделились. если нет, вы вернете none . ваш код, похоже, не предвидит этот случай.

2. да, он возвращает none, и я действительно не знаю, как я могу заставить его работать

3. os.listdir возвращает только имена, но вам нужен полный путь в условии. Даже тогда folder_check будет возвращена только первая найденная папка, а не все папки.

4. Я думаю, что я просто буду использовать 2 папки для разделения изображений и папок, это будет намного проще.

Ответ №1:

ос.прогулка, вероятно, то, что вы хотите.

Сгенерируйте имена файлов в дереве каталогов, пройдя по дереву сверху вниз или снизу вверх. Для каждого каталога в дереве, имеющего корни в верхней части каталога (включая саму вершину), он выдает 3-кортеж (dirpath, dirnames, filenames).

Пример:

 import os
from os.path import join, getsize
for root, dirs, files in os.walk('python/Lib/email'):
    print(root, "consumes", end=" ")
    print(sum(getsize(join(root, name)) for name in files), end=" ")
    print("bytes in", len(files), "non-directory files")
    if 'CVS' in dirs:
        dirs.remove('CVS')  # don't visit CVS directories
  

Комментарии:

1. Нет, они не пытаются выполнить рекурсивный обход. (Я полагаю, что вы могли бы поставить безусловное break условие, чтобы оно завершалось после первой итерации, которая затем должна просто выводить содержимое каталога верхнего уровня, но я думаю, что код все равно будет потенциально запутанным. По крайней мере, в коде потребуется какой-то уточняющий комментарий, чтобы помочь читателю.)