Ответы пользователя по тегу Python
  • Правильно ли решил задачу по топпингу в пиццу. 7.1 Эрик Мэтиз Python?

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

    Учиться, учиться и ещё раз учиться.
    Ответ написан
  • Почему не парсятся ссылки на python?

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

    Разбивайте задачу на маленькие подзадачи и делайте их отдельно, на каждом шагу убеждаясь, что всё как надо. Для этого можно делать отладочный выхлоп в промежуточных состояниях.

    ВОт вы почему-то свято уверены, что lines[2][8:] - это перечень ссылок через запятую. Может быть даже в одном из примеров в какой-то момент когда-то так оно и было, но с тех пор вы уже поменяли, скорее всего, код или входной формат, но не учли это.
    Делайте больше отладочного вывода. Лучше не принтами, а с использованием модуля logging, тогда отладочный выхлоп можно включать и отключать при необходимости не трогая код.
    Каждый раз, когда вы меняете код, не важно для исправления старых ошибок, или для добавления новой функциональности, вы неизбежно вносите новые ошибки.
    Чтобы это контролировать пишут юнит-тесты. Но вам, похоже, еще рановато.
    Ещё, особенно в небольших скриптах, полезно убеждаться, что всё идёт как надо в промежуточных этапах. Для этого в питоне есть ключевое слово assert.
    Оно позволяет указать обязательное условие, которое должно соблюдаться в этом месте выполнения программы, и текст ошибки, с которой упадёт программа в этом месте, если условие не соблюдается.
    Конкретно здесь, можно было бы убедиться с помощью assert, что в третьей строке вы отрезали 8 символов и эти символы соответствуют префиксу "Images: ".
    Падение программы на этом месте даст вам понять, что вы где-то ошиблись и что-то пошло не так, как вы ожидали. Эти ассерты также помогут вам сразу обнаруживать изменение входного формата данных, за который, возможно, отвечает не ваш код.
    Ответ написан
    Комментировать
  • Как сделать оформление словаря в txt файле и вычитывание значений из этого файла?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Надо вам бы книжечку почитать по питону. Быстрее и полезнее было бы для вас в плане освоения.
    Вот, например устаревшая конструкция:
    #-*- coding:cp1251 -*-
    Сейчас принято весь код держать в utf-8 и испоьзовать свежий питон третьей версии.

    Прочитайте про PEP8.
    Считается плохим стилем использовать CamelCase для чего-то кроме классов.
    Для переменных и имен функций нужно использовать snake_case.
    selected_genre = str()
    selected_game = str()

    Ни к чему объявлять такие переменные присвоением пустой строки, причем с вызовом явного конструктора. В Питоне строки - неизменяемый тип, а переменные. это не ячейки, зарезервированные в памяти, а, как бы, "бирки" с именем, которые вешаются на объекты. ВОт строки - это объекты, которые нельзя менять. Как создаются, так и остаются.

    genre_file = open('genres.txt')
    Не хорошо так открывать файл. Для такого мелкого скрипта это не так важно, но хорошую привычку у себя формировать надо всегда и всегда надо работать с файлами правильно. Через контекстный менеджер with и используя pathlib.

    GenreList.append(line.strip())
    Обратите внимание на разницу между append и extend, именно в этом одна из причин проблемы, с которой вы тут боретесь.

    value = item.split(" ")[1:]
    Сплит можно делать по знаку равно, а не только по пробелу. Такое ощущение, что вы не особо задумываетесь, что пишете в коде.

    Там дальше вообще какая-то дичь. Так писать нельзя. Код непрозрачный и нечитабельный. Если вы наделали кучу косяков и ошибок в более простом коде, то вот в дальнейшей каше там вообще швах.
    Проще надо.

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

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

    Разбивайте всегда задачу на ОЧЕНЬ МАЛЕНЬКИЕ подзадачи и решайте их отдельно. Проверяйте решение подзадачек тоже по отдельности, убеждайтесь, что этим мелкие кирпичики работают.

    Повторюсь, изучайте питон, чтобы программировать на нем как на питоне, а не вот так вот. Успехов.
    Ответ написан
    4 комментария
  • Как обойти блокировки сайтов?

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

    Не факт, конечно, что там именно такая параноидальная и замороченная система, но такое определённо имеет смысл, если надо предотвратить долбёжку и не целевое использование АПИ.

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

    Ещё вы рандомизируете юзер-агент, но возможно имеет смысл притвориться браузером и не скакать по юзер-агентам так уж часто, тем более по рандомным.
    Сопоставить запросы между собой можно и при разных адресах, а выходные адреса тора, как вам уже сказали в комментарии к вопросу, немногочисленны и всем известны.
    Ответ написан
  • Как мне отсортировать список в питоне?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    float(k.get('money', 0))
    Ответ написан
    Комментировать
  • Как мне применить список из функции в другой функции?

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

    А бесплатных курсов и репетиторов тут нет.
    Ответ написан
    2 комментария
  • Как подгрузить файл JSON в python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Есть ещё один способ загружать неформатные файлы, похожие на json.
    Дело в том, что любой json файл представляет собой валидный yaml-файл.
    Но yaml гораздо боле гибкий формат, который "проглатывает" и ключи без кавычек, и трейлинговые запятые.
    Можно много спорить по поводу безопасности и корректности использования yaml для парсинга невалидных json, но иногда просто нет выхода и нужно обрабатывать огромное количество таких уже имеющихся файлов.
    import yaml
    with open('test.json', encoding='utf-8') as f:
        data = yaml.load(f, yaml.CSafeLoader)
    Ответ написан
    Комментировать
  • Как реализовать функционал отмены последних изменений в определенных CRUD эндпоинтах с использованием FastAPI?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Всё правильно, так и надо делать. Никаких специальных технологий не существует. Просто реализуете эндпоинт, который будет управлять откатом на нужное число действий, журнал действий и механизм, который будет возвращать состояние на момент той илииной записи в журнале.
    Никакой специфики, связанной с применением FastAPI тут нет.
    Ответ написан
    3 комментария
  • Python как быстро получить число элементов архива tar.gz?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Не получится из-за специфики устройства tar-файла. Пока весь не прочитаешь, не узнаешь сколько в нём каталогов. Это потоковый формат, а тут он ещё и сжат сверху gzip'ом.

    Это как посчитать быстро сколько вещей в чемодане. Пока по одной не вытащишь и каждую не посчитаешь - не узнаешь.
    У других архиваторов, например zip, есть индексная табличка. Это как бумажка с перечнем всех вещей в чемодане. Она лежит прямо под крышкой и её можно достать первой.

    Придётся как-то обходить эту проблему. Например использовать другой формат архива, или еред архивацией делать отдельный файл с перечнем всех файлов, и его класть в архив первым. А может быть вам и не нужно на самом деле количество элементов в архиве,а того, что вы этим количеством хотите добиться можно достичь иначе.
    Ответ написан
    2 комментария
  • Стоит ли мне знать как работает cmd для Python?

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

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

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Странные ответы тут приводят.
    import random
    lst = list(range(1, 5+1))
    random.shuffle(lst)

    Так у вас в списке будет случайно перемешанная последовательность.
    Но у вас есть требование (не знаю насколько оно осозанное), чтобы это была непременно функция.
    Надо понимать, что такая функция не будет чистой. Она должна выдать конечное количество разных значений и её придётся вернуть исключение, если от нее потребуют больше очерендым вызовом. Сделать это можно с помощью генератора.
    def make_shuffled_gen(a, b):
        lst = list(range(a, b + 1))
        random.shuffle(lst)
        yield from lst
    
    shuffled_getter = make_shuffled_gen(1, 5).__next__


    Ну или одним выстрелом:
    def make_shuffled_getter(a, b):
        lst = list(range(a, b + 1))
        random.shuffle(lst)
        return iter(lst).__next__
    
    shuffled_getter = make_shuffled_getter(1, 5)
    Ответ написан
    3 комментария
  • Как найти и изменить текст в pdf файле?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Как найти и изменить текст в pdf файле?

    В общем случае никак. PDF может содержать просто картинки с отсканированными страницами, может содержать векторные рисуночки букв вместо струткурного текста, может содержать просто набор кривых, составляющих буквы, причем они не будут даже сгруппированы в отдельные символы или строки.
    Если вам повезло и конкретно ваши прайсы подготовлены так, что внутри сохранилась информация с текстом для текстового поиска, то это не значит, что заменив этот текст в бинарном файле у вас что-то изменится. или хотя бы не поломается в отображении документа. А ещё pdf может быть защищен, зашифрован, подписан ЭЦП, обфусцирован для извлечения данных...

    Единственное более-менее работающее решение - это распознать текст любым инструментом OCR, отобразить его на виртуальном холсте и нарисовать сверху заплатки с новым текстом, если новый текст вообще поместится поверх старого.
    Потом снова печатаем холст в PDF. Это страшный геморрой и лучге брать исходный документ и менть текст в нём, как вам уже предложили в комментариях.

    Проще сверстать документ заново, чем, в общем случае, редактировать что-то в PDF.
    Ответ написан
    Комментировать
  • Как переименовать файлы?

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

    Если у вас с питоном беда, то можете всё это проделать в экселе.
    Вам нужно выгрузить листинг каталога в файл, вставить его в столбец экселя, формулами обработать и в отдельном столбце получить команду для переименовывания. Потом этот столбец копируете и сохарняете его текст как *.bat-файл, или shell, если другая операционка.

    Если у вас есть мультикурсорный редактор типа сублайма, Атома, Notepad++, или любой IDE, то вы можно в списке файлов размножить курсоры на каждую строку и проделать все необходимые операции над всеми строками сразу. Получите на выходе тоже пакетный файл для переименования.

    Ещё можно поставить FarManager, сейчас он стал вообще кроссплатформенным. Там можно записываь клавиатурные макросы. Делаете одно переименоание под запись, а потом вешаете записанны ймакрос на клавишу и обрабатываете все файлы быстроенько.

    А ещё можно к фрилансерам сходить, если задача на один раз. Просто за тем, чтобы вам решили одноразовую задачу сюда ходить не принято. Тем более плюя на принятые правила на ресурсе и не оформляя правильно код, чтобы у люде йне вытекали глаза глядя на код без форматирования.

    Выбирайте решение на любой вкус.

    Ну ок, на питоне вам стоит каждое имя файла сплитнуть по символу "-", а потом, перебрав все элементы получившегося списка, дополнить нулями те, что состят только из цифр (метод isdigit).
    У строки есть метод zfill, который умеет это делать до нужной длины слева.
    Ответ написан
    Комментировать
  • Таблица умножения, python. Ошибка?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Так вот же вы используете не звёздочку, а крестик:
    print ('{} x {} = {}'.format( i, j, i*j), end='\t' + '\n')

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А вы пробовали читать текст ошибки?
    Вот смотрите, тут указано в какой строке и конкретно где в этой строке ошибка. А ниже написано в чем заключается ошибка.
    File "C:\Users\Никита\Documents\#программа для расчёта оценок.py", line 50, in
    a = ProgrammForTest()
    ^^^^^^^^^^^^^^^^^
    TypeError: ProgrammForTest.__init__() missing 4 required positional arguments: 'a', 'b', 'c', and 'ball'

    Вот вонкретное пояснение: "missing 4 required positional arguments: 'a', 'b', 'c', and 'ball'"

    Мне кажется вам следует взять любую книгу по питону с нуля и пееречитать ее внимательно.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В питоне есть стандартный модуль под названием configparser.
    По нему всё хорошо расписано с примерами в документации.
    Вместо того, чтобы городить какие-то городушки с датаклассами. можно просто прочитать все необходимые параметры из обычного конфигурационного файла.
    Вот есть статья на Хабре с вариантами на любой вкус: https://habr.com/ru/articles/485236/
    Ищется за три секунды, не понимаю почему вы не поискали прежде чем спрашивать.
    Ответ написан
    Комментировать
  • Проблемы с подключением двух разных ПК. Как сделать правильно?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Это внешний IP ертелекома в екатеринбурге. Автор вопроса, похоже, за NAT и пытается по внешнему ip вот так сокетом пробиться через nat.
    Так не получится. Ну или у него белый адрес, но роутер не пробрасывает внешние коннекты на его комп.
    В общем, автору следовало бы указать сетевой адрес локального интерфейса при подключении.
    ipconfig что показывает? (ifconfig для линукс)
    Ответ написан
    5 комментариев
  • Как объединить файл python и презентацию pptx?

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

    Объясните своему заказчику, что если его благополучие и бизнес зависят от того, насколько быстро распиратится информация, которую он продает в своей презентации, то его песенка спета. Пусть придумывает другой способ монетизации.

    Огромное количество курсов и практикумов вынуждены тратить немасштабируемые человеческие ресурсы на живые лекции и трансляции, чтобы снизить скорость утечки материалов и понизить стоимость утёкших материалов без пояснений и инетрактива со стороны препода\лектора\организаторов.
    Если кому-то бдет полезен контент вашей презентации, то он будет похищен мгновенно, а все ваши кустарные способы их защитить будут практически бесполезны и дороги. Вполне вероятно. что они окажутся многократно дороже в реализации, чем защиаемый контент. Это ы ничего с учетом возможного фактора масштабирования, но ввиду практически полной бесполезности такой защиты...
    Ответ написан
    Комментировать
  • Как ускорить метод users.get?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вся проблема у вас из-за того, что вы тут делаете много http-запросов к API. Это в любом случае будет не быстро.
    Вам нужно изучить API на предмет bulk-запросов, когда вы извлекаете сразу много записей одним http-запросом к API.
    На сколько я понимаю, друзей может быть очень много, а вы идёте в глубину на два яруса, что имеет квадратичную сложность. То есть если у всех в среднем 10 друзей, то вы сделаете по десять запросов на каждого из десяти дррузей, что очень долго - 100 запросов!

    Для начала вы можете кэшировать полученные от API данные, чтобы повторно не получать одни и те же, если есть общие друзья. Нужно найти bulk-методы в API и правильно их использовать (если они есть).

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

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

    В первой части кода где вычисляется x цикл собирает имена файлов в локальной файловой системе компьютера, на котором выполняется код. Видимо на той машине, на которую предназначалась атака в ФС есть каталог /neroot какими-то данными.

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

    Чтобы распутать этот клубок надо разить код на части (этапы) и анализировать их отдельно подавая на вход правдоподобные данные.

    Там альше видно код. который вычитывает содержимое файлов каталога /neroot и складывает это содержимое в словарь.
    Весь вот этот запутанный код со здвигами призван зашифровать адрес сайта, куда отправляется json с данными из тех файлов.
    Вот этот код расшифровки вы можете выковырять и запустить отдельно, чтобы расшифровать.
    Но без знания языка у вас не получится.
    Ответ написан
    Комментировать