Подтвердить что ты не робот

Количество файлов с определенным расширением в Python

Я новичок в Python, и я пытаюсь выяснить наиболее эффективный способ подсчета количества .TIF файлов в определенном подкаталоге.

Выполняя некоторые поиски, я нашел один пример (я не тестировал), который утверждал, что подсчитывает все файлы в каталоге:

file_count = sum((len(f) for _, _, f in os.walk(myPath)))

Это хорошо, но мне нужно только считать файлы TIF. Мой каталог будет содержать другие типы файлов, но я хочу только подсчитать TIF.

В настоящее время я использую следующий код:

tifCounter = 0
for root, dirs, files in os.walk(myPath):
    for file in files:    
        if file.endswith('.tif'):
            tifCounter += 1

Он отлично работает, но цикл для меня кажется чрезмерным/дорогим. Любой способ сделать это более эффективно?

Спасибо.

4b9b3361

Ответ 1

Что-то должно пройтись по всем файлам в каталоге и посмотреть каждое имя файла - будь то ваш код или библиотечная подпрограмма. Поэтому независимо от того, какое конкретное решение они имеют, они будут иметь примерно одинаковую стоимость.

Если вы думаете, что это слишком много кода, и если вам на самом деле не нужно рекурсивно искать в подкаталогах, вы можете использовать модуль glob:

import glob
tifCounter = len(glob.glob1(myPath,"*.tif"))

Ответ 2

В этом конкретном случае использования, если вы не хотите рекурсивно искать в подкаталоге, вы можете использовать os.listdir:

len([f for f in os.listdir(myPath) 
     if f.endswith('.tif') and os.path.isfile(os.path.join(myPath, f))])

Ответ 3

Ваш код в порядке.

Да, вам нужно будет перебрать эти файлы, чтобы отфильтровать файлы .tif, но цикл по небольшому массиву в памяти пренебрежимо мал по сравнению с работой сканирования каталога файлов, чтобы найти эти файлы в первое место, которое вам все равно нужно делать.

Я бы не стал беспокоиться об оптимизации этого кода.

Ответ 4

Если вам нужно искать рекурсивно или по какой-либо другой причине не хотите использовать модуль glob, вы можете использовать

file_count = sum(len(f for f in fs if f.lower().endswith('.tif')) for _, _, fs in os.walk(myPath))

Это "Pythonic" способ адаптировать пример, который вы нашли для своих целей. Но это не будет значительно быстрее или эффективнее, чем цикл, который вы использовали; это просто очень компактный синтаксис для более или менее того же самого.