У меня есть небольшой бит кода для отображения имен файлов, соответствующих строке фильтра. Я пытаюсь расширить это, чтобы соответствовать нескольким фильтрам. У меня есть какой-то рабочий код, который использует очень прямой подход в прямом цикле, но это sloooooooow .... в основном работает os.walk
для каждого фильтра.Python - эффективный способ поиска имен файлов на основе нескольких фильтров
Учитывая, что функция (показана ниже) позволяет протестировать несколько фильтров одновременно, а не по одному за раз? т. е. можно ли передать список строк фильтра в find_files
?
import os
import fnmatch
# stolen from http://stackoverflow.com/questions/8625991/use-python-os-walk-to-identify-a-list-of-files
def find_files(dir_look, filt):
matches = []
for root, dirnames, filenames in os.walk(dir_look):
for filename in fnmatch.filter(filenames, filt):
matches.append(os.path.join(root, filename))
return matches
#create empty list to store results
filelist=[]
#some example filters, my real data has about 5000 filters
filts = [r'*60830007*',r'*60910259*',r'*60910299*']
#find files for each filter entry
for filter in filts:
filelist.append(find_files(r'C:\some directory', filter))
EDIT:
я нашел довольно очевидный способ ускорить вещи, передавая список фильтров к функции, то тестирование каждого внутри os.walk
def find_files(dir_look, filters):
matches = []
for root, dirnames, filenames in os.walk(dir_look):
for filt in filters:
for filename in fnmatch.filter(filenames, filt):
matches.append(os.path.join(root, filename))
return matches
Теперь для каждого фильтра выполняется os.walk. это медленно. Может быть, лучше прочитать его один раз, а не просто запустить на нем фильтры? – Marcin