2016-02-26 4 views
0

Учитывая список имен файлов, я хочу создать полный путь для этих файлов, если они существуют в данном каталоге или в его подкаталогах. Прямо сейчас я использую этот кодСамый быстрый способ поиска списка файлов в каталоге

def construct_path(file_list, directory): 
    file_path_list = [] 
    for name in file_list: 
     for dir, subdir, filenames in os.walk(directory): 
      if name in filenames: 
       file_path_list.append(os.path.join(dir, name)) 

    return file_path_list 

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

+0

Реверсивный порядок петель, вероятно, сделать это , И, возможно, удаление найденных имен из 'file_list' может помочь. Ранний выход, если вы найдете их всех тоже. – Blorgbeard

+0

Посмотрите на этот материал, он использует собственные вызовы https://docs.python.org/3/library/os.html#os.scandir – Andrey

ответ

2

Вы можете удалить петлю на file_list и удалить найденные файлы из этого списка, так что вы можете вернуть результаты, как только вы нашли все файлы:

def construct_path(file_list, directory): 
    file_path_list = [] 
    for dir, subdir, files in os.walk(directory): 
     for name in files: 
      if name in file_list: 
       file_path_list.append(os.path.join(dir, name)) 
       file_list.remove(name) 
      if (len(file_list)==0): return file_path_list 
    return file_path_list 
+0

Это все еще сканирует каталог для каждого файла – user3527975

+0

Да, но он делает это только один раз и вы должны иметь возможность вернуться раньше, если вы нашли все файлы перед обходом всех файлов. – Jaco

+1

Хотя это может показаться просто свопом двух циклов, 'os.walk' требует ввода/вывода диска, а' для имени в файлах 'встречается в памяти, что намного быстрее. Вот почему есть ускорение при выполнении 'os.walk' только один раз. –

Смежные вопросы