Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

Вывод файлов с определённым расширением

#python


У меня есть функция, которая выводит двумерный список файлов с определённым расширением:

 def selectfiles(self, dirs):

       return [filter(lambda i: '.hdf' in i  in i , os.listdir(dirs[x])) for x in
                                                                  range(len(dirs))]  


Подскажите, пожалуйста, как её лучше модифицировать, чтобы она выводила не только
названия файлов, но и пути к ним?

Т.е. сейчас:

 [[tem1.txt, tem2.txt, tem3.txt],[tem10.txt, tem11.txt]]


А нужно:

 [[home/test/tem1.txt, home/test/tem2.txt, home/test/tem3.txt],[home/test10/tem10.txt,
home/test10/tem11.txt]]

    


Ответы

Ответ 1



Итого, функция из комментария: @staticmethod def selectfiles(dirs): return [map(lambda i: dirs[x] + '/' + i, filter(lambda i: '.hdf' in i, os.listdir(dirs[x]))) for x in range(len(dirs))] Этот же алгоритм, но pythonic way: @staticmethod def select_files2(dirs): files = set() for dir in dirs: for file in os.listdir(dir): if file.endswith('.hdf'): files.add(os.path.join(dir, file)) return [files]

Ответ 2



Вместо selectfiles(dirs) функции, которая принимает список директорий, лучше создать функцию getfiles(dirname), которая принимает одну директорию и использовать map(), чтобы применить её к списку dirs всех директорий: list2D = map(getfiles, dirs). Чтобы получить из директории все файлы с заданным расширением: import os from glob import glob def getfiles(dirname): return glob(os.path.join(dirname, '*.hdf')) Если dirname не содержит файловых шаблонов, то это равнозначно: def getfiles(dirname): return [os.path.join(dirname, filename) for filename in os.listdir(dirname) if filename.endswith('.hdf')] В более общем случае (когда задан произвольный шаблон для имени файла), можно использовать glob.glob1(), fnmatch.filter() функции. Или с помощью pathlib модуля: from pathlib import Path list2D = [list(Path(dirname).glob('*.hdf')) for dirname in dirs]

Комментариев нет:

Отправить комментарий