#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
во внутреннем цикле, и удалите оператор otheri = ...
.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
.