Ответы пользователя по тегу Python
  • Выскакивает такая ошибка IndentationError: unindent does not match any outer indentation level, решить в моём коде и в чом вообще проблема?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ну сначала следует один из списков превратить в словарь с ключом по идентификатору:

    d1 = {item['user_id']:item for item in list1}
    Потом превращаете в такой же словарь второй список, но по пути можно заодно и данные проапдейтить:
    d2 = {
        item['user_id']:{
            **item, 
            **d1.get(item['user_id'], {})
        } 
        for item in list2
    }

    Теперь, если вам нужен-таки список обратно, то делаете из словаря список его значений:
    list(d2.values())

    Во втором питоне нужно будет по-другому делать, это для третьего вариант.
    Ответ написан
    Комментировать
  • Как получить EXIF с JPG без использования библиотек?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Читайте документацию по встроенной библиотеке ctypes.
    Читайте спецификацию JPEG в целом и его блока EXIF данных в частности.
    Правда это не будет каким-то упражнением в работе с бинарными файлами. Весь интерфейс работы бинарными файлами сводится к установке курсора (seek) и чтения нужного количества байт от курсора. Остальное - это работа с бинарными структурами и данными.
    Ответ написан
    1 комментарий
  • Как прикрепить файл из папки в сообщение вк?

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

    F = open(os.path.join(DIR, random.choice(os.listdir(DIR))))

    В переменной F у вас созраняется не картинка, не файл, и не его содержимое, а специальный объект, который позволяет получить содержимое файла с диска.
    У этого объекта есть техническое строковое представление, но оно никак не связано с содержимым файла.
    И вы это техническое название объекта, предназначенного для доступа к файлу подставляете в текст сообщения для отправки. Соответствующий результат и получаете.
    Даже если бы вы подставили в текст сообщения не техническое название объекта для доступа к файлу, а само содержимое файла, вам бы это все равно не помогло. Файл картинки - это бинарный файл. Там байты, которые не прочитать глазами. Вы неправильно пользуетесь библиотекой, не понимаете различия между файлом, его содержимым, его форматом и представлением.
    В комментариях к вашему вопросу вам сказали как загружать картинки чреез API контакта.
    Видимо содержимое файла нужно отправить http post-запросом на специальный сервис для ее хранения, а уж ее идентификатор прикрепить специальным образом в состав сообщения.

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

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

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

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Так вы, судя по конфигу, именно этого и хотите. У вас по факту один логгер, который жрёт всё подряд и передает без разбора трем хендлерам.
    Вы запутались в именах. Имя хендлера не фильтрует логи. Вы создаете именованные логгеры в коде, но по этим именам нигде не фильтруете.
    Для сности и прозрачности рекомендую именовать хендлеры в конфиге с префиксом "handler_" или как-то так. Чтобы не было соблазно ошибиться в именах. Явное лучше неявного
    Вам в конфиге нужно сделать три логера, каждый из которых будет фильтровать свои логи и отдавать своему хендлеру.

    Да, похоже вы не правильно поняли суть хендлеров.
    Фильтруют сообщения логгеры, хендлеры их обрабатывают.
    В вашем случае достаточно было одного хендлера. Несколько нужны на случай, если бы вам помимо stdout некоторые логи нужно было бы отправлять по почте, некоторые особенным образом форматировать и пихать в отдельный файл (например важные ошибки), некоторые гасить и никуда не выводить, некоторые отправлять через телеграм-бота в чат.

    LOGGING_CONFIG = {
        'version': 1,
        'disable_existing_loggers': True,
        'formatters': {
            'standard': {
                'format': '[%(asctime)s] %(levelname)s | %(name)s: %(message)s',
                'datefmt': '%Y-%m-%d %H:%M:%S',
            },
        },
        'handlers': {
            'std': {
                # 'level': 'INFO',
                'formatter': 'standard',
                'class': 'logging.StreamHandler',
                'stream': 'ext://sys.stdout',
            },
        },
        'loggers': {
            'init': {
                'level': 'DEBUG',
                'handlers': ['std'],
                'propagate': 1,
            },
            'parse': {
                'level': 'DEBUG',
                'handlers': ['std'],
                'propagate': 1,
            },
            'getmail': {
                'level': 'DEBUG',
                'handlers': ['std'],
                'propagate': 1,
            },
        },
    }
    Ответ написан
    3 комментария
  • Как часть имени файла записать в тот же файл?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы можете вытащить дату из имени файла: fname[3:].rsplit('.', 1)[0]
    И добавить эту строку в начало каждой при записи.
    Осторожнее, ваш метод равнения интервалов будет работать корректно только в случае такого формата даты в имени файла, у которого сначала идет год потом месяц, потом день, а месяц и день выравнены нулями до двух знаков.
    Ответ написан
    Комментировать
  • Какие есть ошибки в коде?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Я делаю так, если уж приспичит, но нужно стараться делать выражения проще и читабельнее:
    print(*[
        str(int(i) ** 2) 
        for i in input().split(' ') 
        if int(i) % 2 == 1 and str(int(i) ** 2)[-1] != '9'
    ])

    Для сложных кусков правил несколько:
    - не экономьте строки.
    - открытые скобки (любые) намекнут питону, что оператор еще не закончился.
    - ни к чему лишний раз ставить символ переноса строки, это может привести к ошибкам.
    - не экономь на спичках: если кусок алгоритмически сложен, не нужно экономить на промежуточных переменных, это позволит сделать код понятнее. Если уж хочется освободить память пораньше, то можно удалять переменные, но всё должно быть целесообразно.
    - если уж нагородил литералов сборки спика или словаря, отформатируй их понятно.
    Ответ написан
    Комментировать
  • Как создать окно команд в python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А что именно у вас вызывает вопросы?
    Вы реализовываете функцию, которая принимает текущий контекст, строку команды, и поток для вывода выхлопа.
    Если нужно REPL в терминале, то в цикле функцией input запрашиваете команду, передаёте её в выше упомянутую функцию.
    Можно сделать не функцию, а класс, тогда он может ъанить в себе контекст текущего состояния вашей командной оболочки и поток для вывода, а функция обработки команды может быть не одна, а много методов, помеченных префиксами или декораторами. так для каждой команды можно свой метод описать, а декораторами можно указывать права доступа к соответствующей команде, какую-то еще специфику.
    Если нужны команды с аргументами, ключами, параметрами, с автодокументацией, то можно воспользоваться встроенными библиотеками парсинга командной строки, например optparse, или сторонней развесистой библиотекой, например, click.

    Если командная стрроука нужна не в терминале, а, скажем, в браузере, то интерфейс обработки тот же, но в цикле приёма команд вы можете брать их не из stdin, а из веб-сокета или API на flask. Можно создать окно с помощью Tkinter или PySide\PyQt и запрашивать текст команд там. Можно поискать библиотеки реализации расширенных термиальных воможностей, где будет автодополнение, подсказки и прочее.

    В целом, судя по вашему вопросу, вам стоит либо остановиться на простейшем REPL в терминале как я написал в начале, либо подучиться немного питону в частности и программированию в целом и тогда этот вопрос у вас уже не встанет, поскольку окажется тривиальным.

    Успехов.
    Кстати, я не искал, возможно (и даже наверняка) есть готовые продвинутые библиотеки для реализации кастомных REPL питоне. Наверно кто-то подкинет такие варианты в альтернативных ответах.
    Ответ написан
    Комментировать
  • Python+Mysql возникает ошибка?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Смотрите внимательнее:
    """inser into log
        (phrase, letters, ip, browser_string, results)
        values
        ('hitch-hiker', 'aeiou', '127.0.0.1', 'Firfox', "{'e', 'i'})"""

    Используются тройные кавычки. СПрячем их для ясности:
    inser into log
        (phrase, letters, ip, browser_string, results)
        values
        ('hitch-hiker', 'aeiou', '127.0.0.1', 'Firfox', "{'e', 'i'})

    что видим? у вас непарная двойная кавычка перед фигурной скобкой.
    Именно об этом вам "намекал" парсер SQL выдавая исключение и указывая на конкртеное место проблемы. Внимательно смотрите и увидите.
    Ответ написан
    Комментировать
  • Как получить неуникальные элементы списка после преобразования его set()'ом?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    from collections import Counter
    [k for k, v in Counter(items).items() if v > 1]
    Ответ написан
    3 комментария
  • Как реализовать "таймер неактивности функции" после использования функции?

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

    В итоге дату последнего сообщения достаете из таблицы, прибавляете к ней час, если получилось более позднее время, чем текущее, значит постить нельзя. В случае поста просто обновляем время в БД.
    Ответ написан
  • Как удалить профили пользователя с доменной машины с помощью python 3?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    модуль subprocess позволяет выполнять консольные команды и получать их выхлоп (в том числе в реальном времени).
    Ответ написан
    2 комментария
  • AttributeError: 'int' object has no attribute 'replace' как исправить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У целого числа нет метода replace.
    Чушь написана в коде.
    Ответ написан
    4 комментария
  • Что делает этот код из воркера на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    list(map(Queue, ['default']))
    # Эквивалентно
    [Queue('default')]

    Разницы в данном случае нет.
    Ответ написан
    Комментировать
  • Как импортировать определённые строки в Python?

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

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Если спрашиваете совета как решить проблему, приводите воспроизводимые примеры.
    Мало того. что код не проверяете на опечатки, так еще и проблема у вас какая-то локальная. Может быть комп тормозит, может быть страница в браузере, может быть js на ней тупо рандомные нажатия клавиш пропускает.
    С учетом невоспроизводимости вашей проблемы, разумно было бы хотя бы попробовать дугие драйверы, хром тот же... А-то складывается впечатление, что "ой что-то не работает памагити!!!111"
    Ответ написан
    Комментировать