• Почему в файле .cvs иероглифы вместо букв после парсинга python?

    @o5a
    Для русского Excel кодировка по умолчанию при открытии CSV считается Windows-1251, вот в ней он и открывает. Так что если нужна возможность открывать сразу в Excel, то при сохранении указывайте windows-1251 именно. Но сам по себе CSV файл нормальный и в текущем виде, дело в самой особенности Excel.
    Ответ написан
  • Как тут имитировать клик каждого обьекта li в dropdown?

    @o5a
    Проблема в том, что item принадлежит изначальному объекту driver (первоначальной загруженной странице). Но после выбора варианта товара (нажатия item.click() ) загружается новая страница с этим вариантом. В результате driver загружается уже другой страницей. А item все так же продолжает ссылаться на объект из первоначальной. Потому и возникает такая ошибка.

    Я не эксперт в селениуме, может есть более правильный способ, но в данном случае навскидку вижу можно просто каждый раз заново искать элемент для клика, перебирая по индексам, вместо объектов item.
    for idx in range(len(items)):
        time.sleep(1)
        # заново ищем элемент
        item = driver.find_element_by_xpath(f"//li[@class='b-custom-drop-down__list-item'][{idx+1}]")
        item.click()
        ...

    В данном случае предполагается, что на каждой такой странице список вариантов одинаковый. Иначе конечно же получим ошибку при попытке выйти за пределы списка.
    Ответ написан
    Комментировать
  • Incorrect number of bindings supplied. The current statement uses 3, and there are 1 supplied. Как решить проблему?

    @o5a
    Ошибка говорит о том, что в качестве параметра execute передается несоответствующее запросу число данных.

    В 'INSERT INTO post VALUES (?, ?, ?)' предполагается 3 значения, а tuple(data.values()) содержит только одно, т.е. в словаре только 1 ключ. Проверяйте, что туда пишете и что хотите взять.
    Ответ написан
    Комментировать
  • TypeError: list indices must be integers or slices, not str в JSON?

    @o5a
    Логично же, что если делать
    njson = [item for item in data['data']['list'] if item['user']['name'] == 'name1']

    то njson будет списком, а не вложенным словарём. И обращаться к его элементам как njson['data']['list'] не имеет смысла.

    Если цель была отфильтровать тот список внутри изначального json, то его и нужно было менять:
    data['data']['list'] = [item for item in data['data']['list'] if item['user']['name'] == 'name1']
    Ответ написан
    Комментировать
  • Как сравнить таблицы?

    @o5a
    Насколько понимаю, в этих таблицах могут совпадать 4 поля, но есть и другие поля?
    Тогда можно их соединить, но именно по этим полям:
    SELECT *
    FROM mytable1 t1, mytable2 t2
    WHERE t1.field1 = t2.field1
    AND t1.field2 = t2.field2

    и так далее для всех сравниваемых полей.
    Тогда получится результат, где строка из таблицы mytable1 совпадает со строкой mytable2 по этим указанным полям.

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

    @o5a
    Если речь про формирование бонуса по условию, зависящему от других полей (как в данном случае buster1 и т.п.), можно это прописать в самом запросе через оператор case (по логике похоже на ветвления if в самом python). Например:

    sql = "UPDATE users SET balance = balance + \
    CASE WHEN buster1 = 'Нет' AND buster2 = 'Нет' AND buster3 = 'Нет' THEN 0.010 \
        WHEN buster1 = 'Да' AND buster2 = 'Нет' AND buster3 = 'Нет' THEN 0.050 \
        WHEN buster1 = 'Да' AND buster2 = 'Да' AND buster3 = 'Да' THEN 0.100 \
    END \
    WHERE id = ?"

    И соответственно в запросе передавать только id пользователя, сам бонус будет считаться автоматически.
    Таким образом сами формируете зависимость бонуса от этих полей.

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

    @o5a
    Перепроверьте еще раз свой код. В приведенном куске указанной проблемы нет: для каждой опции все будет срабатывать только 1 раз. Можете сами проверить приведенный кусок в отдельном скрипте. Если что-то повторяется, значит или этот кусок отличается от реального кода, или в остальном коде функция повторно вызывается.

    И не стоит комментировать каждую строку. Комментарии должны помогать понять логику работы куска кода, а не дублировать сам код. Нет никакого смысла в подобных комментариях:
    return bd #возвращаем получившуюся БД
    Ответ написан
    Комментировать
  • Как победить ошибку "name is not defined"?

    @o5a
    1. Чтобы интерфейс работал, нужно запустить цикл (mainloop)
    ...
    btn.pack()
    
    root.mainloop()

    А чтобы продолжить работать с телеграмом потом (если нужен его цикл), можно прекратить работу tk, вызвав root.destroy()
    2. Свою функцию messages = ut нужно вызывать уже после того, как переменная ut установлена. Например, в той же самой функции conn:
    def conn():
        ut = user_text.get()
        root.destroy()
        telegram_send.send( messages = ut )
    Ответ написан
    Комментировать
  • Как сделать, чтобы бот не обращал внимания на пунктуацию?

    @o5a
    Можно через str.translate удалить все указанные символы по списку
    text = 'Как съесть яблоко?'
    text = str.translate(text, str.maketrans('', '', '.,?:-;/\\'))
    Ответ написан
    9 комментариев
  • Не понимаю, как исправить ошибку. Почему выдает тип str?

    @o5a
    Проблема в использовании min(x) на
    x = pd.DataFrame(dataset.Open)
    В данном случае она возвратит название колонки, т.е. строку. Чтобы найти минимум по данным, надо явно указать, по какой колонке искать, т.е. min(x.Open)
    Или же изначально x делать не DataFrame, а Series
    x = pd.Series(dataset.Open)
    Тогда можно использовать min(x)
    Ответ написан
    Комментировать
  • Как создать DataFrame из xml?

    @o5a
    Не нужно перебирать элементы 'works' в том же цикле, где и добавляются строки к DF. Если их перебирать, то и складывать в одну строку (через запятые), а потом уже создавать запись в pandas. Или же вообще этот цикл заменить на join():
    for elem in root:
        elements = [elem[0].text, elem[1].text, elem[2].text, ','.join(val.text for val in elem[3])]
        df = df.append(pd.Series(elements, index=df_index), ignore_index=True)

    Еще стоит учесть, что в таком коде обращение по индексам (elem[0].text и подобное) создает жесткую привязку к позиции узла в xml. Если порядок поменяется, то столбцы будут парситься неверно. Возможно стоило использовать более явное указание: elem.find('name').text
    Ответ написан
    Комментировать
  • Как наложить фото на гринскрин в Python?

    @o5a
    Можно так например. Учитывая указанный цвет зеленого, заменяем его по всему гринскрину на прозрачный, затем подмешиваем второе изображение с учетом этой маски.
    Возможно есть более эффективные способы, но так тоже работает.
    from PIL import Image
    
    # заменяет указанный цвет на прозрачный
    def make_transparent(image, color):
        new = []
        for item in image.getdata():
            if item[:3] == color:
                new.append((255, 255, 255, 0))
            else:
                new.append(item)
        image.putdata(new)
    
    GREEN = (x, y, z) # указываем цвет нашего зеленого на "гринскрине"
    img_filename = "images/image.png"
    screen_filename = "images/green.png"
    
    img = Image.open(img_filename).convert('RGBA')
    screen = Image.open(screen_filename).convert('RGBA')
    
    make_transparent(screen, GREEN)
    
    new = Image.alpha_composite(img, screen)
    new.save('new_image.png')


    Другой вариант - аналогично перебирать оба изображения и использовать пиксели первого/второго в зависимости от цвета пикселя гринскрина.
    Ответ написан
    Комментировать
  • Почему не работает ИЛИ в re python?

    @o5a
    re.compile(r'WHERE(.+?)(GROUP BY|;)', re.S)
    Но для большей точности лучше добавить токены '\b' ограничивающие слова, иначе WHERE может поймать и как часть другого слова.
    Ответ написан
    3 комментария
  • Как к этому регулярному выражению добавить символы верхнего и нижнего регистра?

    @o5a
    Почитайте про флаги. В данном случае добавить re.I
    regex = re.compile(r'.*(.)(\1)(\1)(\1).*$', re.I)
    Ответ написан
    6 комментариев
  • Python Selenium как нажать на кнопку "отмена" в окне печати?

    @o5a
    find_elements_by_class_name возвращает список элементов, так что нужно добавить индекс нужного элемента.
    В данном случае предполагаю этот элемент только один, так что можно проще - использовать другую функцию, для единственного элемента:
    driver.find_element_by_class_name('cancel-button').click()
    Ответ написан
    9 комментариев
  • Xpath python как взять 2 элемент с похожим классом?

    @o5a
    find_elements_by_xpath выведет список всех элементов с таким xpath
    Ответ написан
  • Как правильно хранить в Sqlite числа с плавающей точкой что бы в дальнейшем удобно производить выборку по этим данным?

    @o5a
    Вы что-то намудрили при создании таблицы. У вас тип полей не real, а BLOB, это бинарный тип. Поэтому он и выдает такие значения. Возможно до этого экспериментировали и создали таблицу с типом BLOB, поэтому новая с типом REAL не пересоздалась. Грохните ее и создайте заново. Будет выдавать нормальные типы (real из sqlite должен выдавать как float)
    И заодно, по поводу структуры. Создавать 256 полей под 256 значений выглядит не очень, да и удобство сомнительное. Лучше было их записывать построчно, с нумерацией, т.е. таблица вида:
    (id_photo, h_num, h_value)
    тогда и запись будет не так монструозно выглядеть, и запрашивать нужное значение тоже удобно будет
    select * from photos where id_photo = ... and h_num = 1
    или
    select * from photos where h_num = 1 and h_value > 30
    Ответ написан
    1 комментарий
  • Правильно ли связанны мои таблицы в sqlite?

    @o5a
    1. Лучше не разделять таблицы с фото на 2 разных. Судя по описанию задачи структура и хранимые в них данные абсолютно идентичны по сути. Так что лучше использовать единственную таблицу для хранения всех этих вариантов фото. А для разделения (лицо/котики/возможно еще какой вариант захотите добавить) использовать отдельное поле в таблице, photo_type например.
    2. В представленном коде у Вас из таблицы фотографий идет FK на таблицу пользователей. Если таблица фото предполагает хранение самих данных (что за поле h1? это сами данные фото?), то правильнее сделать наоборот: в таблице пользователей хранить id из таблицы фото, с соответствующим FK.
    Т.е. примерно так
    CREATE TABLE IF NOT EXISTS users(user_id INTEGER  NOT NULL PRIMARY KEY, 
                    photo_id INTEGER NOT NULL, 
                    registration_date TEXT, 
                    actual_name TEXT, 
                    real_name TEXT, 
                    old_names TEXT, 
                    friends INT, 
                    level INT, 
                    country TEXT, 
                    profile_summary TEXT, 
                    src TEXT,
    FOREIGN KEY (photo_id) REFERENCES photos(id))
    
    CREATE TABLE IF NOT EXISTS photo_type(photo_type INTEGER PRIMARY KEY,
                      photo_type_name TEXT)
    
    CREATE TABLE IF NOT EXISTS photos(id INTEGER PRIMARY KEY AUTOINCREMENT,
                      photo_type INTEGER,
                      h1 INT,
    FOREIGN KEY (photo_type) REFERENCES photo_type(photo_type))

    3. По формату данных. Можно хранить как INT, FLOAT, насколько знаю там еще вроде можно NUMERIC, это как аналог десятичного числа.
    6.1000e+01

    А точно у Вас десятичные числа? Приведенный пример по факту целое число 61.
    массив из 256 не целых чисел в базу(гистограмму картинки)

    Как таковых массивов sqlite насколько знаю не поддерживает. Чтобы хранить придется заносить каждое число в отдельную строку с соблюдением порядка (id autoincrement в принципе с этим справится). Не факт, что это лучший вариант хранения этих данных, ведь по факту насколько я понимаю никогда не понадобится выбрать конкретное число из этой гистограммы, она нужна всегда только как массив - полностью записываем, полностью считываем.
    Так что для такой задачи возможно лучше не плодить их в таблице, а просто завести текстовое поле и хранить там этот список чисел в виде json. В sqlite можно даже написать автоматическое преобразование данных, т.е. в колонку пишется список, а сохраняется как json, аналогично при чтении. Пример.
    Ответ написан
    Комментировать