2016-10-06 11 views
0

Учитывая суффикс и путь к каталогу, мне нужно извлечь полный путь к файлам в каталоге, который заканчивается данным суффиксом.Способы фильтрации файлов в каталоге и пути к каталогу соединений - Python

В настоящее время я делаю это так:

import os 
dir_path = '/path/to/dir' 
suffix = '.xyz' 
filenames = filter(lambda x: x.endswith(suffix), os.listdir(dir_path)) 
filenames = map(lambda x: os.path.join(dir_path, x), filenames) 

Я мог бы также сделать это с glob:

import glob 
dir_path = '/path/to/dir' 
suffix = '.xyz' 
glob.glob(dir_path+'*.'+suffix) 

Я понимаю, что есть также pathlib, что можно проверить суффиксов с помощью PurePath но Я не уверен, для чего это синтаксис.

Существуют ли другие способы получения одинакового отфильтрованного списка полных путей к файлам?

ответ

2

Вы можете использовать list comprehension построить результат на одном дыхании:

>>> [os.path.join(os.sep, x, dir_path) for x in os.listdir(dir_path) 
if x.endswith(suffix)] 
['/home/msvalkon/foo.txt', 
'/home/msvalkon/output.txt', 
'/home/msvalkon/remaining_warnings.txt', 
'/home/msvalkon/test.txt', 
'/home/msvalkon/hdr_chksum_failure.txt'] 

Если dir_path всегда абсолютный путь, вы можете использовать os.path.abspath(x) вместо os.path.join().

Для большого каталога может быть целесообразным использовать os.scandir, который возвращает итератор. Это будет быстрее.

>>> [entry.path for entry in os.scandir(dir_path) if entry.name.endswith(suffix)] 
['/home/msvalkon/foo.txt', 
    '/home/msvalkon/output.txt', 
    '/home/msvalkon/remaining_warnings.txt', 
    '/home/msvalkon/test.txt', 
    '/home/msvalkon/hdr_chksum_failure.txt'] 
+0

Короткий вопрос, учитывая, что 1 000 000 файлов в каталоге, будет 'filter' +' map' быть быстрее, чем понимание списка, или наоборот? Или они будут такими же? – alvas

+0

Учитывая, что 'filter()' создаст один список, а 'map()' another, я бы поставил, что понимание списка выполняется быстрее. Хотя, с такими цифрами, может быть разумнее выяснить способ использования генератора. – msvalkon

+0

На самом деле, они не будут создавать списки, как генераторы фильтра, так и карты. – alvas