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

    Vindicar
    @Vindicar
    RTFM!
    У тебя циклический импорт, так делать нельзя.
    Оформи код, использующий name или list, как функцию, и пусть она это значение принимает как параметр.
    Импортируй файл с функцией в другой модуль, и вызывай её оттуда.
    Ответ написан
    Комментировать
  • Почему не работает перенаправление вывода в файл (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 комментария
  • Каким образом посчитать большое кол-во чисел после запятой?

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

    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 мы из-за этого пропустили.

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

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

    Vindicar
    @Vindicar
    RTFM!
    Клавиатура обычно прикреплена к сообщению. Для её смены проще всего отправить поясняющее сообщение с новой клавиатурой.
    Ответ написан
    Комментировать