matches.extend([fn for fn if not filename in ignore_files])
Должен сделать трюк для простых имен файлов, для игнорирования шаблонов что-то вроде:
def reject(filename, filter):
""" Takes a filename and a filter to reject files that match."""
if len(filter)==0:
return False
else:
return fnmatch.fnmach(filename, filter[0]) or reject(filename, filter[1:])
matches.extend([os.path.join(root, fn) for fn in filenames if not reject(fn, ignore_files)])
Вышеупомянутое будет при создании списка из имен файлов в os.walk проверке, что ни одна из фильтры обеспечивают совпадение - фильтры проверяются до тех пор, пока не останется ни одного, либо найдено первое совпадение, поэтому оно должно быть довольно быстрым.
Вы также можете попробовать что-то вроде:
filenames = set(filenames) # convert to a set
for filter in ignore_files:
filenames = filenames - set(fnmatch.filter(filenames, filter)) # remove the matches
matches.extend([os.path.join(root, fn) for fn in filenames]) # Add to matches