#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]
Комментариев нет:
Отправить комментарий