Задать вопрос
Ответы пользователя по тегу Python
  • Можно ли как-то огранчить opencv по поиску объектов на изображении?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Да просто обрежьте картинку перед тем как отдать opencv и все.

    Дополню.
    Конечно обрезать надо не вручную, а той же самой opencv.
    Ок, таблица может быть где угодно, но внешняя рамка-то всегда на своем месте?
    Вообще не очень ясно что там у вас за PDF-ки. Если такие как в примере ровненькие и с одинаковыми полями, да рамочкой по ГОСТу, то просто кропайте картинку по этой рамке и все.
    Если поля плавают по размерам, то придётся искать границы и кропать по ним.
    Самое неудобное - это когда у вас сканы или фото документов, и они чуть под разными углами и искажены. Но в целом задача хоть и усложняется, но остается прежней.
    Можно найти вертикальные линии и взять самую длинную из самых левых - это левая граница рамки. С остальными так же.
    Обрезайте рамку полностью с небольшим запасом, потом ищите координаты таблицы, пересчитываете их в координаты на необрезанной картинке, добавляете с нужной стороны (в зависимости от того, с какой стороны у вас нашлась таблица) и снова вырезаете из оригинального изображения.

    И да, ненужные таблицы, особенно те, которые всегда на своем месте, можно перед поиском таблиц замазать белым прямоугольником с небольшим запасом. Но вырезать искомую таблицу надо по координатам с оригинала, чтобы края были корректными.
    Ответ написан
    7 комментариев
  • Как заставить даты поменяться?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Положите все даты в список, отсортируйте его.
    Сделайте цикл по элементам этого списка. В каждой итерации делайте ожидание текущей даты, а потом печать. И так дальше по списку.
    Ожидание можно сделать с помощью time.sleep. Нужно вычислить период между текущей датой-временем и очередной, выразить этот период в секундах.
    Ответ написан
    Комментировать
  • Как вытащить нужные данные из файла?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Можно реплейсить первый символ на "{", а последний на "}" (если там были не квадратные скобки, то валимся с ошибкой). Ну и предпоследний символ если запятая, то его удаляем.
    Ну и кавычку добавить придётся вторым символом.
    Если от валидного json ваш текст отличают только эти нюансы, то предложенного выше будет достаточно, потом просто парсим как json.

    Ещё можно без модификаций этот текст загрузить как yaml стандартной библиотекой.
    При этом вы получите список из трёх элементов:
    1) строка 'created_at":"2022-08-11T14:01:46.886Z"'
    2) Словарь с одним элементом: {'city': 'Lawton'}
    3) Словарь с одним элементом: {'country': 'US'}
    Ну а что с этим потом делать - уже разберетесь.
    Yaml гораздо больше вольностей в своём формате допускает.
    Ответ написан
    5 комментариев
  • Как работать с БД из другого класса?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Из приведённого кода не понятно для чего вообще выделен класс Sql.
    Фактически вы используете только один метод этого класса, а содержимое конструктора можно разместить в том же методе.
    Бессмысленно и беспощадно.
    Самое правильное - это делать всё как можно проще.
    Вот два очень полезных принципа в разработке:
    - https://ru.wikipedia.org/wiki/KISS_(принцип)
    - https://ru.wikipedia.org/wiki/Бритва_Оккама

    В приведённом вами куске кода не нужен класс sql, достаточно сделать всё внутри одной функции, ведь вы не используете созданный обьект больше никак.
    Другой вопрос, если вам нужно делать много запросов в рамках одного подключения к БД. На подключение тратяся некоторые накладные расходы по времени и трафику, иногда логично вынести подключение и хранить его в выделенном персистентном состоянии, которое будет создано один раз и переиспольовано для множества запросов. В этом случае закрывать коннект после запроса нельзя.
    Прочитайте вот: https://pavel-karateev.gitbook.io/intermediate-pyt...
    Обычно коннект к БД уже является менеджером контекста. Для чего вы делаете вот эту бессмысленную обёртку вокруг - не ясно.
    В соответствии с хоошим стилем прогаммирования нужно, чтобы действие любой функции можно было охарактеризовать простой короткой фразой без союзов, без "и" и "или", без "если".
    Иначе эту функцию стоило бы разбить на более мелкие и простые функции.
    Вот ознакомьтесь с концепцией чистой функции: https://dvmn.org/encyclopedia/clean_code/decomposi...
    Ответ написан
    2 комментария
  • Как расшифровать Exit code?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы поставили ограничение глубины стека таким большим, что память заканчивается задолго до достижения этого лимита, поэтому ваш процесс интерпретатора падает не показывая валидную ошибку.
    Не стоит делать такой неадекватный лимит стека, тогда ваш интерпретатор упадёт с другой ошибкой - превышен лимит рекурсивных вызовов.
    А уж эту проблему решать надо оптимизацией алгоритма. Ваш слишком жаден до стека.
    Ответ написан
  • Как сделать бот в Телеграм без приставки bot на конце?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Есть Telegram bot API - это для ботов. А есть Telegram client API - это для приложений, вполняющих функции клиентской стороны. То есть если вы задумаете написать свой клиент для телеграмма, то будете пользоваться этим API. Некоторые злоупотребляют правилами и делают ботов с использованием этого API, чтобы боты ритворялись реальными аккаунтами. За это, по идее, должны банить.
    Не надо делать таких ботов. Для чего вам?
    Ответ написан
    1 комментарий
  • Что почитать для реализации автоответчика в виде бота реагирующего только на слова (триггеры)?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Почитайте Марк Лутц - "Реализуем автоответчик в виде бота, реагирующего только на слова-триггеры" - том 1, 5 издание, 2019 год.
    Нет, ну вы серьёзно сейчас?
    Учитесь программировать и ваши вопросы отпадут. Можно по книжке указанного выше автора, но название "Изучаем Python".
    Неужели вы думаете вам кто-то для нулевого уровня напишет подробное руководство по написанию "бота, реагирующего на слова"? Это тривиальная задача для тех, кто уже научился программировать.
    Ответ написан
    3 комментария
  • Почему возникает ошибка TypeError: function missing required argument 'vars_list' (pos 2)?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У вас значений 7, а плейсхолдеров для подстановки 8. Не хватает одного параметра, о чем вам английским по терминалу по человечески пишется в сообщении об ошибке:
    TypeError: not all arguments converted during string formatting

    Что тут не понятно?
    Если делаете executemany то вторым аргументом должен быть итерируемый объект с векторами аргументов.
    Ответ написан
  • Как сделать, чтоб код обращаясь к postgre в постоянно режиме проверял бы наличие новых элементов в таблице и при их наличии передавал бы их в очередь?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Можно запускать этот скрипт по крону, как посоветовали выше, можно делать извлечение записей из БД в цикле.
    Если у вас целочисленный идентфикатор у записей, то запоминаете максимальный полученный идентификатор записи ив следующий раз селектите все записи, что больше этого идентификатора. Тогда не придётся важды извлекать из БД одни и те же записи, а если заисей нет, то выборка будет по индексу и произойдёт очень быстро с пустым или небольшим результатом.
    Если целочисленного идентификатора нет, то можно завести автоинкрементальное поле или таймштамп, по котоому будете фильтровать уже обработанные записи.
    В чем конкретно у вас проблема? Если вы написали выше риведенный код, но не догадались и не сделали попутку засунуть его в цикл, то, сомневаюсь, что это написали вы.
    Здесь вам не напишут готового кода, за ним нужно идти к фрилансерам. Задавайте конкретные вопросы и вам помогут.
    На общие вопросы - общие ответы, и то если не слишком рстранный вопрос. Никто лекцию тут читать по азам и основам не нанимался.
    Детализируйте ворос и как следует оформляйте код, пожалуйста.
    Ответ написан
    Комментировать
  • Выделяется ли память при использовании срезов в цикле в Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Причем тут цикл? Срез срезу рознь.
    При срезе списка выделяется по размеру среза, но если результат среза никуда не сохранён, то это короткоживущий объект и он будет освобождён быстро.
    Если речь о кортежах и строках, то они иммутабельны и тут вполне возможно не копировать данные, а ссылаться на сущетсвуюшие отрезки. Надо глянуть под капот в исходники, чтобы убедиться. Под любой новый объект так или иначе выделяется память, но в случае мутабельных сипсков срез гарантировано копируется.
    Ответ написан
    2 комментария
  • Как четко определять название города в именительном падеже, когда пользователь этого не делает?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Посмотрите в сторону сервиса дадата
    Ответ написан
    1 комментарий
  • Как правильно сократить код и сделать его понятным?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    def button_callback(call):
        actions = {
            'hlep': bulk,
            'souss': souss,
            'vasabi': imvs,
            'palki': palk,        
        }
        fn = actions.get(call.data)
        bot.answer_callback_query(call.id)
        if fn:
            bot.send_message(call.message.chat.id, fn, parse_mode='html', reply_markup=button)
        elif call.data == 'button1':
            bot.send_message(call.message.chat.id,text = "Простите, автор-оладушек и еще не реализовал эту функцию")


    И наведите порядок с отступами. Если они такие и есть в вашем коде. то всё плохо. Приводите код на pastebin
    Ответ написан
  • У меня не выводит сложение всех чисел, как найти?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Дык тут нет сложения всех чисел, только сумма последней строки и бесполезный проход по всем элементам матрицы.
    Правда не понятно нахрена ты вложенный цикл в конце делаешь. если выше использовал уже sum.
    Не понятно зачем линию рисовать в цикле, если строку можно умножить на число и она повторится нужное количество раз.
    Ответ написан
    Комментировать
  • Зачем нужно наследование от потока в питоне?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А для чего вы вырезали куски кода в методах? Там вполне может быть ответ на ваш вопрос, а нам как-то гадать надо на кофейной гузе?
    К примеру в NodeConnection.__init__ вызывается наверно конструктор через super и туда вполне может быть передан target, а там может быть что угодно полезное и нужное, что обясняет ситуацию.
    Почему не вставить полностью код для ясности?
    UPD.
    Наследование от треда здесь применяется потому, что каждый NodeConnection породит свой поток, в котором будет вычитываться свой инкапсулированный сокет) в который кажому инстансу NodeConnection передаются какие-то данные.
    Можно было сделать просто отдельный класс и в него инкапсулировать и сокет и тред, но автор выбрал сокет инкапсулировать в тред.

    В обзем NodeConnection - это тред с инкапсулированным сокетом для передачи ему данных из другого потока.
    Ответ написан
  • Как удалить строку в python, если в ней менее 2 русских букв?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ну, во-первых, вы возвращаете тот же список, что принимаете на входе, а новый сформированный никуда не возвращаете.
    Во-вторых, вы оставляете строки, которые имеют две подряд идущие русские буквы, а если букв будет две, но между ними будет пробел, или английская, или цифра, то вы такую строку проклассифицируете неверно. Регексп у вас не соответствует задаче.

    И вам не надо искать все вхождения, достаточно первого признака. Грубо говоря, ам надо искать в строке русскую букву, за которой идёт что угодно и сколько угодно раз (даже ноль раз), а затем идет еще русская буква. Если такая подстрока нашлась, строку надо оставить, иначе пропустить.

    Правила этого ресурса запрещеют постить код скриншотами. Нужно постить его текстом в специальном теге или в виде ссылки на онлайн интерпретатор с кодом.
    Ответ написан
  • Как написать "62 рубля 00 копеек", и "37 рублей 12 копеек"?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А что конкретно вам не понятно в этой задаче? Это не биржа фрилансеров и никто вам не будет делать готвого решения, поэтому задавая вопрос нужно показать как вы сами пытаетесь решить свою проблему, и вам покажут где вы не правы.

    Ну давайте резберем вашу задачу на части. Это называется декомпозиция. Любые задачи нужно решать начиная с декомпозиции - разбиения на более простые подзадачи.

    Итак, в чем проблема? Вам не ясно как число разбить на целую и дробную часть? Окей, ещё глубже декомпозируем: вам не ясно как отбросить дробную часть, чтобы получить число рублей? Или вам не ясно как получить целое число копеек?

    Допустим это вы сделали. Что вам ещё не ясно? Как правильно согласовать два слова с числами?
    Ну так в школе это изучается. Вроде ж всё просто. Есть всего три варианта: "рублей", "рубль", "рубля". Обычно эти варианты принято нумеровать: 0 - рублей, 1 - рубль, 2- рубля.
    Да, с 2 до 4 - это то же самое, что 2 (рубля). Ноль, а также с 5 до 19 - это то же самое, что 0 (рублей). Осталось получить остаток от деления числа на 20, привести это к по формуле выше к одной и трёх цифр и получите нужный вариант словоформы.
    Выходит для любого слова, которое нужно согласовать с числительным, нужно предусмотреть три варианта и сделать функцию, которая будет их правильно выбирать в зависимости от числа.
    Да, там могут быть ещё варианты с падежами и родами, но это не про ваш случай.

    Ок. что е вам ещё может быть не ясно? Как подставить в текстовый шаблон параметры?

    Вопросы надо конкретизировать.
    Ответ написан
    Комментировать
  • Как исправить ошибку в программе?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Приглашения к вводу данных не соответствуют заданию.
    Не использованы средства шаблонизации, которые предоставляет язык рограммирования.
    Оформление кода не соответствуют требованиям PEP8.
    Не предусмотрено согласование количества дней и ночей с окончанием слов "ночей" и "дней" в шаблоне. При числах 1,2,3, 4, 21, 22 и т.д., окончания будут неверными.
    Ответ написан
    Комментировать
  • Kак сделать иммутабельный список?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы меня удивляете, сударь.
    Вроде не новичок и понимаете концепию иммутаельности, передачи аргументов по значению и по ссылке, но с непониманием элементарной базовой особенности языка вы идёте задавать тривиальный вопрос у живых людей, когда самые-самые новички знакомятся с этим в первых главах любой книжки про питон для чайников.

    К питону не применимы понятия "передачи аргументов по значению" или "по ссылке".
    В Питоне переменные раотают иначе, чем в Си или Паскале.
    Переменная в Си - это ящичек, куда вы что-то можете положить. В том числе в ящичке может лежать ссылка на другой ящичек.
    В питоне переменная больше похожа на ярлычок, привязанный к объекту. Число, строка, список, словарь, класс, инстанс класса, None, ... - всё это объекты и они лежат где-то в памяти.
    Какие-то объекты мутабельны, какие-то иммутаельны, но это не важно. У любого объекта может быть много ярлычков (например имен). Также ярлычком будет элемент списка, ключ или значение в словаре и т.д.
    От обычного указателя в си это отличается тем, что его не нужно разыменовывать, чтобы обратиться к объекту. Употребляем имя - подразумеваем значение. Присвоение перевешивает ярлычок, удаление удаляет ярллычок.
    Да, чем-то это смахивает на смартпоинтеры, но не полностью.
    Да, в питоне не принято изменять мутабельные входные параметры. По крайней мере можно яно скопировать мутабельный объект поверхностно или глубоко. Для этого есть специальные методы или функция copy.

    Ох и предстоит вам еще поудивляться побочному эффекту мутабельности в дефолтных значениях аргументов функций.

    Подавите свои амбиции и прочитайте хотя бы бегло какую-нибуь книжку по питону. Вам можно даже не шибко детскую.
    Ответ написан
  • Aiogram Message is not modified как исправить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы пытаетесь в цикле поменять текст сообщения на тот же самый текст.
    Протокол телеграмма не позволяет этого делать, потому что это бессмысленно.
    Вы можете:
    1) помнить предыдущий текст и сравнивать новый с ним, чтобы вызыватьредактирование только если текст изменился.
    2) Перехватывать и игнорировать MessageNotModified, если считаете, что эта ситуация будет редкой и лишний трафик на сервера телеги вас не беспокоят.
    3) Вы можете чисто логически не редактировать сообение, если исходные параметры его не поменялись.
    4) вы можете гарантированно менять исходные параметры сообщения, чтобы оно гарантированно изменило текст.

    Выбирайте решение на своё усмотрение. А в той второй ошибке, что вы привели в комментах, вы не учитываете, что счетчик у вас глобальный на уровне модуля и достуен во всех функциях модуля, но если вы делаете его присвоение в коде функции, то в ней появляется локальная одноименная переменная, которая перекрывает глобальную, но в конкретно этом случае вызывает ошибку, поскольку при первой итерации у вас локальная переменная еще не определена, хотя фактически объявлена.
    Вам нужно почитать как в питоне работают неймспейсы, как объявлять переменные в функции из глобального скоупа.
    Ответ написан
  • Как передать значения из данной функции в основную программу?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    нио каком 'return' тут речь быть не может. Это calback.
    Если ваш "основной код" работает в том же потоке, то можете сделать глобальный обьект (синглтон), который будет "виден" на уровне модуля и в on_message и в вашем "основном коде". В него вы затягивайте сообщения, а в другом месте их вынимаете. Для этого очереди и существуют.
    Если речь идёт о разных потоках, то так не получится. Тогда оптимально будет поднять внешнюю очередь, например RabbitMQ и пользоваться ею. Но судя по вашему вопросу, знаний у вас пока не хватит на это. Подучить бы сперва питон на более простых вещах.
    Ответ написан
    1 комментарий