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

    @nirvimel
    Вот функция, которая проверяет, что в состав строки не входит ничего кроме цифр и знака +
    import re
    
    digits = re.compile(r'^[\d\+]+$')
    
    def is_string_valid(string):
        return bool(digits.match(string))
    Ответ написан
    3 комментария
  • Как узнать информацию о железе?

    @nirvimel
    1. py-cpuinfo
    2. psutil
    3. Еще можно заглянуть в исходники python-hwinfo и достать оттуда нужный функционал.
    Ответ написан
    Комментировать
  • Как решить проблему с использованием сокетов в python?

    @nirvimel
    Я понял в чем суть проблемы только по одному описанию, еще не успев заглянуть в код (редко такое происходит). Вы понимаете в чем смысл единственного параметра у recv? Для чего вы передаете туда константу 1024? Это объем в байтах, который читается из сокета за один вызов. Сокет - это не очередь передаваемых пакетов, а поток байт, который наполняется с одной стороны через send и вычерпывается с другой через recv (флаг socket.SOCK_STREAM символизирует это). Если в некоторых случаях recv возвращает в точности тот же пакет фрагмент данных, который был передан за один вызов send, то только потому, что в потоке в этот момент нет других данных.
    Следовательно, если логика вашего клиент-сервера подразумевает обмен пакетами, то всю разбивку на пакеты вы должны реализовывать самостоятельно. Например, в заголовке каждого пакета передавать его длину, а после прочтения этого заголовка, читать из сокета ровно заданное количество байт.
    Все это издержки работы с голым TCP. Для решения как раз этих проблем и существуют специальные пакетные протоколы и библиотеки для работы с ними. Можете попробовать, например, ZeroMQ (через PyZMQ), если вас интересует именно обмен пакетами ( то есть "сообщениями" в терминах ZeroMQ) и нет желания писать этот велосипед самостоятельно.
    Ответ написан
    Комментировать
  • Получение почты + небольшой backend + небольшое API: чего использовать?

    @nirvimel
    Twisted, Tornado

    Ничего из этого. Поясню: Во-первых, у обоих собственные нестандартные реализации IMAP (к Tornado в принципе возможно прикрутить стандартную), это было бы не критично, если бы не прекрасные варианты обойтись стандартной imaplib/IMAPClient. Во-вторых, сами фреймворки: Twisted уже несколько outdated, интерес к нему постепенно угасает, Tornado вроде еще держится за счет своих фанатов, но он тоже слишком специфичен и на данный момент почти не дает уникальных преимуществ (на момент начала его разработки его преимущества были довольно уникальны).

    Для любых задач с асинхронным вводом/выводом я советую выбирать из (в порядке приоритета):
    1. Asyncio (python >= 3.4).
    2. Gevent.
    3. Стандартные потоки threading. Их минус в том, что не все I/O вызовы отпускают GIL на время исполнения (особенно это касается python 2), для каждой конкретной задачи приходится писать собственный бенчмарк, чтобы доказать/опровергнуть реальную асинхронность и эквивалентность (в плане производительности) эталонной реализации, например, на gevent.
    Ответ написан
    1 комментарий
  • Как сделать парсер на python учитывая что переход по страницам осуществяется на javascript?

    @nirvimel
    В данном случае достаточно установить печенку AmListSearch в значение PageNumber=N, запросить станицу по этому же адресу и получить в ответе список, открытый сразу со страницы N.
    Например:
    $ curl --cookie "AmListSearch=PageNumber=12" https://bankrot.fedresurs.ru/ArbitrManagersList.aspx > bankrot.html
    $ firefox bankrot.html

    А вообще, в подобных случаях следует действовать по примерно такому алгоритму:
    1. Через FireBug (или встроенную панель разработчика Tools->Web_Developer->Network) отловить исходящий HTTP-запрос на действие, вызывающее подгрузку AJAX-контента.
    2. Определить через какой параметр передается переменная (номер страницы, например). Это может оказаться не только параметр GET-запроса, но и поле POST-формы, или печенка, или даже произвольный кастомный HTTP-заголовок.
    3. Определить формат и структуру ответа. Это может быть произвольный HTML-фрагмент (чаще всего), или целый HTML-документ, или XML, или JSON (самый правильныйЪ вариант с точки зрения разработки), или вообще произвольный текстовый формат, который парсится скриптом после получения (именно такой бредовый формат имеем в данном случае, я даже не стал его разглядывать, сразу попробовал обходные пути и нашел же один).
    4. Написать скрипт, который формирует запросы, подобные тем, что уходят со страницы, и парсит ответы.
    Ответ написан
    1 комментарий
  • Можно ли удалить файла лога logging?

    @nirvimel
    Зависит от ОС. На Linux удаляемый файл, открытый на запись в другом процессе, физически не удаляется, а только перестает быть виден, но через открытый дескриптор продолжает писаться (и даже читаться! при наличии флага "r"). На Windows все зависит от эксклюзивной блокировки при открытии на запись: при ее наличии будет отказ при удалении, при ее отсутствии удаление пройдет успешно, дескриптор, открытый на запись, станет невалидным и все последующие операции на нем будут давать отказ (кидать исключение).
    Ответ написан
    Комментировать
  • Каким способом сделать свой графический векторный редактор?

    @nirvimel
    легко будет сделать такое из программ с открытым кодом: Inkscape, Sk2.0, Skensil?

    Нет.
    Гораздо легче будет написать консольный скрипт, который берет на вход файл с картинкой в векторном формате, предварительно подготовленной в профессиональном редакторе, при помощи поворотов и отражений, делает из нее снежинку, и сохраняет результат в выходной файл.
    Ответ написан
    4 комментария
  • Правильно ли я понимаю базовый алгоритм деплоя?

    @nirvimel
    1) На DO я как бы арендую себе комп, который будет моим сервером, верно? Потом устанавливаю туда, скажем, nginx, и трачу пару ночей и кучу нервов на настройку.

    Да.
    VPS - Это, с одной стороны, что-то вроде виртуальной машины, кучу которых можно запускать/останавливать на одной физической. С другой стороны, все, что говорят про более низкую производительно ОС в виртуальной машине (по сравнению с ОС на живом железе), это практически не относится к VPS (причина - разные принципы виртуализации).

    2) Нужно будет скинуть на сервер исходники моего проекта, например, посредством клонирования репозитория с github'а. И зависимости установить + со статикой разобраться. Статику сам nginx должен раздавать, а не django (использую этот фреймворк), тк это эффективнее.

    При разработке на интерпретируемом языке это неизбежно.

    3) Этот сервер будет иметь IP-адрес, через который он будет доступен для 'внешнего мира', и можно будет этот IP привязать к купленному домену.

    Да.

    4) Для связи с сервером лучше иметь Линукс на локальной машине.

    Управление сервером идет по SSH. ОС на локальной машине может быть любая. Из-под Windows, например, можно работать через PuTTy.
    Ответ написан
    2 комментария
  • Странное поведение встроенной функции. Не правда ли?

    @nirvimel
    В документации реализация этих функций записана в императивном стиле видимо для наглядности (ИМХО, наглядность довольно спорная). Можно попробовать записать их в функциональном стиле - это не сложно (напомню, что all - это конъюнкция всех элементов списка/итератора, приведенных к логическому типу, а any - соответственно, дизъюнкция).
    import operator
    
    all = lambda xs: reduce(operator.__and__, map(bool, xs), True)
    any = lambda xs: reduce(operator.__or__, map(bool, xs), False)

    При такой записи сразу становятся очевидны причины соответствующего поведения на пустых списках.
    Ответ написан
    Комментировать
  • Как правильно подключит .ui файл к Python?

    @nirvimel
    Я пользуюсь pyuic4. Во всех рекомендациях пишут тоже в основном про этот метод. Про возможность прямого подключения *.ui слышал только в одном месте.
    Ответ написан
    1 комментарий
  • Как проверять загрузку файла по ссылке?

    @nirvimel
    В числе заголовков HTTP ответа есть Content-Type, который принимает значение одного из MIME-типов. Значение text/html соответствует HTML-странице, а значение application/octet-stream соответствует загружаемому файлу.
    import requests
    
    if __name__ == "__main__":
        r = requests.get('https://toster.ru/q/303883')
        r.raise_for_status()
        mime_type = r.headers['content-type']
        if mime_type == 'application/octet-stream':
            print('It is a binary file')
        if mime_type.startswith('text/'):
            print('It is a text')
    Ответ написан
    Комментировать
  • Как запаковать папку с файлами с помощью BitesIO в Python?

    @nirvimel
    import os
    import io
    import zipfile
    
    
    def zip_directory_into_bytes(path):
        bio = io.BytesIO()
        with zipfile.ZipFile(bio, mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
            abs_path = os.path.abspath(path)
            for dir_name, sub_dirs, files in os.walk(path):
                for filename in files:
                    abs_name = os.path.abspath(os.path.join(dir_name, filename))
                    file_name = abs_name[len(abs_path) + 1:]
                    zf.write(abs_name, file_name)
        return bio.getvalue()
    
    
    if __name__ == "__main__":
        with open('test.zip', 'wb') as f:
            f.write(zip_directory_into_bytes('.'))
    Ответ написан
    Комментировать
  • Какие потоки есть в питоне?

    @nirvimel
    Потоки, создаваемые при помощи threading (и его низкоуровневой базы thread) являются настоящими полноценными потоками ОС (как в C/C++ и большинстве языков). Но в каждом процессе интерпретатора существует одна глобальная блокировка GIL, разделяемая между всеми потоками. Большинство инструкций Python (доступ ко всем объектам, глобальным переменным и вызов функций и методов) требуют захвата GIL. Так как единственный GIL в каждый конкретный момент может быть захвачен только одним потоком, следовательно только один, захвативший GIL, поток может исполняться в один момент времени. Следовательно о распараллеливании вычислений на чистом Python (без ухищрений) можно забыть. Это убивает большую часть преимуществ многопоточности, но не все. Например, многие функции дискового и сетевого ввода/вывода освобождают GIL во время ожидания окончания операции (доступ к Python-объектам внутри интерпретатора в этот момент не требуется), что позволяет другим потокам захватывать GIL. Следовательно, GIL не мешает распараллеливанию ввода/вывода.
    Ответ написан
    3 комментария
  • Почему не работает нормально цикл for?

    @nirvimel
    import random 
    
    WORDS =('питон', 'анаграмма', 'простая', 'сложная', 'ответ', 'подстаканник')
    word = random.choice(WORDS)
    dor = input('Назовите вашу букву: ')
    print('Да' if dor[0] in word else 'Нет')
    Ответ написан
    2 комментария
  • Как проверить доступность сайта с помощю Python?

    @nirvimel
    В requests при совершении запроса по-умолчанию сходу читаются только HTTP-заголовки ответа, а у тела ответа "ленивая" загрузка, то есть оно не начнет загружаться (и не процесс не останавливается в ожидании) до тех пор, пока не будет прямого обращения к свойствам text или content. Если смотреть только заголовки и не обращаться к телу, то размер HTML-страницы не будет влиять на скорость опроса адреса на доступность.
    Ответ написан
    Комментировать
  • Чем сконвертировать картинку в формат bmp565 на Python?

    @nirvimel
    Мой вариант:
    from PIL import Image
    import numpy
    
    
    def get_rgb565_bytes_from_image(filename):
        rgb888 = numpy.asarray(Image.open(filename))
        # check that image have 3 color components, each of 8 bits
        assert rgb888.shape[-1] == 3 and rgb888.dtype == numpy.uint8
        r5 = (rgb888[..., 0] >> 3 & 0x1f).astype(numpy.uint16)
        g6 = (rgb888[..., 1] >> 2 & 0x3f).astype(numpy.uint16)
        b5 = (rgb888[..., 2] >> 3 & 0x1f).astype(numpy.uint16)
        rgb565 = r5 << 11 | g6 << 5 | b5
        return rgb565.tobytes()
    Ответ написан
  • Как вызвать функцию на основе двух функций?

    @nirvimel
    x1, x2 = getarray1(), getarray2()
    x3 = getarray3(x1, x2)
    buildgraph(x1, x3)
    Ответ написан
    Комментировать
  • Как вывести индекс определённого значения в многомерном массиве в Python?

    @nirvimel
    1. У массива numpy нет метода index().
    2. Вывести все индексы всех ненулевых элементов grid1:
    import numpy
    
    
    def print_all_non_zero_values(arg):
        print ((numpy.array(arg) > 0).astype(numpy.intc))

    3. Подсчет ненулевых соседей:
    import numpy
    
    
    def count_neighbours(source):
        grid1 = numpy.array(source) > 0
        x_size, y_size = grid1.shape
        grid2 = numpy.zeros((x_size + 2, y_size + 2), dtype=numpy.intc)
        grid2[ :-2,  :-2] += grid1
        grid2[1:-1,  :-2] += grid1
        grid2[2:  ,  :-2] += grid1
        grid2[ :-2, 1:-1] += grid1
        grid2[1:-1, 1:-1] += grid1
        grid2[2:  , 1:-1] += grid1
        grid2[ :-2, 2:  ] += grid1
        grid2[1:-1, 2:  ] += grid1
        grid2[2:  , 2:  ] += grid1
        return (grid2[1:-1, 1:-1] - 1) * grid1

    Тест:
    count_neighbours(((0, 0, 1, 0),
                      (0, 1, 1, 0),
                      (0, 1, 1, 0),
                      (0, 1, 0, 0),))

    Результат:
    array([[0, 0, 2, 0],
           [0, 4, 4, 0],
           [0, 4, 4, 0],
           [0, 2, 0, 0]], dtype=int32)
    Ответ написан