Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 4, 2022 16:05:42

grif_rift
Зарегистрирован: 2022-10-04
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция поиска файлов по маске

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

 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))
            ]

Офлайн

#2 Окт. 5, 2022 08:53:16

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Функция поиска файлов по маске

grif_rift
как можно более элегантно решить проблему?
если exclude_mask:
делать с exclude_mask
иначе:
делать без него

Офлайн

#3 Окт. 5, 2022 10:27:15

grif_rift
Зарегистрирован: 2022-10-04
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция поиска файлов по маске

xam1816

Это самое первое, что пришло в голову
По факту, нужно проверять, как include_mask, так и exclude_mask. И учитывать это при подготовке данных в return, что уже будет выглядеть монструозно… Хотелось бы, как-то умнее и элегантнее

Офлайн

#4 Окт. 5, 2022 11:54:04

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Функция поиска файлов по маске

grif_rift
Хотелось бы, как-то умнее и элегантнее
тогда нужно правильно составить регулярное выражение, которое будет учитывать что искать.
т.е вот это
  
if re.search(include_mask, str(my_file))
            and
            not re.search(exclude_mask, str(my_file)
можно описать одним регулярным выражением

Офлайн

#5 Окт. 5, 2022 14:19:49

grif_rift
Зарегистрирован: 2022-10-04
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция поиска файлов по маске

xam1816
Не очень удобно. Поскольку условия могут быть записаны в разных местах и проще их описывать разными переменными. Чтобы “слепить” два условия - лишний костыль. Проще и интуитивнее одним правилом

Офлайн

#6 Окт. 5, 2022 15:09:08

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Функция поиска файлов по маске

grif_rift
Не очень удобно. Поскольку условия могут быть записаны в разных местах и проще их описывать разными переменными. Чтобы “слепить” два условия - лишний костыль. Проще и интуитивнее одним правилом
приведи примеры названия файлов, и что нужно получить на выходе

Офлайн

#7 Окт. 5, 2022 15:47:27

grif_rift
Зарегистрирован: 2022-10-04
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция поиска файлов по маске

xam1816
Любые файлы с компьютера
Примеры масок на включение: определенное расширение файла, расположение в определенном каталоге и т.д.

Примеры масок на исключение: признак бэкапа (префикс или суфикс в имени/расширении), наличие цифр или определенных слов (old) и т.д.

Офлайн

#8 Окт. 5, 2022 19:08:16

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Функция поиска файлов по маске

В таком случае, раз вы уже пользуетесь рагулярками - используйте исключения самих рагулярок
если исключеий нет - то просто не добавляем в зпрос их и все.



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#9 Окт. 5, 2022 19:50:02

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Функция поиска файлов по маске

  
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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version