Подсчитать количество файлов с определенным расширением в Python - PullRequest
30 голосов
/ 24 августа 2009

Я довольно плохо знаком с 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

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

Спасибо.

Ответы [ 5 ]

42 голосов
/ 24 августа 2009

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

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

tifCounter = len(glob.glob1(myPath,"*.tif"))
6 голосов
/ 24 августа 2009

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

len([f for f in os.listdir(myPath) 
     if f.endswith('.tif') and os.path.isfile(os.path.join(myPath, f))])
5 голосов
/ 24 августа 2009

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

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

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

3 голосов
/ 24 августа 2009

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

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

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

2 голосов
/ 24 апреля 2018

попробуйте использовать fnmatch https://docs.python.org/2/library/fnmatch.html

import fnmatch,os
num_files = len(fnmatch.filter(os.listdir(your_dir),'*.tif'))
print(num_files)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...