Найти - Пользователи
Полная версия: Функция поиска файлов по маске
Начало » Python для новичков » Функция поиска файлов по маске
1
grif_rift
Всем привет!
Народ, хочу написать функцию, возвращающую имена файлов в каталоге, но при этом фильтровать по маске правил (регулярными выражениями) на включение/исключение. Проблема в том, что если маска на исключение не задана, то функция работает некорректно… как можно более элегантно решить проблему?

 def my_search(path, include_mask="", exclude_mask=""):
    my_path = Path(path)
    return [str(my_file.name) for my_file in my_path.glob("*")
            if re.search(include_mask, str(my_file))
            and
            not re.search(exclude_mask, str(my_file))
            ]
xam1816
grif_rift
как можно более элегантно решить проблему?
если exclude_mask:
делать с exclude_mask
иначе:
делать без него
grif_rift
xam1816

Это самое первое, что пришло в голову
По факту, нужно проверять, как include_mask, так и exclude_mask. И учитывать это при подготовке данных в return, что уже будет выглядеть монструозно… Хотелось бы, как-то умнее и элегантнее
xam1816
grif_rift
Хотелось бы, как-то умнее и элегантнее
тогда нужно правильно составить регулярное выражение, которое будет учитывать что искать.
т.е вот это
  
if re.search(include_mask, str(my_file))
            and
            not re.search(exclude_mask, str(my_file)
можно описать одним регулярным выражением
grif_rift
xam1816
Не очень удобно. Поскольку условия могут быть записаны в разных местах и проще их описывать разными переменными. Чтобы “слепить” два условия - лишний костыль. Проще и интуитивнее одним правилом
xam1816
grif_rift
Не очень удобно. Поскольку условия могут быть записаны в разных местах и проще их описывать разными переменными. Чтобы “слепить” два условия - лишний костыль. Проще и интуитивнее одним правилом
приведи примеры названия файлов, и что нужно получить на выходе
grif_rift
xam1816
Любые файлы с компьютера
Примеры масок на включение: определенное расширение файла, расположение в определенном каталоге и т.д.

Примеры масок на исключение: признак бэкапа (префикс или суфикс в имени/расширении), наличие цифр или определенных слов (old) и т.д.
ZerG
В таком случае, раз вы уже пользуетесь рагулярками - используйте исключения самих рагулярок
если исключеий нет - то просто не добавляем в зпрос их и все.
xam1816
  
import os
import re
 
def find_file(dir, regex=None):
    for root_dir, _, filenames in os.walk(dir):
        for filename in filenames:
            path = os.path.join(root_dir, filename)
            if regex:
                pattern = re.compile(regex)
                if pattern.search(path):
                    yield path
            else:
                yield path
 
for f in find_file('/home/xam/Загрузки', '\.txt$'):
    print(f)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB