Количество файлов с определенным расширением в 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
Он отлично работает, но цикл для меня кажется чрезмерным/дорогим. Любой способ сделать это более эффективно?
Спасибо.
Ответы
Ответ 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" способ адаптировать пример, который вы нашли для своих целей. Но это не будет значительно быстрее или эффективнее, чем цикл, который вы использовали; это просто очень компактный синтаксис для более или менее того же самого.
Ответ 5
попробуйте использовать 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)