Возвращает количество папок в каталоге и подкаталоге

#python #python-3.x

#python #python-3.x

Вопрос:

У меня есть каталог, аналогичный приведенному ниже примеру, который содержит следующие папки:

 C:UsersxxDesktopNew folderNew folderNew folderQGIS
C:UsersxxDesktopNew folderNew folderNew folder (2)1- QGIS
C:UsersxxDesktopNew folderNew folderNew folder (4)1.0 QGIS
C:UsersxxDesktopNew folderNew folderQGIS
  

Я хочу узнать, сколько папок с их именами заканчивается в QGIS и их пути.

Мой текущий скрипт находится ниже. Он успешно выдает мне путь ко всем папкам, имя которых заканчивается в QGIS, но скрипт учитывает только папки с именем «QGIS» и не учитывает «1.0 QGIS» или «1- QGIS». Чего мне не хватает?

 import os

rootfolder = r'C:UsersxxDesktopNew folder'

isfile = os.path.isfile
join = os.path.join

i=0

with open("folderpath.txt", 'w') as f:

    for root, dirs, files in os.walk(rootfolder, topdown=False):
        i = dirs.count('*QGIS')
        for name in dirs:
            if name.endswith("QGIS"):
                f.write(os.path.join(root, name) 'n')

    f.write(str((sum(dirs.count('QGIS') for _, dirs, _ in os.walk(rootfolder)))))
  

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

1. вы проверили, что это 1.0 QGIS находится в dirs ?

2. Вы не можете использовать подстановочные знаки во входных данных для count такого рода. Просто поместите i = 1 то, что вы делаете f.write во внутреннем цикле, и удалите оператор other i = ... .

3. вы проверили, что endswith («QGIS») работает с 1.0 QGIS и 1-QGIS? Может быть, вы могли бы попробовать вместо этого использовать регулярное выражение?

4. @deadshot urd 1.0 QGIS находится в dirs.

5. @BrunoSE да, endswith(QGIS») работает. Я успешно получаю весь их путь, за исключением общего количества папок. Я получаю только количество имен папок, заканчивающихся только в QGIS.

Ответ №1:

list.count Метод не поддерживает никакой концепции подстановочного знака — он просто ищет, сколько элементов равно значению, заданному в качестве аргумента. Итак, ваша строка

         i = dirs.count('*QGIS')
  

ищет каталоги, которые называются буквально *QGIS , а не каталоги, которые заканчиваются на QGIS .

Исправить это должно быть легко, потому что код уже успешно распечатывает правильные пути; он просто неправильно их подсчитывает. Итак, все, что вам нужно сделать, это удалить приведенное выше утверждение и вместо этого просто добавить 1 в том месте, где вы печатаете каждый путь, который уже подчиняется правильному if условию внутри цикла над именами каталогов.

     for root, dirs, files in os.walk(rootfolder, topdown=False):
        for name in dirs:
            if name.endswith("QGIS"):
                f.write(os.path.join(root, name) 'n')
                i  = 1
  

Вы уже правильно инициализируете i=0 перед началом цикла.

В конце просто сделайте:

 print(i)
  

и избавьтесь от этого выражения, включающего sum , где вы проходите по всем каталогам во второй раз.

Ответ №2:

 import os

print( len( list( filter(None, map(lambda x: x[0] if x[0].endswith('QGIS') else None,os.walk('.'))))))
  

Более короткая форма, но не слишком читаемая 😉
«Карта» просматривает результаты ОС.walk, возвращает имя папки, если оно заканчивается на ‘QGIS’, и None, если нет.
«Фильтр» возвращает каждое значение из результатов map, которые отличаются от значения None.
«Список» необходим, потому что и карта, и фильтр возвращают объект итератора, который не имеет длины, но у «списка» есть.

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

1. Хитрость, которую вы можете использовать вместо len(list(...)) , заключается в том, чтобы написать выражение генератора, которое выдает 1 для каждого файла, и использовать его в качестве аргумента для sum .