Ответы пользователя по тегу Python
  • Как создать DataFrame?

    @o5a
    Подозреваю, что предполагалось сделать это:
    p=subprocess.Popen(['/usr/bin/python3', '/home/roman/PycharmProjects/uznaemfileID/fileid.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    result=p.stdout.read()


    Только если это работа с питоновскими скриптами, правильнее было бы импортировать модуль и вызывать функции напрямую, без прослойки в виде subprocess.
    Ответ написан
  • Как работает эта функция?

    @o5a
    А что именно смущает? Алгоритм перебирает нечетные числа, начиная с 5. Пользовательское число n определяет, какое количество нечетных чисел всего брать (за вычетом изначально заданного количества count=2, т.к. список чисел заранее заполнен двумя числами 2,3).
    Для каждого нечетного числа по списку он пытается определить, простое оно или нет, путем деления без остатка.
    Ответ написан
  • Поможете с кодом пожалуйста?

    @o5a
    Можно так например (или defaultdict вместо использования setdefault)
    data = dict()
    
    for row in csv_reader:
        page = row['page']
        event_date = row['date'][:-3]
        device_kind = row['device']
    
        device_dict = data.setdefault(device_kind, {})
        date_dict = device_dict.setdefault(event_date, {})
        date_dict[page] = date_dict.setdefault(page,0) + 1
    
    print(data)
    Ответ написан
    Комментировать
  • Почему не создается таблица в БД?

    @o5a
    Основная проблема в наличии нескольких команд в одном SQL запросе. По умолчанию execute может исполнить только одну команду. Т.е. нужно разбить исполнение на несколько запусков execute.
    cursor.execute("DROP TABLE ...")
    cursor.execute("CREATE TABLE IF EXISTS ... ")

    Другой вариант - использовать флаги:
    https://stackoverflow.com/questions/58544640/pymys...

    Но и как уже заметили, создавать и удалять таблицы - плохой дизайн. Лучше разделять задачи или еще что там нужно на уровне полей самих таблиц, которые фиксированы.
    Ответ написан
    Комментировать
  • Как проверить на существование пользователя в Postgresql c помощью Dataset?

    @o5a
    Судя по документации, для соединения не нужно было писать psycopg2, там просто обычный адрес postgres:
    db = dataset.connect(url='postgresql://postgres:admi@localhost/data')

    После создания таблицы нужно добавить нужные поля, например, user
    table.create_column('user', db.types.text)
    При заведении нового пользователя
    table.insert({'user':"new_user_name"})
    Для проверки наличия в базе
    table.find(user="user_name")
    или так (возвращает кол-во найденных строк с указанным пользователем)
    table.count(user="user_name")
    Ответ написан
    Комментировать
  • Что делать когда turtle в python не отвечает?

    @o5a
    Не нужно было использовать модуль keyboard вместе с tkinter. Он перехватывает управление, из-за чего программа "не отвечает".

    Вместо использования модуля keyboard в каждой функции, глобального цикла while True надо было использовать метод bind. Пример для команды right (аналогично сделать привязку остальных клавиш):
    # выкидываем проверку клавиши, оставляем только само действие
    def right(event):
        print('right')
        turtle.right(45)
    
    # затем назначаем стрелке вправо нашу функцию
    root.bind('<Right>', right)
    
    # полностью убираем весь цикл while True, вместо него используем
    root.mainloop()
    Ответ написан
    Комментировать
  • В чем моя ошибка в решении задачи?

    @o5a
    1. Проверка на первую букву неправильная, синтаксис a(..) означает вызов функции a, чем она не является.
    Так что или так
    if a[0] == "о"
    или
    a.starswith("о")
    2. a.replace('о', ' ') заменит букву на пробел, а в описании написано "удалить", обычно под этим понимается замена на пустую строку, т.е. a.replace('о', '')
    3. В описании написано "удалить первую из букв о", а replace удаляет все буквы "о". Можно использовать 3-й параметр, чтобы ограничить количество замен только 1-й буквой.
    a.replace("о", "", 1)
    4. По описанию задачи я бы предположил, что не должно быть никаких print('Превая буква не о'), просто всегда возвращать исходную строку с вышеуказанной заменой, даже если букв нет.
    Ответ написан
    Комментировать
  • При вызове общий сбор, имя выходит левое. Как исправить?

    @o5a
    Потому что построение команды не понятно на что рассчитано

    getting_api.users.get(user_ids=from_id > 0)[0]
    равносильно
    getting_api.users.get(user_ids=True)[0]

    Что же нам выдает API при user_ids=True ?
    https://vk.com/dev/users.get?params[user_ids]=True...
    Ответ написан
    4 комментария
  • Как в python tkinter сохранить состояние Canvas?

    @o5a
    Эта команда создает формат не PNG, а Postscript. Можно его открыть в программе, понимающей данный формат.
    Или преобразовать в PNG с помощью PIL (но в системе должно быть установлено что-то, поддерживающее формат, например Ghostscript)

    # после создания нашего PS
    canvas.postscript(file="my_dram.ps", colormode="color")
    
    # преобразовываем в PNG
    from PIL import Image
    
    img = Image.open("my_dram.ps")
    img.save("my_dram.png", "png")
    Ответ написан
  • Как удержать подключение к sql серверу с помощью python pyodbc?

    @o5a
    Во-первых, можно просто не закрывать соединение. Или использовать ту же самую глобальную переменную-соединение, или для удобства создать класс, обеспечивающий работу с базой, например так:
    # пример был для sqlite, но принцип одинаков
    class DataBase():
        def __init__(self, database_name):
            self.conn = sqlite3.connect(database_name)
            self.cursor = self.conn.cursor()
    
        def commit(self):
            self.conn.commit()
    
        def close(self):
            self.conn.close()
    
    # затем создаем один раз объект-соединение и с ним уже работаем
    db = DataBase('...')
    c = db.cursor
    c.execute('CREATE TABLE ...)')
    c.execute('INSERT INTO TABLE ...)')
    db.commit()
    # где нужно используем один и тот же объект-соединение


    Во-вторых для выполнения множественных операций (как в данном случае insert) вместо execute есть команда executemany. Ей как раз передается вложенный список строк данных, и она будет исполняться гораздо эффективнее повторного вызова execute по каждой строке.
    Ответ написан
    Комментировать
  • Вывод данных из БД в Телеграмбот?

    @o5a
    Форматировать вывод можно например так
    data = [
    [1, "10:55", "math"],
    [2, "12:35", "geo"],
    ]
    
    s = '\n'.join('\t'.join(map(str, row)) for row in data)
    print(s)

    1	10:55	math
    2	12:35	geo


    И использовать надо fetchall, т.к. fetchone возвращает только первую строку ответа.
    Ответ написан
    Комментировать
  • Как сделать так чтобы массив перезаписывался?

    @o5a
    Для избежания выхода за пределы списка можно использовать модуль по количеству символов в списке, он "зациклит" индекс
    arr_shifr.append(letters[(ii + shifr)%len(letters)])
    Ответ написан
    Комментировать
  • PermissionError: [Errno 13] Permission denied: '.' при попытке открыть текстовый документ. Что делать?

    @o5a
    Всё логично, у вас cur_path не изменяется, т.к. cur_path.joinpath не меняет саму cur_path а только возвращает измененный путь.

    Поэтому при открытии по cur_path пытается открыть просто корневой каталог "." на него и ругается.

    Нужно присваивать результат joinpath

    cur_path = cur_path.joinpath(...
    Ответ написан
    Комментировать
  • Как правильно сравнить данные с переменной?

    @o5a
    Во-первых, fetchone возвращает кортеж, а не единственное значение, т.е. для получения имени нужно брать не user, а user[0]
    Во-вторых, для запросов с внешними значениями вместо форматирования строки лучше использовать передачу параметров.
    c.execute(f"UPDATE brothers SET ves=ves+500 WHERE name = ?", (user[0], ))


    И в целом этот код изменит значение только у записей первого пользователя выборки таблицы.
    Ответ написан
    1 комментарий
  • Работа с файлами, если есть такой логин, поросить ввести другую. Как разобраться с ошибкой?

    @o5a
    Потому что файл открыли в режиме 'w' - это только запись. Для чтения надо открывать в режиме 'r'.

    Еще есть совместные режимы 'r+', 'w+', но для данного случая проще отдельно открывать на чтение, пройтись по всему файлу, и если не встретился логин, открыть на добавление (режим 'a') и добавить новую запись.
    Ответ написан
    Комментировать
  • Что нужно сделать что бы выводилось лишь одно условие? И как сделать что бы "w.detailed_status" выдавался на русском языке?

    @o5a
    Нужно инициализировать с русским языком
    вместо
    owm=pyowm.OWM('ххх')
    использовать
    from pyowm.utils.config import get_default_config
    
    config_dict = get_default_config()
    config_dict['language'] = 'ru'
    owm=pyowm.OWM('xxx', config_dict)
    Ответ написан
    1 комментарий
  • Как сделать кнопку проверки пути к файлу?

    @o5a
    Если уже используется глобальная pat то ее и нужно вызывать в rucheck (а параметр вообще убрать).
    def takeCSV():
        global pat
        pat = filedialog.askopenfilename(filetypes = (("CSV Files","*.csv"),))
        root.title(f'file at {pat}')
    
    def runCheck():
        global pat
        if pat != '':
            os.system(f'start {pat}')
    ....
    # и убрать параметр pat
    bCheck = Button(text='check', command=runCheck)


    Или можно вообще отказаться от глобальных и писать как атрибуты root
    def takeCSV():
        root.filename = filedialog.askopenfilename(filetypes = (("CSV Files","*.csv"),))
        root.title(f'file at {root.filename}')
    
    def runCheck():
        if root.filename:
            os.system(f'start {root.filename}')
    ....
    # и тоже убрать параметр pat
    bCheck = Button(text='check', command=runCheck)
    Ответ написан
    Комментировать
  • Как получить значение по ключу из первого словаря и сопоставить его со значением по ключу из второго?

    @o5a
    # проходим по словарю с фамилиями
    for key, value in rating.items():
        rating_cources = value
        # и по ключу из первого словаря берем значения из второго
        percent_cources = percents.get(key)
        layout += f'{rating_cources} {percent_cources}%\n'


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

    @o5a
    Список заполняется, просто в текущем коде возвращается он только один раз (в самом начале, когда он еще пустой), т.к. main() запускается только один раз.

    Можно увидеть, добавив например команду /info
    @bot.message_handler(commands = ['info'])
    def send_info(message):
      bot.send_message(message.chat.id, f'data={data}')


    Так что не нужно все эти функции оборачивать в main, они просто должны идти на глобальном уровне.
    Ответ написан
    2 комментария