Ответы пользователя по тегу Python
  • Как найти и забрать нужные данные из json?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Так, например.
    py "json.load(urllib.request.urlopen('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2017-09-24'))['url']"
    Ответ написан
    Комментировать
  • Как сделать что-то если наступил следующий день/неделя/месяц/год на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А в чем проблема?
    Для начла получи точные дату и время необходимого события. Для этого прибавляй один день\неделю\месяц\год к текущей дате. Затем нужно вернуться к началу этого очередного интервала (дня\недели\месяца\года). В случае дня нужно отбосить время. В случае недели, нужно отбросить время и найти ближайший понедельник слева - то есть вычесть из даты номер дня недели. В случае месяца, нужно вычесть из даты номер дня месяца, в случае года - номер дня года соответственно.

    Получившиеся дата-время события теперь нужно не пропустить.
    Просто время от времени проверяем дату-время и если она больше или равна требуемому, генерируем ивент.
    Можно вычесть текущую дату-время из даты-времени события, если этот промежуток меньше порогового, то спать ровно этот промежуток, если больше, то спать пороговое время и следом повторть проверку.

    Високосные секунды можно не учитывать, если вы не работаете с интервалами меньше минуты.
    Перевод часов можно не учитывать, если не работаете с интервалами меньше суток. Иначе вам придётся оределить как должна вести себя программа при этих переводах.
    Ответ написан
    Комментировать
  • В чем проблема работы данного кода?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Представьте. что у вас уже есть на текущий момент самое большое и предыдущее самое большое число из всех, что попадались до сих пор. И вот вы нащли число, которое больше самого большого. Очевидно. что предыдущее самое большое надо подвинуть, а вы этого не делаете.

    Такие задачи проще всего решать начиная со штатной ситуации, а потом отрабатывать исключенияи специфические кейсы.
    Нарисуйте цепочку чисел, укажите стрелочкой на текущее и для этой позиции вручную найдите саоме большое и предыдущее. Потом подумайте какие будете делать операции.
    Ответ написан
    1 комментарий
  • Как sys.stdin, который выглядит как словарь превратить в словарь?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Так делать нельзя:
    dict = json.loads(str(sys.stdin))
    Нужно либо так:
    dict = json.load(sys.stdin)
    либо так:
    dict = json.loads(sys.stdin.read())
    Приведите остальной код тоже. Там наверняка такие же ошибки.
    Ответ написан
    Комментировать
  • Как перепарсить словарь python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Элементарно. Итерируйтесь по парам ключ-значение уидов и по соответствующим ключам запрашивайте в словаре дат нужные даты, формируйте новые словари и складывайте их в список. результат дампьте в json.

    Если вам не понятны эти слова, то вам рано решать эту задачу самостоятельно, следует подучить питон или идтик фрилансерам.
    Ответ написан
    Комментировать
  • Как посчитать количество суб-объектов в Python для каждого XML-объекта?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы можете сделать это за два прохода.
    На первом проходе просто собираете множество всех возможных уникальных тегов. Я бы просто записывал в словарь True по ключу, равному имени каждого попавшегося тега на первом проходе.
    В результате вы получите словарь уникальными именами в ключах, причем эти ключи будут в том порядке, в каком они встречались в XML (иногда это просто удобно, что они не в рандомном порядке).
    Имея общий набор имён вы можете воспользоваться стандартным способом записи в CSV в виде словарей.
    Останется лишь конвертировать каждый узел из вашего файла в словарь. Никаких сторонних библиотек не нужно.
    Ответ написан
    1 комментарий
  • Обращение к записи БД требует некоторой обработки. Что лучше: обработать в скрипте, который обратился, или в хранимой процедуре в БД?

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

    По существу вопроса. Минус хранимых процедур в том, что это код, который хранится вместе с данными. Нужно делать отдельные специфические "приседания", чтобы правильно деплоить и обновлять такой код, хранить его в системе контроля версий, мигрировать от версии к версии...
    Быстродействие в обоих случаях будет зависеть от конкретных действий, которые вы будете каждый раз повторять при "обращениях". Однако при наличии "бутылочного горлышка" в этом месте при реализации через хранимые процедуры вы уже мало что там можете сделать. А вот в коде на питоне можно при необходимости добавить воркеров и таски на длительные операции передавать им через очередь.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Я похожие задачи решал так:
    - В Inkscape готовился макет документа в svg-формате. Внутри SVG - это обычный текстовый XML-файл.
    - Потом на его основе строился шаблон, мы использовали стандартный шаблонизатор джанго, но можно взять и сторонний, например Jinja или любой другой, тысячи их. У нас структура документа была гораздо сложнее вашей и я использовал многоуровневые шаблоны для разных фрагментов документа. Да, WISIWIG редактирования шаблонов добиться не получилось, но такая задача была не критичной. В вашем случае шаблон получается тривиальным и можно даже подстановку делать на уровне строк, только экранирование нужно аккуратно сделать.

    Это всё лет десять назад уже делалось. Сейчас может быть есть инструменты поудобнее. Не следил за новостями в этом направлении.
    - Далее шаблон рендерится заполняясь данными из контекста, и итоговый SVG-документ обрабатывается headless инстансом редактора Inkscape, который крутился на отдельной виртуалке, а позднее запускался в docker-контейнере. Это фактически запуск Inkscape -A document.svg document.pdf, при котором документ преобразуется в pdf-файл.
    В итоге полученные pdf опционально собираются в один, чтобы сделать многостраничный документ и его удобнее было печатать. Не помню какая библиотека для этого использовалась, но задача распространённая и простая, найдёте.
    Ответ написан
    Комментировать
  • OSError: [WinError 193] %1 не является приложением Win32 - как решить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Нужно посмотреть что у вас в "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\numpy\_distributor_init.py"
    Откуда берется значение filename. Возможно туда попадает не путь к dll, а плейсхолдер %1 из какого-нибудь скрипта при некорректной установке библиотеки.
    Ответ написан
    Комментировать
  • Как проще всего представить простой форматированный текст в Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Какие-то у вас требования сранные. Кому будет утомительно? Вы вручную конвертировать планируете? Или остерегаетесь по поводу алгоритмической сложности преобразования? Конвертация - это изолированная и хорошо тестируемая задача. Разметка на основе XML даст вам максимальную гибкость и универсальность, всегда можно игнорировать те или иные возможности форматирования и не потерять какие-то нюансы. Можно надобавлять свои неймспейсы и атрибуты в них. Маркдаун такого гарантировать не сможет.
    Что значит "по дереву тегов набегаешься"? Вы в ручную бегать собираетесь?
    Куда и зачем вам надо конвертировать? Как-то эту важную часть вы оставили за скобками.
    Обратно тоже потребуется? Есть ли требование идентичности при двойном преобразовании?
    Используйте XML и не морочьте себе голову. Общий формат должен быть максимально строгим, документированным, однозначным и универсальным. Лучше XML вы тут ничего не найдёте. Если в какой-то момент у вас в одном из форматов встретится какое-то особое форматирование (подчеркивание волнистой линией какое-нибудь), то в XML добавить новый тег или атрибут не составит труда, чтобы сохранить информацию и не нарушить обратную совместимость, а вот с зоопарком диалектов маркдауна вы намучаетесь изрядно.
    Ответ написан
    Комментировать
  • Как упростить однострочный if?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    CONVERSATION2PEER_GAP = 2_000_000_000
    conversation_id = int(conversation_id)  # Почему у вас где-то идентификаторы хранятся интом,
    # а где-то текстом? Нужно стремиться к стандартизации и избегать таких неконсистентных нюансов.
    # Если там не может быть другого текста, то следует приводить к числу сразу когда возможно.
    peer_id = event.object['message']['peer_id']
    if peer_id != conversation_id + CONVERSATION2PEER_GAP:
         continue
    Ответ написан
    Комментировать
  • Как из строки восстановить список?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ещё можно сериализовать\десериализлвать этот список в \из json.
    huge_string = json.dumps(huge_list)
    restored_list = json.loads(huge_string)
    Ответ написан
    Комментировать
  • Как сохранить JSON с кириллицей, чтобы она читалась?

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

    Help on function dumps in module json:
    
    dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
        Serialize ``obj`` to a JSON formatted ``str``.
        
        If ``skipkeys`` is true then ``dict`` keys that are not basic types
        (``str``, ``int``, ``float``, ``bool``, ``None``) will be skipped
        instead of raising a ``TypeError``.
        
        If ``ensure_ascii`` is false, then the return value can contain non-ASCII
        characters if they appear in strings contained in ``obj``. Otherwise, all
        such characters are escaped in JSON strings.
        
        If ``check_circular`` is false, then the circular reference check
        for container types will be skipped and a circular reference will
        result in an ``OverflowError`` (or worse).
        
        If ``allow_nan`` is false, then it will be a ``ValueError`` to
        serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in
        strict compliance of the JSON specification, instead of using the
        JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
        
        If ``indent`` is a non-negative integer, then JSON array elements and
        object members will be pretty-printed with that indent level. An indent
        level of 0 will only insert newlines. ``None`` is the most compact
        representation.
        
        If specified, ``separators`` should be an ``(item_separator, key_separator)``
        tuple.  The default is ``(', ', ': ')`` if *indent* is ``None`` and
        ``(',', ': ')`` otherwise.  To get the most compact JSON representation,
        you should specify ``(',', ':')`` to eliminate whitespace.
        
        ``default(obj)`` is a function that should return a serializable version
        of obj or raise TypeError. The default simply raises TypeError.
        
        If *sort_keys* is true (default: ``False``), then the output of
        dictionaries will be sorted by key.
        
        To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
        ``.default()`` method to serialize additional types), specify it with
        the ``cls`` kwarg; otherwise ``JSONEncoder`` is used.
    Ответ написан
    Комментировать
  • Можно ли сделать переменную глобальной в функции?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    1. Добавить новые команды.
    2. Выводить по ним частичные данные.
    Ответ написан
    Комментировать
  • При создании телеграм бота на PyDroid вылезает ошибка, что делать?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ну вот же написано:
    ValueError: Unrecognised argument(s): Level

    Где у вас такой аргумент поищите глазами!
    А, не т не надо искать, ведь уже написно где:
    File "", line 6, in

    ...
    logging.basicConfig(Level=logging.INFO)
    ...

    А теперь читайте документацию на эту функцию, или посмотрите какие у нее аргументы в исходниках, или идите изучать питон с начала. Рано вам такое.
    Ответ написан
    3 комментария
  • Как зациклить пока не выполниться условие?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вам тут не нужно никакого цикла. Просто считайте, что в ответ на каждое сообщение или нажатие пользователя вы по новой заходите в эту функцию. Разделите куски алгоритма условием по содержимому входного текста. Делайте действия только в ветках.
    Ответ написан
  • Можно ли использовать open('file','r').read() в python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Можно вот так делать:
    content = pathlib.Path('file').read_bytes()
    В таком случае всё правильно закроется.
    Вообще нужно стараться уже современные методы работы с файлами и путями использовать, а не доисторические.

    Вы, кстати, самозакрывающуюся читалку и сами сделать можете:
    def readfromfile(filename, mode='t'):
        assert mode in {'b', 't'}
        with open(filename, mode=mode) as f:
            return f.read()

    Но зачем, когда есть замечательный pathlib в третьем питоне из коробки?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А в чем проблема? Пусть от хранит состояние в БД и в ту же БД ходит админка за инфой.
    Что именно вам не понятно и что не получается?
    Ответ написан
    Комментировать