Задать вопрос
Ответы пользователя по тегу Python
  • Python и чтение из excel с записью в mysql как ускорить?

    @o5a
    Для массовой вставки строк лучше использовать executemany, а не делать execute в цикле.
    https://dev.mysql.com/doc/connector-python/en/conn...
    Т.е. сформировать вложенный список строк, затем массово его вставить, например так:
    # формируем вложенный список всех строк данных
    data = [[
        sheet[f'A{i}'].value, #id
        sheet[f'B{i}'].value, #имя
        sheet[f'C{i}'].value, #фамилия
        sheet[f'D{i}'].value, #отчество
        sheet[f'E{i}'].value, #Водительские права(Есть/Нет)
        sheet[f'F{i}'].value, #Семейное положение(Да/Нет)
        sheet[f'G{i}'].value] #Профессия
        for i in range (2, 500002)
        ]
    
    # массово вставляем все данные
    cursor.executemany("""insert into table1(id, name, fam, otch, vod_pr, sem_pol, prof)
                  values(%s, %s, %s, %s, %s, %s, %s)""", data)


    Но раз уж мы массово вытаскиваем данные, то лучше переделать выборку, например так:
    # формируем вложенный список всех строк данных (тут подставить свои значения min/max row/column если потребуется)
    data = list(sheet.iter_rows(min_row=2, max_row=500002, max_col=7, values_only=True))
    
    # массово вставляем все данные
    cursor.executemany("""insert into table1(id, name, fam, otch, vod_pr, sem_pol, prof)
                  values(%s, %s, %s, %s, %s, %s, %s)""", data)

    Хотя возможно есть более быстрый способ массово выбирать данные строк в openpyxl, я не знаю.

    P.S. можно сразу почистить данные от пустых строк, например так
    data = list(filter(lambda x: any(x), data))
    Ответ написан
    Комментировать
  • Не работает парсер в excel?

    @o5a
    Из-за сбившихся отступов сложно сказать наверняка, но в таком состояни видно, что в txt записывается только одна последняя строка данных, т.к. txt = tag.text.split() каждый раз ее перезаписывает. Вместо этого думаю предполагалось записывать в txt вложенный массив строк.
    txt = []
    with open("bank.html", "r", encoding="utf-8") as f:
        contents = f.read()
        soup = BeautifulSoup(contents, 'lxml')
        tags = soup.find_all(['th', 'tr'])
        for tag in tags:
            txt.append(tag.text.split())


    И затем в цикле записи соответственно проходить по этим строкам, т.е. изменить примерно так
    for i, vals in enumerate(txt):
        row = sheet1.row(i)
        for index, col in enumerate(cols):
            value = vals[index]
            row.write(index, value)
    Ответ написан
  • Как определить тип данных из строки в python?

    @o5a
    Проверять на isdigit(), например так
    s = '665.3'
    x = int(s) if s.isdigit() else float(s) if s.replace('.', '').isdigit() else s

    Или же пытаться сразу преобразовать в int/float через try..except.
    Ответ написан
    Комментировать
  • Как исправить данную ошибку?

    @o5a
    Нужно проверять, что все регулярные выражения совпали, а не только первое. Т.е. вместо if match is not None: например написать
    if all([match, match1, match2, match3]):
    Если же цель - пропускать каждое из ненайденых выражений, то соответственно проверять по отдельности.

    Судя по выражениям, предполагаю, что имя, класс, возраст, вес идут по порядку, так что все выражения можно объединить в одно с 4 группами. Тогда можно будет проверять, что нашлось одно выражение, а выдавать текст из 4-х групп:

    if match:
        file_output.write(match.group(1) + match.group(2) + match.group(3) + match.group(4))
    Ответ написан
    Комментировать
  • Евклидово расстояние: если нет ближайших совпадений чтобы ничего не выдавал?

    @o5a
    Не в курсе особенностей самой задачи распознавания, но насчет самого SQL - ORDER BY не влияет на количество выводимых строк. Если нужно скрывать ненужные строки (с пустыми кодировками), то нужно использовать фильтр, т.е. WHERE

    SELECT ...
    WHERE TEST_ENCODING_VALUE_0_HERE IS NOT NULL
      AND TEST_ENCODING_VALUE_1_HERE IS NOT NULL
      ...
    ORDER BY ...
    Ответ написан
  • Как в python запустить приложение с параметрами командной строки?

    @o5a
    В простейшем случае можно просто запустить через subprocess.run
    import subprocess
    
    cmd = 'D:\program\WinRAR.exe a -ag -m5 -r C:\Documents\documents.rar C:\Documents'
    subprocess.run(cmd)

    Только run блокирует скрипт пока не исполнится команда. Если нужно в отдельном процессе, то использовать Popen.
    Ответ написан
    Комментировать
  • Как при записи в csv добавить в конец пустой елемент?

    @o5a
    Если речь про доп. разделитель после последнего значения, то можно использовать доп. параметр lineterminator=";\r\n" или же искусственно добавить пустую колонку, изменив строку
    spamwriter.writerow(data + [None])
    Ответ написан
    Комментировать
  • Как заполнить каждый 7-ой элемент массива?

    @o5a
    n = 10
    a = [0]*n
    i = -1
    for x in range(n):
        i = (i+7)%n
        a[i] = x+1
    print(a)
    # [3, 6, 9, 2, 5, 8, 1, 4, 7, 10]


    Только ты сам ошибся в своем примере, если я правильно алгоритм понял. Начиная с 3-го числа у тебя расстояние уже неправильное.
    Ответ написан
    Комментировать
  • Как в kv-файле использовать русские буквы?

    @o5a
    Указывай кодировку явно.
    with open("myfile.kv", encoding='utf8') as f:
        container = Builder.load_string(f.read())
    Ответ написан
    Комментировать
  • Python, winreg. Как убрать скрипт из автозапуска?

    @o5a
    Не знаю особенностей работы данного метода, но если нужно запускать только 1 раз, то можно просто использовать ключ Software\Microsoft\Windows\CurrentVersion\RunOnce, оттуда она автоматически удалится после 1 запуска.
    Ответ написан
    Комментировать
  • Как получить список по ID?

    @o5a
    Как отфильтровать список через lambda уже написали. А другой вариант - преобразовать текущий список во что-то более пригодное к адресации. Например, словарь с ключом из этого id (предполагаю, что id уникально), тогда можно будет напрямую получать данные. В простейшем случае так:
    a = [{'id':1, 'name':"ID1", 'val':331}, {'id':98, 'name':"ID98", 'val':51}, {'id':908, 'name':"908", 'amount':361}]
    new_dict = {d['id']:d for d in a}
    print(new_dict)
    # теперь можно напрямую обращаться по id
    print(new_dict[1])
    print(new_dict[908])
    Ответ написан
    Комментировать
  • Python 3.8 Как правильно организовать сравнение?

    @o5a
    list1 = ['one', 'two', 'three', 'six']
    list2 = ['one', 'two', 'four']
    # общие элементы
    print(set(list1) & set(list2))
    # то, чего нет во 2-м списке
    print(set(list1) - set(list2))
    # то, чего нет во 1-м списке
    print(set(list2) - set(list1))
    Ответ написан
    Комментировать
  • Как присоеденить код программы к интерфейсу?

    @o5a
    Нужно добавить функцию-обработчик и затем привязать ее к событию кнопки.
    # функция-обработчик, возьмет текст из 1-го поля, заменит и занесет во 2-е
            def remove_bad(self):
                text = self.lineEdit.text()
                text = ... # произвести нужные замены текста
                # вывести результат в нужное поле
                self.lineEdit_2.setText(text)
    
            # привязать запуск функции к кнопке
            self.pushButton.clicked.connect(self.remove_bad)


    Я всех особенностей модуля не знаю, но реализация примерно такая.
    Ответ написан
    4 комментария
  • Что надо сделать что бы Sqlite UPDATE заработал?

    @o5a
    В исполнении UPDATE user_info в параметрах используется name[0], а должно быть просто name.
    Ответ написан
    Комментировать
  • Как менять название скачиваемого файла wget?

    @o5a
    wget.download возвращает имя скачанного файла. Если нужно переименовывать соответственно после закачки бери и сразу переименовывай его как нужно через os.rename
    Ответ написан
    Комментировать
  • Как залить телеграмм бота на пайтоне на сервер?

    @o5a
    1. Хоть импортируется и telebot, но ставить надо модуль pytelegrambotapi, это правильный официальный.
    2. На pythonanywhere нужно учитывать формат в зависимости под какую версию ставишь.
    Например, для python3.7 нужно ставить так:
    pip3.7 install --user pytelegrambotapi
    Ответ написан
    Комментировать
  • Как сгенерировать двумерный список python?

    @o5a
    Если известно кол-во "строк", то можно так
    a = [input().split() for _ in range(3)]
    Обычным input() не получится вводить несколько строк, т.к. Enter закончит ввод.
    Если все же нужно вводить таким образом неограниченное кол-во строк, можно использовать sys.stdin, но заканчивать ввод нужно будет через Ctrl-Z/Ctlr-D.
    import sys
    lines = [s.split() for s in sys.stdin.read().splitlines()]
    Ответ написан
    Комментировать
  • Получаю ошибку в простом алгоритме для задачи на codewars. vasya - clerk?

    @o5a
    if money >= ticket:
                    money += 25
                    money -= ticket - 25

    С каждым покупателем прибавляется заплаченная купюра за вычетом сдачи, т.е. 2-я строка должна быть money += ticket, что сократит обе строки до money += 25, что логично, ведь мы с каждым проданным билетом увеличиваем кассу только на цену билета.
    Но тут еще другая проблема с таким подходом: он не учитывает номиналы купюр в кассе. Например, для последовательности [25, 25, 50, 50, 100] к последнему покупателю в кассе будет 100 долларов, но сдачу оплатить не сможем, т.к. это 2 купюры по 50. Следовательно, нужно учитывать не просто сумму в кассе, а номиналы.
    Ответ написан
    Комментировать