Задать вопрос
  • Почему не работает перенаправление вывода в файл (subprocess Python)?

    Vindicar
    @Vindicar
    RTFM!
    (перехватывать вывод в subprocess.PIPE, а после записывать это в файл)

    Просто укажи в качестве stdout и stderr открытые на запись файловые объекты, Popen() сделает всё остальное.
    Кода буквально две строчки, а бонусом нормальные исключения при ошибке доступа, плюс можно использовать tempfile.NamedTemporaryFile(), если файлы должны быть временными, а не постоянными.
    Ответ написан
    3 комментария
  • Бот не отправляет переменные?

    Vindicar
    @Vindicar
    RTFM!
    'Карта: " + str(a) + " " + str(b) + " " + str(c) + " " + str(d) +"\nCVV: " + str(e))'

    У тебя внешние кавычки одни, а внутренние другие. Так что весь этот фрагмент - одна строковая константа, а двойные кавычки внутри - просто символы.
    К слову, научись использовать f-строки.
    f"Карта: {a} {b} {c} {d}\nCVV: {e}"
    Ответ написан
    Комментировать
  • Как сократить данную строчку?

    Vindicar
    @Vindicar
    RTFM!
    Еще один товарищ, который считает, что a == 2 or 3 означает "(а равно 2) или (а равно 3)".
    Тогда как на самом деле это "(а равно 2) или (3 != 0)", что всегда равно "истина", независимо от значения a.

    Вот честно, откуда вы все берёте эту идею? Ни на каком другом Q&A сайте я такого не видел.

    Правильно будет или a == 2 or a == 3, или a in (2, 3)
    Ответ написан
    2 комментария
  • Как сделать чтобы он рисовал один прямоугольник до отпускания, а не рисовал кучу?

    Vindicar
    @Vindicar
    RTFM!
    Еще один шикарный пример вопроса не по теме. В заголвоке вопроса лаги, а по делу
    Как сделать чтобы он рисовал один прямоугольник до отпускания, а не рисовал кучу?


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

    Тебе нужно делать копию оригинального изображения, рисовать на ней, и показывать эту изменённую копию.
    import cv2
    import sys
    import matplotlib.pyplot as plt
    original = cv2.imread(sys.argv[1])
    ix = -1
    iy = -1
    drawing = False
    
    def draw_reactangle_with_drag(event, x, y, flags, param):
        global ix, iy, drawing, original
        if event == cv2.EVENT_LBUTTONDOWN:
            drawing = True
            ix = x
            iy = y
        elif event == cv2.EVENT_MOUSEMOVE:
            if drawing == True:
                img = original.copy()
                cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
                cv2.imshow("Title of Popup Window", img)
        elif event == cv2.EVENT_LBUTTONUP:
            drawing = False
            img = original.copy()
            cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
            print(ix, iy, x, y)
            cv2.imshow("Title of Popup Window", img)
    
    cv2.namedWindow(winname= "Title of Popup Window")
    cv2.setMouseCallback("Title of Popup Window", draw_reactangle_with_drag)
    cv2.imshow("Title of Popup Window", original)
    while True:
        if cv2.waitKey(10) == 27:
            break
    cv2.destroyAllWindows()


    А вообще, если ты хочешь сделать выделение области рамкой, cv2.selectROI() в помощь.
    Ответ написан
    3 комментария
  • Стакаются ли sqlite и тг бот?

    Vindicar
    @Vindicar
    RTFM!
    1. Что значит "одновременного вноса"? sqlite не потокобезопасна, но если ты используешь асинхронную библиотеку для телеги с дефолтной реализацией event loop, то у тебя никогда не будут выполняться 2 обработчика одновременно. Дефолтная реализация строго однопоточна, и проблем с sqlite не будет.
    2. 500 человек - это не мера нагрузки. Самая примитивная мера нагрузки - обращений к базе в единицу времени.
    А вообще более точно было бы проводить измерение времени выполнения разных частей обработчика события. Если бот потребляет значительную долю ресурсов своего хостинга и при этом проводит много времени обращаясь к БД - вот тогда стоит задуматься о смене БД. И даже тогда можно сначала посмотреть в сторону aiosqlite, чтобы не тормозить всего бота, пока запрос к БД выполняется.
    Ответ написан
    Комментировать
  • Каким образом посчитать большое кол-во чисел после запятой?

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

    Vindicar
    @Vindicar
    RTFM!
    1. Научить бота получать список доступных URL изображений (в виде БД или списка)
    2. Научить бота выбирать случайное изображение из списка
    3. Научить бота отдавать URL

    Ну или если не хочется светить URL пользователю
    3. Научить бота скачивать изображение по URL
    4. Научить бота пересылать скачанное изображение как вложение

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

    Vindicar
    @Vindicar
    RTFM!
    Ну простейший вариант:
    # типы данных. Они могут быть классами, или описаниями вида typing.Tuple[int, str]
    # так как ты не описал типы данных, я пишу тут заглушки typing.Any (т.е. что угодно)
    # эти типы лучше описать в отдельном файле, который будет импортироваться остальными
    Snaphot = typing.Any
    PreparedSnapshot = typing.Any
    SnapshotResult = typing.Any
    
    # функции обработки. они могу быть раскиданы по отдельным файлам, 
    # но они должны импортить нужные модули, в т.ч. описание типов данных
    # ни одна функция не должна выбрасывать исключения
    def get_snapshot(site: str, name: str) -> typing.Optional[Snapshot]:
        "Качает один снапшот с сайта и возвращает его, или None если была ошибка."
        ...
    
    def prepare_snapshot(snapshot: Snapshot) -> typing.Optional[PreparedSnapshot]:
        "Подготавливает один снапшот к обработке. Возвращает None при ошибке."
        ...
    
    def process_prepared_snapshot(snapshot: PreparedSnapshot) -> typing.Optional[SnapshotResult]:
        "Извлекает нужные сведения из одного снапшота и возвращает их как структуру данных, или None при неудаче."
        ...
    
    # эта функция будет в главном запускаемом файле
    # главный файл должен импортировать остальные
    targets = zip(...)  # ну или как ты там делаешь список
    # и вот тут уже главный цикл
    # вариант А - классический цикл
    results: typing.List[SnapshotResult] = []
    for site, name in targets:
        snap = get_snapshot(site, name)
        if snap is not None:
            prepared = prepare_snapshot(snap)
            if prepared is not None:
                result = process_prepared_snapshot(prepared)
                if result is not None:
                    results.append(result)
    # вариант Б - более функциональный подход
    # фильтрует коллекцию, отбрасывает None
    def skipNone(items):
        return filter(lambda item: item is not None, items)
    
    results: typing.List[SnapshotResult] = list(skipNone(
        map(process_prepared_snapshot, skipNone(
            map(prepare_snapshot, skipNone(
                get_snapshot(site, name) for site, name in targets
            ))
        ))
    ))
    # в любом случае, у тебя есть список результатов results, делай с ним что хочешь.


    К слову, у тебя очень кривой zip() в примере кода.
    aList = "http://сайт-со-снепшотами.com"
    bList = ['список',  'имен',  'для',  'снепшотов', 'и', 'так', 'далее'] 
        for a, b in zip(aList, bList):

    У тебя zip() даст
    ('h', 'список'), ('t', 'имен'), ('t', 'для'), ('p', 'снепшотов'), (':', 'и'), ('/', 'так'), ('/', 'далее'), ...
    Ответ написан
    4 комментария
  • Как правильно рекурсивно обойти словарь?

    Vindicar
    @Vindicar
    RTFM!
    Если вложенность словаря неизвестна, то проще всего рекурсией.
    def process_dict(d: dict):
        pass  # тут работаешь с этим словарём
        # рекурсивный вызов для вложенных словарей
        subresults = [process_dict(subdict) for subdict in d['subCategories']]
        pass # тут объединяешь результаты от вложенных словарей с основным результатом
        return ... # обязательно возвращаешь результат
    Ответ написан
    Комментировать
  • Как фиксировать изменение значения переменной в Python?

    Vindicar
    @Vindicar
    RTFM!
    Не так, переменная меняется не присвоением ей значения, а за счет парсинга с сайта

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

    Тебе нужно сохранять предыдущее значение переменной. Если программа работает постоянно - можно сохранить в другой переменной. Если нужно, чтобы сведения пережили перезапуск - сохраняй в файл или ещё куда.
    Так или иначе, по завершению парсинга, когда у тебя есть новое значение, ты сравниваешь его со старым. И если они не равны, реагируешь на это. Ну и сразу переносишь новое значение в переменную для старого, чтобы при следующем сравнении уже сравнивать с более новым. Что-то типа:
    old_value = None
    while True:
        new_value = parse_site()  # parse_site() - написанная тобой функция, которая возвращает искомое значение
        if old_value is not None and new_value != old_value:  # если это не первый раз, и значение изменилось
            print('Значение изменилось!')
        old_value = new_value  # чтобы в следующий раз сравнивать с последним увиденным значением
        time.sleep(600)  # спим 10 минут, чтобы не долбить сайт запросами


    Ну и да, неважно откуда ты берёшь значение. Ты всё равно присваиваешь его переменной. Всё равно.
    Если ты этого не понимаешь - отложи свой парсер, и почитай хороший учебник по Питону, того же Марка Лутца, "Изучаем Питон".
    Ответ написан
    Комментировать
  • Как ввести лист в ячейку mysql?

    Vindicar
    @Vindicar
    RTFM!
    Не нужно пихать структуру данных в ячейку БД. Выдели под элементы списка отдельную таблицу (отдельные таблицы) и свяжи её с основной таблицей по ключу.
    Ответ написан
    Комментировать
  • Как сделать программу добавляющую словарь в словарь?

    Vindicar
    @Vindicar
    RTFM!
    slovar[username] = {"Name":name}
    slovar[username] = {"Familia":familia}
    slovar[username] = {"Data":ddmmyy}
    slovar[username] = {"Nomer":nomer}

    Ты перезаписываешь slovar[username] каждый раз.
    slovar[username] = {
        "Name":name,  # инглиш
        "Familia":familia, # рунглиш
        "Data":ddmmyy, # рунглиш
        "Nomer":nomer,  # рунглиш
    }
    Ответ написан
    1 комментарий
  • Как из txt файла вытащить строки с одинаковым началом?

    Vindicar
    @Vindicar
    RTFM!
    Очень просто.
    dialogue = dict()  # обычный питоновский словарь
    
    # datasource - коллекция строк. Но данные можно читать и построчно из файла 
    # with open('text.txt', 'rt') as datasource:
    datasource = """mom - Hello, do you need anything in the shop?
    brother - Yes, bring some fruits
    dad - And beer
    mom - okey
    dad - thx
    brother - thx
    """.split()  
    
    for line in datasource:
        actor, _, text = line.split(' - ')  # разбиваем строку на две части
        if _ is not None:  # нашли разделитель, действуем
            # если нужного ключа не было, создать его с указанным значением,
            # (в нашем случае с новым пустым списком) и вернуть это значение
            # а если ключ был, то просто вернуть его значение
            actor_lines = dialogue.setdefault(actor.lower(), [])
            actor_lines.append(text)
    print(dialogue)


    Можно и с defaultdict, так несколько удобнее:

    from collections import defaultdict 
    # если у словаря спрашивают неизвестный ключ, он по-тихому 
    # поместит по этому ключу пустой список, и отдаст этот список
    # этот словарь будет хранить результат
    dialogue = defaultdict(list)  # list - фабрика новых значений
    
    # datasource - коллекция строк. Но данные можно читать и построчно из файла 
    # with open('text.txt', 'rt') as datasource:
    datasource = """mom - Hello, do you need anything in the shop?
    brother - Yes, bring some fruits
    dad - And beer
    mom - okey
    dad - thx
    brother - thx
    """.split()  
    
    for line in datasource:
        actor, _, text = line.split(' - ')  # разбиваем строку на две части
        if _ is not None:  # нашли разделитель, действуем
            # если нужного значения ключа не было, defaultdict сам создаст запрошенный ключ
            # так что мы гарантированно получим список
            dialogue[actor.lower()].append(text)
    
    print(dialogue)
    Ответ написан
    Комментировать
  • Как из конфига получить словарь по значению переменной?

    Vindicar
    @Vindicar
    RTFM!
    s17={}
    s18={}
    s19={}

    Если ты ловишь себя на таких именах, а потом пытаешься получить нужное имя динамически, тебе нужен или список, или словарь, но не отдельные переменные.
    Ответ написан
    Комментировать
  • Как удалить лишние символы из текста, если их больше 20?

    Vindicar
    @Vindicar
    RTFM!
    paxa-1331, ну для начала вытащи текст из списка. Это всё равно, что пытаться пользоваться набором инструментов, который лежит на чердаке, не доставая его оттуда. Можно, но неудобно.
    txt = List_1[0]
    А потом уже разбирайся с txt, делай срез.
    txt = # тут твой код
    Разберёшься - положишь обратно.
    List_1[0] = txt
    Вообще, читай про списки, читай! Их надо понимать, иначе далеко не уедешь.
    Ответ написан
    Комментировать
  • Как в модуле из класса импортировать метод PYTHON?

    Vindicar
    @Vindicar
    RTFM!
    В твоей формулировке - никак.
    По-хорошему, методы класса должны работать с данными класса, и в таком случае нужно импортировать весь класс целиком.
    В твоём случае этот класс не имеет смысла, его "метод" должен быть свободно стоящей функцией.

    # файл a.py
    def putin():
        c = 'punctuati'
        c = c * 2
        print(c)
    
    # файл b.py
    from a import putin
    putin()
    Ответ написан
    Комментировать
  • Как декодировать строку из переменной?

    Vindicar
    @Vindicar
    RTFM!
    encoding=eng лишнее. У тебя код закодировал строку в utf-8 при создании объекта bytes(), так что она оказалась уже дважды закодирована.

    Но так как этот параметр обязателен, то можно схитрить.
    strange_string = '"message":"\xd0\x9f\xd0\xbb\xd0\xb0\xd1\x82\xd0\xb5\xd0\xb6 \xd0\xbd\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb7\xd0\xbc\xd0\xbe\xd0\xb6\xd0\xb5\xd0\xbd"'
    bstring = bytes(ord(c) for c in strange_string)  # конструируем строку байт побайтово, из кодов символов в строке
    result = bstring.decode('utf-8')
    print(result)
    Ответ написан
    2 комментария
  • Прозрачный цвет цветовых пикселей. как сделать?

    Vindicar
    @Vindicar
    RTFM!
    cv2_inwrite(/content/2 (1).jpeg, im)
    Во-первых, куда кавычки подевал?
    Во-вторых, jpeg не поддерживает прозрачность.
    В-третьих, обычное изображение - это массив вида (H, W, 3), где W и H - ширина и высота в пикселях, а 3 - каналы RGB.
    Тебе нужно создать изображение вида (H, W, 4), скопировать в него твоё изображение в первые три канала, затем заполнить последний канал значениями прозрачности (255 для совсем непрозрачных, 0 для совсем прозрачных).
    Так как cv2 хранит писксели в массиве numpy, читай туториалы по работе с массивами numpy, чтобы понять, как это сделать.
    Затем сохрани изображение в формате, поддерживающем прозрачность, например в PNG.
    Ответ написан
    4 комментария
  • ООП сработало не правильно?

    Vindicar
    @Vindicar
    RTFM!
    Ты в питон из какого языка пришёл? =)
    class Test:
      a: list = []

    Ты объявил атрибут класса, а не экземпляра класса.
    Так как у экземпляра класса нет атрибута a, питон ищет этот атрибут в самом классе - и находит.
    У тебя в примере и Test.a тоже даст [3].

    Атрибут экземпляра класса в питоне объявляется вот так:
    class Test:
        def __init__(self):  # конструктор
            self.a: list = []

    Тут у каждого экземпляра будет своя копия списка.
    Ответ написан
    9 комментариев
  • Как мне отфильтровать csv файл по датам?

    Vindicar
    @Vindicar
    RTFM!
    Xion, ну дай угадаю, перебирал с начала списка?
    Пусть у нас есть список букв:a b b a b a a ....
    Мы хотим убрать из него буквы b, и перебираем его с начала.
    Текущая буква A: A b b a b a a ....
    Ничего не делаем.
    Переходим к следующей.
    Текущая буква B: a B b a b a a ....
    Удаляем, следующие элементы смещаются на позицию: a B a b a a ....
    Переходим к следующей: a b A b a a ....
    Как видишь, следующую букву b мы из-за этого пропустили.

    Отсюда настоятельная рекомендация: избегай модифицировать коллекцию в процессе перебора! Лучше (реально лучше в случае с файлами) - генерируй по ходу перебора новую коллекцию, куда попадают только "хорошие" элементы. Вместо того, чтобы пытаться удалять "плохие" из уже существующей.

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