Ответы пользователя по тегу Python
  • Какой бесплатный хостинг использовать для закачки файлов? И как это сделать?

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

    Где мне взять прямую ссылку

    Все файлохранилки разные и в большинстве своём они не хотят, чтобы их использовали для массового распространения файлов. Именно поэтому большинство из них неохотно позволяет или не позволяет вовсе формировать прямую ссылку на скачивание файлов.
    Яндекс диск, дроп-бокс, гугл-драйв - все они предоставляют вам услугу "как бы" бесплатно, но как мы знаем, если что-то вам достаётся бесплатно, то товар на самом деле это вы, ваш контент, ваша статистика, ваш кошелёк и ваше внимание (реклама). Бесплатный сыр знаете где бывает.
    Конечно всем этим хранилкам не интересно, чтобы через них на огромную аудиторию раздавали варез, порнуху, нелицензионный контент, запрещенный контент и прочее. А это неизбежно, если будет возможность сформировать постоянную прямую ссылку и дать её скачивать неопределенному кругу лиц без авторизации.

    Хостинг - это другое. Они берут деньги за возможность опубликовать что-то в сети. Там можно получить и постоянные ссылки, и белые IP, и хорошую скорость, и приемлемые лимиты по трафику.

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

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

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

    Задавайте вопросы правильно, конкретизируйте и описывайте что вам действительно надо, а не то, как вы думаете устроен этот мир.
    Ответ написан
    Комментировать
  • Как правильно передать .wav клиенту используя socket?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Звук в этом формате - бинарные данные. Нельзя с ними работать как с текстом.
    Вы же открываете файл в текстовом режиме. Не надо так. Открывайте в бинарном, не декодируйте. Отправляйте как байты. Принимайте тоже как байты.
    К примеру символы абзацев могут быть проинтерпретированы неправильно и заменены, от этого съедут куски данных, сломается выравнивание.
    Я не понял. вы на сокетах имитируете часть http-проткокола. Зачем? Отправляйте либо с сокета на сокет в чистом виде, либо поднимите тривиальный сервер на flask и овспользуйтесь requests, чтобы не изобретать дендро-фекальный велосипед.
    Ответ написан
    Комментировать
  • Как создать сайт, чтобы в нем можно было программировать на python?

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

    1. Гуглите "python sandbox".
    2. Конкретизируйте задачу. Какой код вы хотитезапускать, хотите ли подключать сторонние библиотеки, а бинарные библиотеки?
    Ответ написан
    3 комментария
  • Как решить проблему с условием вывода и регулярными выражениями в Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    1)
    Попытки убрать блок else, либо заменить "Нет вхождения" на pass или None - выдают ошибку.

    a if q else b - это тернарный оператор. У него три аргумента (a, b, q) и результатом будет a или b в зависимости от истинности q.
    pass там по синтаксису не подойдёт, поскольку это не значение, а ключевое слово.
    Вам нужно вычислить выражение и результатом должно быть что-то что можно передать в print(). Если по else вы укажете пустую строку "", то print её напечатает. Не знаю устроит ли вас пустой абзац в консоли. Если нет, то смотрите решение, предложенное выше.

    2) в предыдущем решении вы могли не заметить, но регекспы соединены через "|". Это сработает не для всех регекспов. Нужно быть осторожнее с такой конкатенацией. Вообще с регекспами надо поосторожнее. В большой силе большая ответственность.
    Можно сделать цикл и поискать каждый регексп по отдельности. Так вам проще сохранить контроль над тем, что именно вы нашли и как на это реагировать.
    Ответ написан
    1 комментарий
  • Как посчитать суммы в списке словарей?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вот решение попроще.
    from collections import Counter
    a = [{'id': '1', 'qty': 6}, {'id': '2', 'qty': 1}, {'id': '1', 'qty': 1}, {'id': '2', 'qty': 1}, {'id': '3', 'qty': 10}, {'id': '1', 'qty': 1}]
    c = sum((Counter({d['id']: d['qty']}) for d in a), Counter())
    result = [dict(id=k, qty=v) for k, v in c.items()]

    UPD: Дополнил решение, чтобы строго соответствовать формату результата.
    Ответ написан
    24 комментария
  • Как проложить путь в Python 3.8.2 к C:\Users\"ИМЯ ПОЛЬЗОВАТЕЛЯ"\Documents?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    import os
    os.path.expanduser('~/my/path/from/home')

    Но лучше использовать pathlib
    from pathlib import Path
    p = Path('~/my/folder').expanduser()  # PosixPath('/home/svp/my/folder')

    У вас, конечно, будет не posix
    from pathlib import Path
    p = Path('~/Documents/Rockstar Games/GTA V/User Music/gta.mp3').expanduser()
    Ответ написан
  • Пример, "filters": ["filter_dep","throttle"]. Может ли один handler (или один logger) использовать несколько фильтров?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Технически оба класса: Logger и Handler являются потомками Filterer.
    Загляните в исходники.

    class Filterer(object):
        """
        A base class for loggers and handlers which allows them to share
        common code.
        """
        def __init__(self):
            """
            Initialize the list of filters to be an empty list.
            """
            self.filters = []
    
        def addFilter(self, filter):
            """
            Add the specified filter to this handler.
            """
            if not (filter in self.filters):
                self.filters.append(filter)
    # ...


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

    def filter(self, record):
            """
            Determine if a record is loggable by consulting all the filters.
    
            The default is to allow the record to be logged; any filter can veto
            this and the record is then dropped. Returns a zero value if a record
            is to be dropped, else non-zero.
    
            .. versionchanged:: 3.2
    
               Allow filters to be just callables.
            """
            rv = True
            for f in self.filters:
                if hasattr(f, 'filter'):
                    result = f.filter(record)
                else:
                    result = f(record) # assume callable - will raise if not
                if not result:
                    rv = False
                    break
            return rv

    То есть фильтры работают через логическое "И".
    Ну и да, может.
    Ответ написан
    Комментировать
  • Поиск, удаление и замена строки из кортежа в списке, как реализовать?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    from itertools import repeat
    d = {}
    for x in [('a', 'd', 'z', 'x'), ('b', 'e ', 'k', 'l'), ('b', 'e', 'm', 'n'), ('c', 'f', 'g', 'h'), ('c', 'f', 'y', 'w')]:
        d.setdefault(x[:2], {}).update(zip(x, repeat(None)))
    print([list(v.keys()) for v in d.values()])

    Но у вас во втором кортеже пробел около "e" и, строго говоря, ваше решение неверно.
    Либо пробел уберите, либо можно стрипнуть ключи заменив x[:2] на tuple(map(str.strip, x[:2]))
    Тут не использованы множества, чтобы не терять порядок элементов.
    Ответ написан
    Комментировать
  • Как скачать файл по непрямой ссылке?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Комментировать
  • ЯндексПрактикум, почему бот не видит вложенную функцию?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Функция в питоне - это объект первого рода.
    В питоне всё - объекты. И функция и число и строка и список и словарь и класс и экземпляр класса.
    У каждого объекта может быть много имён. Рассматривайте имя объекта, как ярлычок, привязанный к чайному пакетику.
    print_friends_count(count)
    Здесь print_friends_count это имя переменной, а скобочки после него заставляют вызывать объект, доступный пр этому имени как функцию. Вызов происходит с передачей единственного аргумента, который доступен по имени count.

    Если в коде на питоне в каком-то выражении (а вызов функции - это выражение; результат вызова - это всегда какое-то значение, например None; да, None - это тоже объект, его возвращает функция по умолчанию) встречается какое-то имя, то это имя ищется в локальной области видимости этой функции (то есть в самой функции), потом в той области видимости, где объявлена функция, потом еще выше и так далее до самого модуля. Самая верхняя - глобальная область видимости - это модуль. Если имя не нашлось нигде, даже в модуле, то оно поищется среди __builtins__ - это такой словарик с именами и объектами, доступными везде. Если не найдётся и там, то будет ошибка.
    В вашем случае функцию следовало оставить на уровне модуля. Вызвать ее можно будет где угодно внутри модуля, но при условии, что оператор объявления функции уже выполнен.

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

    Мне кажется вам стоит скачать книжку Лутца про изучение питона с нуля и вдумчиво прочитать. По порядку.
    Ответ написан
    1 комментарий
  • Косячок с QR кодом, сделанным в Python при отправке в Telegram. Как исправить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    JPEG не нужен.
    Отмасштабируйте png с помощью PIL (Pillow)
    Ответ написан
  • Какие варианты слияния списков есть?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    a = [x or y for x, y in zip(a, b)]
    Ответ написан
    Комментировать
  • Как убрать лесенку после Image.rotate()?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    resample=Image.BICUBIC, expand=True
    Всегда лучше поворачивать большое изображение, а потом уменьшать, чем наоборот, поворачивать маленькое, а потом увеличивать.
    Ответ написан
    5 комментариев
  • Как вычислить время, которое идёт матч?

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

    Так вы делайте немного по-другому и будет работать лучше.
    Ответ написан
    2 комментария
  • Можно ли на языке Python написать программку живой баланс интернета на рабочем столе Win 7, 10?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Посмотрите в сторону PyQt.
    Вот вопрос на стек-оверфлоу про систем трей: https://stackoverflow.com/questions/893984/pyqt-sh...
    Да, черт возьми, тема без проблем ищется с миллионом работающих примеров. Почему вы вообще решили сначала задавать вопрос, прежде чем гуглить?
    Примеров сети полно. Не понятно что вам не понятно. Если не ясно как вообще программировать, то пройдите онлайн курсы, посмотрите релевантные видео-уроки в ютубе, закажите релевантную книжку и почитайте на досуге.
    Ответ написан
    Комментировать
  • Как отправлять сообщение пользователю в Telegram через бота?

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

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

    Короче, плохая идея. Не делайте так.
    Сделайте лучше что-то полезное и люди сами к вам придут.
    Ответ написан
    Комментировать
  • Как узнать характеристики компьютера python?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Можно и без питона, если у вас есть curl и jq:
    curl https://jsonplaceholder.typicode.com/todos | jq '.[].id'

    Или всё же с питоном:
    curl https://jsonplaceholder.typicode.com/todos | py '(o["id"] for o in json.loads(sys.stdin.read()))'
    Ответ написан
    Комментировать
  • Как проверить наличие элемента с индексом в списке?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ну во-первых, это не список, а кортеж: test = (1,2,3)
    Во-вторых... а в чем проблема собственно? len(test) > 2
    Ещё можно вот так поступить, особенно если вам нужен потом будет этот второй элемент:
    test = (1,2,3)
    second = test[2:3]
    second = second[0] if second else None

    Но надо стараться делать максимально просто и читабельно.
    Ответ написан
    1 комментарий