Python 2.7.5 Win/Mac.Как оптимизировать поиск с помощью списка dir и path walk?
Я пытаюсь найти лучший способ поиска файлов (более 10000) на нескольких хранилищах (около 128Tio). Эти файлы имеют определенные расширения, и я могу игнорировать некоторые папки.
Вот моя первая функция os.listdir
и рекурсии:
count = 0
def SearchFiles1(path):
global count
pathList = os.listdir(path)
for i in pathList:
subPath = path+os.path.sep+i
if os.path.isfile(subPath) == True :
fileName = os.path.basename(subPath)
extension = fileName[fileName.rfind("."):]
if ".ext1" in extension or ".ext2" in extension or ".ext3" in extension:
count += 1
#do stuff . . .
else :
if os.path.isdir(subPath) == True:
if not "UselessFolder1" in subPath and not "UselessFolder1" in subPath:
SearchFiles1(subPath)
Это работает, но я думаю, что это могло бы быть лучше (быстрее и собственно) или я не прав?
Так что я попытался os.path.walk
:
def SearchFiles2(path):
count = 0
for dirpath, subdirs, files in os.walk(path):
for i in dirpath:
if not "UselessFolder1" in i and not "UselessFolder1" in i:
for y in files:
fileName = os.path.basename(y)
extension = fileName[fileName.rfind("."):]
if ".ext2" in extension or ".ext2" in extension or ".ext3" in extension:
count += 1
# do stuff . . .
return count
"счетчик" не так и способ медленнее. И я думаю, что я действительно не понимаю, как работает path.walk
.
Мой вопрос: что я могу сделать для оптимизации этого исследования?
Благодаря вашему примеру я улучшил первое решение (os.path.splitext и сравните строку с кортежем содержимого). Это немного быстрее, и мы можем легко добавить дополнительные правила (файл ext/ignore subdir). – Syrius
Для второго решения мне не удалось заставить его работать. Сначала я предполагаю, что это «бесполезные_диры» в строке 7, но я получил ошибку: «ValueError: list.remove (x): x not in list». Я добавил «имя печати» и увидел, что он пытается удалить бесполезные_dirs [x] из поддиректоров, даже если он не существует. – Syrius
@Syrius Мой плохой ... Я использовал 'и', когда я должен был использовать '&'. – tdelaney