Не срабатывает хендлер на удаление сообщений в юзерботе Телеграм на pyrogram python
Суть задачи - отслеживать удаление сообщения и определять, какой пользователь удалил сообщение (либо в личке, либо в групповом чате), в личке почему то не получается словить хендлер. Пробовал filters.user - не срабатывает хендлер. А в групповом чате срабатывает хендлер но не выполняет команду и выдаёт вот такую ошибку (ниже)
Подскажите, что не так написал или как написать хендлер, отслеживающий удаление сообщения в конкретном приватном чате?
Код хендлера:

@app.on_deleted_messages(filters.chat(-100145451746))
def func(_, message):
    app.send_message(chat_id='me', text=f'{message.from_user.id} Удалено')

Код ошибки:

'List' object has no attribute 'from_user'
Traceback (most recent call last):
  File "C:\Users\naeni\AppData\Local\Programs\Python\Python39\lib\site-packages\pyrogram\dispatcher.py", line 219, in handler_worker
    await self.loop.run_in_executor(
  File "C:\Users\naeni\AppData\Local\Programs\Python\Python39\lib\concurrent\futures\thread.py", line 52, in run
    result = self.fn(*self.args, **self.kwargs)
  File "C:\Projects\Helper\app.py", line 22, in funcs
    app.send_message(chat_id='me', text=f'{message.from_user.id} Удалено')
AttributeError: 'List' object has no attribute 'from_user'enter code here

Функция, которая оборачивается в декоратор
@app.on_deleted_messages принимает список из сообщений, а не одно сообщение, как прочие декораторы.

client (Client) – The Client itself, useful when you want to call other API methods inside the message handler.
messages (List of Message) – The deleted messages, as list.


Оптимизация алгоритма на Python для строки
Всех с праздником! Я создал небольшой алгоритм, который из строки длиной n показывает наибольший возможный отрезок, где одинаковые буквы встречаются не более k раз. Выглядит это следующим образом:
<code>
n,k = map(int, input().split()) ## n - длина строки, k - максимальное количество букв в отрезке
l = input() ## сама строка длиной в n
ans = []
l1 = list(set(l))
l1.sort()

for f in range(len(l)):
    l2 = [0] * len(l1)

    s = 0
    for i in range(f, len(l)):
        for j in range(len(l2)):

            if l[i] == l1[j]:
                l2[j] += 1
        if max(l2) > k:
            break
        s += 1
    ans.append(s)

print(max(ans), end = ' ')
print(ans.index(max(ans))+1)
</code>
Но программа выполняется очень долго, особенно если n больше 10000. Как можно оптимизировать данную систему?

Ваше решение в худшем случае работает за куб от длины строки. Если учесть ограниченный алфавит, то время работы - квадрат длины строки на размер алфавита.
Задачу можно решить за линейное время. Для этого будем поддерживать пару индексов
i <= j и счётчики символов на полуинтервале
[i, j). Когда интервал расширяется (
j += 1) соответствующий счётчик увеличивается на единицу. Если он превысил порог
k, двигаем
i (
i += 1). Соответствующие счётчики уменьшаем. Останавливаемся когда превышение порога исчезло. Каждую найденную пару
(i, j) публикуем. По окончании цикла публикуем последнюю пару
(i, len(s)). Снаружи от цикла ищем самую длинную пару.

import collections

def spans(k, s):
    counter = collections.Counter()

    i = 0
    for j, c in enumerate(s):
        yield j - i, i + 1
        counter[c] += 1
        while counter[c] > k:
            counter[s[i]] -= 1
            i += 1
    yield len(s) - i, i + 1

def main():
    _, k = map(int, input().split()) ## _ - длина строки, k - максимальное количество букв в отрезке
    s = input() ## сама строка длиной в _
    print(*max(spans(k, s), key=lambda p: p[0]))

main()


Как скопировать файл через Python без импорта модулей?
Нашел такую задачу:

Попросите пользователя ввести команду «read» или «copy».

Попросите у пользователь ввести путь к файлу, содержимое которого он хочет посмотреть, либо скопировать. Причём, если пользователь ввёл до этого «read», то надо написать: «Напишите путь к файлу, содержимое которого Вы хотите посмотреть:». А если была команда «write», то: «Напишите путь к файлу, который Вы хотите скопировать:»

Если была команда «read», то вывести пользователю содержимое файла.

Если была команда «write», то сделайте копию файла. Копия файла должна называться так же, как и исходный файл, и находиться она должна в директории files, находящейся в той же директории, что и файл скрипта.

P.S. По-моему в задаче ошибка и вместо write должно быть указано copy.
У меня возникла проблема па решению 4-ой части. Единственные варианты - это решение через модуль shutil. Прошу помочь написать его без этого модуля (если это возможно)
Вот остальная часть кода:
<code>
while True:
    a = input("Введите read или copy: ")
    if a == "read":
        b = input("Напишите путь к файлу, содержимое которого Вы хотите посмотреть: ")
        d = "r"
        try:
            c = open(b, d)
            print(c.read())
            c.close()
        except FileNotFoundError:
            print("Путь указан неправильно, попробуйте ещё раз")
            continue
        break
        #дальше надо написать через elif a == "copy": .......
</code>
Заранее спасибо

Задача хочет от вас что-то такое:
<code>
    newfile = b.split('/')[-1]
    with open(b, 'r') as c:
        with open('files/' + newfile , 'w') as w:
            w.write(c.read())
</code>


Перемешать элементы матрицы в python
<code>
from random import shuffle
matrix = [[1, 2, 3, 4],
          [5, 6, 7, 8],
          [9, 10, 11, 12],
          [13, 14, 15, 16]]
def mat(n):
     return shuffle(n)
print(*map(mat, matrix))
</code>
Программа должна перемешать элементы вложенных списков, но этот код не работает правильно.

shuffle ничего не возвращает, а изменяет непосредственно сам объект последовательности
<code>
def mat(n):
     shuffle(n)
     return n
</code>


Python не читает данные файла Excel [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.

Закрыт 1 год назад.

                        Улучшить вопрос

Пишу код
python для чтения данных файла
Excel используя функцию
read_excel() модуля
pandas.
Вот код
dav4.py :

import pandas

excel_data_df = pandas.read_excel('task4.xlsx', sheet_name='Data', usecols=['market', 'mode'])

print(excel_data_df)

Но выдается следующая ошибка:

    Traceback (most recent call last):
  File "c:\Users\...\dav4.py", line 6, in <module>
    excel_data_df = pandas.read_excel(
  File "C:\Users\...\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\util\_decorators.py", line 311, in wrapper
    return func(*args, **kwargs)
  File "C:\Users\...\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\io\excel\_base.py", line 364, in read_excel
    io = ExcelFile(io, storage_options=storage_options, engine=engine)
  File "C:\Users\...\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\io\excel\_base.py", line 1191, in __init__
    ext = inspect_excel_format(
  File "C:\Users\...\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\io\excel\_base.py", line 1070, in inspect_excel_format
    with get_handle(
  File "C:\Users\...\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\io\common.py", line 711, in get_handle    handle = open(handle, ioargs.mode)
FileNotFoundError: [Errno 2] No such file or directory: 'task4.xlsx'

Объясните как решить эту проблему.
Python и
Excel файлы находятся в одной папке , но все равно ошибка

Советую воспользоваться этим решением:
<code>
import inspect
import os
import sys
import pandas as pd

def get_script_dir(follow_symlinks=True):
    if getattr(sys, 'frozen', False): # py2exe, PyInstaller, cx_Freeze
        path = os.path.abspath(sys.executable)
    else:
        path = inspect.getabsfile(get_script_dir)
    if follow_symlinks:
        path = os.path.realpath(path)
    return os.path.dirname(path)

excel_data_df = pd.read_excel(os.path.join(get_script_dir(), 'task4.xlsx'), sheet_name='Data', usecols=['market', 'mode'])
</code>


Python datetime найти две ближайшие даты
Нужно найти две ближайшие даты: одна, которая будет будет в будущем, другая, которая была в прошлом.
Сам код:

import datetime

date_list = ['2021-12-13 17:30:00', '2021-12-14 12:35:00','2022-01-31 19:00:00', '2023-05-12 12:44:23']
minus_array_str = []
plus_array_str = []
minus_array = []
plus_array = []
now = datetime.datetime.now()
for item in date_list:
    result = now - datetime.datetime.strptime(item,"%Y-%m-%d %H:%M:%S")
    if str(result)[0] == "-":
        minus_array_str.append(str(result))
    else:
        plus_array_str.append(str(result))
print(minus_array_str, plus_array_str)

Вывод из консоли

['-28 days, 17:47:51.569381', '-493 days, 0:03:28.569381'] ['21 days, 19:17:51.569381', '21 days, 0:12:51.569381']

Какой должен быть вывод

Ближайшая дата в прошлом: 2021-12-14 12:35:00
Ближайшая дата в будущем: 2022-01-31 19:00:00

отрефакторил, плюс притащил подсказку @GrAnd
<code>
import datetime

date_list = [
  '2021-12-13 17:30:00',
  '2021-12-14 12:35:00',
  '2022-01-31 19:00:00',
  '2023-05-1212:44:23'
]

now = datetime.datetime.now()
date_format = "%Y-%m-%d %H:%M:%S"
past_dates, future_dates = [], []

for date in date_list:
    date_obj = datetime.datetime.strptime(date, date_format)
    if now >= date_obj:
        past_dates.append(date_obj)
    else:
        future_dates.append(date_obj)

print(f'Ближайшая дата в прошлом: {max(past_dates)}')
print(f'Ближайшая дата в будущем: {min(future_dates)}')
</code>


Неверный вывод в Python
Доброго времени суток!
Опять я с какой то мелочью, судя по всему :)
Имеется ДЗ:

Есть два юнита, каждый из них называется «Воин». Каждому
устанавливается здоровье в 100 очков. Они бьют друг друга в случайном
порядке. Тот, кто бьёт, здоровья не теряет. У того, кого бьют, оно
уменьшается на 20 очков от одного удара. После каждого удара надо
выводить сообщение, какой юнит атаковал и сколько у противника
осталось здоровья. Как только у кого-то заканчивается ресурс здоровья,
программа завершается сообщением о том, кто одержал победу.

Выполнил его по примеру, но даже в том примере который я нашел имеется такая же проблема как и у меня.
Код следующий:

import random

def hit(target, target1):
    if target.health > 0:
        target.health -= 20
        if target1 == warrior_1:
            target1 = 'Воин_1'
        elif target1 == warrior_2:
            target1 = 'Воин_2'
        print(target1, ' атакует')
        print(target.health, ' осталось')
    elif target.health == 0:
        print(target1, ' выиграл')

class Warrior:
    def __init__(self, health):
        self.health = health

warrior_1 = Warrior(100)
warrior_2 = Warrior(100)

q = int(input('Введите 1 для атаки, 2 для прекращения работы программы: '))

while q != 2:
    if q == 1:
        j = random.randint(1, 3)
        if j % 2 == 0:
            hit(warrior_2, warrior_1)
            q = int(input('Введите 1 для атаки: '))
        else:
            hit(warrior_1, warrior_2)
            q = int(input('Введите 1 для атаки: '))
    else:
        print('Неверный ввод!')
        break

Проблема в конечном выводе информации. После того как у одного из юнитов уровень здоровья достигает 0, вместо того чтобы вывести информацию:

Воин_№ выиграл!

Выходит следующее:

Введите 1 для атаки: 1
<__main__.Warrior object at 0x000001FB8E12AFD0>  выиграл
Введите 1 для атаки: 1
<__main__.Warrior object at 0x000001FB8E12AF70>  выиграл
Введите 1 для атаки: 2

Process finished with exit code 0

До тех пор, пока программу не завершить.
Помогите пожалуйста разобраться и понять "что я упустил?"
Заранее спасибо! :)
P.S.: Не судите строго :)

Очевидно, что
target есть экземпляр класса
Warrior, следовательно - чего вы хотите при преобразовании объекта в строку?
Есть два пути:
Первый
Добавляем свойство
Name

class Warrior:
    def __init__(self, health: int, name: str):
        self.health = health
        self.name = name

И тогда:

print(target1.name, ' атакует')

Второй
Переопределяем
__str__

class Warrior:
    def __init__(self, health: int, name: str):
        self.health = health
        self.name = name

    def __str__(self):
        return self.name

И тогда:

kek = Warrior(100, 'lol')
print(str(kek))  # lol


Почему "cat" > "Cat" верно?
Почему это выражение возвращает
True:

print("cat" > "Cat")

Ведь
C стоит перед
c

Вообще-то вы сами ответили на свой вопрос. Прописная буква стоит раньше в таблице кодировки, чем строчная буква, а значит её код меньше. А код строчной буквы соответственно больше. Поэтому выражение истинно, всё правильно.

for a,b in zip("cat", "Cat"):
    print(f'{a}: {ord(a)}, {b}: {ord(b)}')

Вывод:

c: 99, C: 67
a: 97, a: 97
t: 116, t: 116

99 конечно же больше, чем
67


Кастомный словарь в Python - небольшой совет
Для исследования одной мат. идеи создаю словарь с таким поведением:
если происходит обращение к отсутствующему ключу, то этот ключ вносится в словарь со заданным default значением. Так вроде все работает:
<code>
class MyDict(dict):
    def __init__(self, start_dict, default):
        super().__init__(start_dict)
        self.__default = default

    def __missing__(self, key):
        self[key] = self.__default
        return self[key]

new_dict = MyDict({1: 1}, 1)
print(new_dict) >>> {1: 1}
print(new_dict[10]) >>> 1
print(new_dict) >>> {1: 1, 10: 1}
</code>
Хотелось бы, чтобы вместо постоянного default-значения передавалась некая функция set_value(), которая может зависеть от ключа, и от других параметров. И что-то запутался в передаче функции и аргументов!

Передавайте в ваш класс функцию с одним аргументом
default_factory(key). Внутри
self.__missing__ вызывайте её.
Всё что у вас есть внутри метода
self.__missing__ это
self и
key. При желании все дополнительные "аргументы" можно сделать полями
self. Тогда
default_factory должно получать два аргумента или больше, зависит только от вашей фантазии.

class MyDict(dict):
    def __init__(self, start_dict, default_factory):
        super().__init__(start_dict)
        self.__default_factory = default_factory

    def __missing__(self, key):
        self[key] = self.__default_factory(key)
        return self[key]

new_dict = MyDict({1: 1}, lambda key: f'this default value for {key}')
print(new_dict)
print(new_dict[10])
print(new_dict)

$ python my_dict.py
{1: 1}
this default value for 10
{1: 1, 10: 'this default value for 10'}

P.S. Пару слов про дизайн. Пока вы создаёте словарь, ключи по умолчанию - хорошо и весело. Потом будет худо: если вы опечатаетесь в имени ключа, никто вам не скажет про ошибку. Отлаживать такие вещи неприятно - баг в другом месте программы, где ваш словарь притворяется обычным словарём и никто не ожидает от него "волшебства". Посмотрите на dict.setdefault. Он во многих случаях решает проблему, хотя тоже не идеален.
P.P.S. collections.defaultdict - похожий дизайн.
P.P.P.S. Как может выглядеть идеальный дизайн? Во-первых, не хочется чтобы ключи создавались случайно. Во-вторых, функция которая создаёт значение по-умолчанию может быть медленной, не хочется её вызывать без необходимости (это недостаток
dict.setdefault - значение по-умолчанию вычисляется заранее, а ведь чаще всего оно не понадобится). В-третьих, значение по умолчанию может зависеть от массы данных которых нет в
self,
key.
Тяжеловесный код ниже решает все три задачи. Явный метод
self.set_def гарантирует от опечаток при использовании словаря.
default_factory не тратит время если ключ уже существует. Вы можете создавать разные
default_factory в зависимости от контекста вызова - ей доступны любые данные:

class MyDict(dict):
    def __init__(self, start_dict):
        super().__init__(start_dict)

    def set_def(self, key, default_factory):
        if key not in self:
            self[key] = default_factory()
        return self[key]

new_dict = MyDict({1: 1})
print(new_dict)
print(new_dict.set_def(10, lambda: 'this default value for 10'))
print(new_dict)


Счётчик внутри класса(Python)
Доброго времени суток :)
Помогите пожалуйста разобраться, а лучше объясните на пальцах.
Необходимо реализовать счётчик внутри класса, да и не обязательно внутри класса, но чтобы он работал в зависимости от количества обращенний к классу.
Пример следующий:

class Coordinates:
    count = 0

    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.count += 1

    def print_info(self):
        print(
            f'X: {self.x}\n'
            f'Y: {self.y}\n'
            f'Кол-во точек: {self.count}\n'
        )

coord_1 = Coordinates(10, 20)
coord_1.print_info()
coord_2 = Coordinates(15, 30)
coord_2.print_info()

Информация на выходе:

X: 10
Y: 20
Кол-во точек: 1

X: 15
Y: 30
Кол-во точек: 1

Понимаю что, я где-то что-то не дописал, но что именно не понимаю :(
Заранее спасибо
P.S.: Перечитал 10 раз свой вопрос, знаю что он глупый, но что-то самому никак не получается додуматься что с этим делать. Понимаю что по моему примеру счетчик всегда будет равен "1", так как каждый раз идёт обращение к классу где счетчик равен "0"

Чтобы жестко не привязываться к имени класса можно обратиться к атрибуту класса через classmethod. Примерно так:
<code>
class Coordinates:
    count = 0

    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.c()

    def print_info(self):
        print(
            f'X: {self.x}\n'
            f'Y: {self.y}\n'
            f'Кол-во точек: {self.count}\n'
        )

    @classmethod
    def c(cls):
        cls.count+=1
</code>


Можно создать вспомогательный фрейм
x из фрейма
df2:

x = pd.concat(df2
              .assign(Счётчик=df2.groupby("Магазин").cumcount().add(1))
              .apply(lambda x: pd.DataFrame({"Дата": pd.date_range(x["Начало периода"], x["Конец периода"])})
                                 .assign(Магазин=x["Магазин"], Счётчик=x["Счётчик"]),
                     axis=1)
              .to_numpy())

который будет выглядеть так:

In [135]: x
Out[135]:
        Дата Магазин  Счётчик
0 2020-01-01   first        1
1 2020-01-02   first        1
0 2020-01-04   first        2
1 2020-01-05   first        2
0 2020-01-03  second        1
1 2020-01-04  second        1
0 2021-02-06   third        1
1 2021-02-07   third        1
2 2021-02-08   third        1
0 2021-02-10   third        2
1 2021-02-11   third        2

после этого можно воспользоваться обычным
DataFrame.merge():

res = df
      .merge(x, on=["Магазин", "Дата"])
      .groupby(["Магазин","Счётчик"])
      ["Продажи"]
      .sum()
      .reset_index()

результат:

In [137]: res
Out[137]:
  Магазин  Счётчик  Продажи
0   first        1        3
1   first        2        5
2  second        1       55
3   third        1      600
4   third        2     1400


Python. Бинарное дерево, наследование класса, принадлежность объекта классу предка
Имеется бинарное дерево. Пр попытке наследования класса - дочерние узлы не принадлежат классу NewNode. Как решить эту проблему?
<code>
    class Node:
    def __init__(self, key=None):
        self.key = key
        self.left = None
        self.right = None

    def insert(self, key):
        if self.key is None:
            self.key = key
            return

        if key < self.key:
            if self.left is None:
                self.left = Node(key)
            else:
                self.left.insert(key)
        elif key > self.key:
            if self.right is None:
                self.right = Node(key)
            else:
                self.right.insert(key)
        else:
            return

class NewNode(Node):
    pass

def test_liskov_substitution():

    tree = NewNode()
    tree.insert(5)
    tree.insert(3)
    tree.insert(7)

    assert isinstance(tree.left, NewNode), "Sibling should be NewNode too"
    assert isinstance(tree.right, NewNode), "Sibling should be NewNode too"

tree = NewNode()
tree.insert(5)
print(tree.key)
tree.insert(8)
print(tree.right.key)
tree.insert(3)
print(tree.left.key)
test_liskov_substitution()
</code>

Когда создаёте новый экземпляр класса, вместо явного вызова
Node() получите имя класса из переменной
self.__class__ и используйте его.
Т.е., к примеру, вместо:

self.left = Node(key)

пишите так:

self.left = self.__class__(key)


Бесконечная музыка на фоне в Kivy
Необходимо реализовать бесконечную музыку на фоне. Ниже приведу фрагмент кода отвечающий за проигрывание музыки. Пожалуйста помогите исправить. На данный момент музыка проигрывается ровно на столько времени сколько занимает сама музыка. Есть ли способ сделать музыку бесконечной на протяжении всего времени пока приложение открыто? Спасибо.
<code>
self.music = SoundLoader.load('bg_music.mp3')
self.music.play()
</code>

Из документации kivy.core.audio
<code>
from kivy.app import App
from kivy.uix.label import Label
from kivy.core.audio import SoundLoader

class BGMusic(App):
    def build(self):
        self.play_music()
        return Label(text="BGMusic")
    def play_music(self):
        sound_loader = SoundLoader.load("music.mp3")
        sound_loader.loop = True
        if sound_loader:
            sound_loader.play()

def main():
    BGMusic().run()

if __name__ == '__main__':
    main()
</code>


Как закрыть .py из другого .py?
Хочу, чтобы мой код открывал файл .py и через некоторое время закрывал его.
Открывать я научился используя
subprocess.call
А вот закрыть никак не получается : (

import time
from time import sleep
from subprocess import call

call(["python", "my_program.py"])
time.sleep(5)
# тут надо закрыть my_program.py

Пробовал писать, но это не помогает.

file = 'my_program.py'
sys.exit(file)

Поискал в интернете, но все равно ничего не работает

Попробуйте библиотеку os
<code>
import os
import time
os.startfile('Степень.py')#Это открыть
time.sleep(2)
os.system('TASKKILL /F /IM py.exe')
</code>
но тут есть проблема оно закрывает всю действующие файлы питон и самого себя тоже.


Написать функцию, которая возвращает список интерфейсов, преобразуя указанный при запуске скрипта параметр
Нужно написать функцию, которая получает строку вида "1,5,6-10,Po25-Po30" и возвращает список, в котором содержится элементы Eth1,Eth5,Eth6,Eth7...Eth10,Po25,Po26...Po30, т.е к каждому числу подставляется Eth и если есть диапазоны, то они раскрываются.
Пример моего кода ниже. Но что-то мне он не сильно нравится, полагаю что можно сделать как-то удачнее.
<code>
interface_list = sys.argv[2].split(",")
def create_interface_list(interface_list):
"""
Преобразуем список, переданной в командной строке, в список интерфейсов
"""
updated_list = []
for intf in interface_list:
    if '-' not in intf:
        if 'Po'  in intf:
            updated_list.append(intf)
        else:
            if not is_arista:
                updated_list.append(f'Eth1/{str(intf)}')
            else:
                updated_list.append(f'Et/{str(intf)}')
    else: #Если указан диапазон портов, то преобразуем его в список
        if 'Po' in intf:
            intf = intf.replace('Po', '')
            int_range = list(range(int(intf.split('-')[0]), (int(intf.split('-')[1])+1)))
            for number in int_range:
                updated_list.append(f'Po{str(number)}')
        elif 'Po' not in intf:
            int_range = list(range(int(intf.split('-')[0]), (int(intf.split('-')[1])+1)))
            for number in int_range:
                if not is_arista:
                    updated_list.append(f'Eth1/{str(number)}')
                else:
                    updated_list.append(f'Et{str(number)}')
return updated_list
</code>

Разбор диапазона регулярным выражением покомпактнее будет...
<code>
import re

def create_interface_list(interface_list):
    """
    Преобразуем список, переданной в командной строке, в список интерфейсов
    """
    updated_list = []
    for intf in interface_list:
        prefix, start, end = re.findall(r"(\D+)?(\d+)-(?:\D+)?(\d+)", f"{intf}-{intf}")[0]
        if not prefix:
            prefix = 'Et/' if is_arista else 'Eth1/'
        updated_list.extend(map(f'{prefix}{{}}'.format, range(int(start), int(end)+1)))

    return updated_list
</code>


Как быстрее запускать Docker?
У меня есть
docker-compose для запуска скриптов на различных языках программирования:

version: '3.9'
services:
  python_runner:
    build:
       context: compilers/python  # путь до Dockerfile
       dockerfile: Dockerfile
    volumes:
       - ./temp:/temp   # текущая директория будет видна в /temp
    container_name: python_runner_container
    environment:
      - FILENAME=${FILENAME}

  cpp_runner:
    build:
      context: compilers/cpp  # путь до Dockerfile
      dockerfile: Dockerfile
    volumes:
      - ./temp:/temp   # текущая директория будет видна в /temp
    container_name: cpp_runner_container
    environment:
      - FILENAME=${FILENAME}
...

С сайта приходит код и язык, на котором он написан. Затем я создаю временный файл и из питона, при помощи библиотеки subprocess, выполняю команду:

docker run -i -v {self.current_path}/temp:/temp --rm --env FILENAME={filename} {compiler}

Переменные current_path, filename и compiler создаются заранее.
Код, присланный пользователем должен пройти тесты, по этому фактически я выполняю одну и ту же команду порядка 15 - 20 раз с различными stdin. В среднем выполнение одной команды занимает 1.8 - 2 сек, при том что сам код выполняется буквально за 0.006 сек.
Как мне ускорить этот процесс?

Вы неправильно используете докер в этом случае, а именно, неправильно запускать вашу команду на фазе создания образа (т.е. из Dockerfile).
Создайте образ один раз, а потом используйте его для запуска с разными входными параметрами. Что сейчас у вас входит в 2 секунды, от которых вы пробуете избавиться - не совсем ясно, но судя по вашем комментариям туда входит и создание образа, и это главная проблема.


Оптимизация кода по времени исполнения

import sys
t = int(sys.stdin.readline())
for i in range(t):
x1, p1 = map(int, sys.stdin.readline().split())
x2, p2 = map(int, sys.stdin.readline().split())
 if int((str(x1) + '0'*p1)) > int((str(x2) + '0'*p2)):
     print('>')
 elif int((str(x1) + '0'*p1)) < int((str(x2) + '0'*p2)):
     print('<')
 elif int((str(x1) + '0'*p1)) ==  int((str(x2) + '0'*p2)):
     print('=')

A. Длинное сравнение
ограничение по времени на тест 2 секунды
ограничение по памяти на тест 256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Монокарп выписал на доске два числа. Оба заданы в следующем формате: положительное целое число
x, к концу которому приписаны
p нулей.
Теперь Монокарп просит вас сравнить эти два числа. Можете ему помочь?
Входные данные
В первой строке записано одно целое число
t(1≤t≤104) — количество наборов входных данных.
В первой строке каждого набора входных данных записаны два целых числа
x1 и
p1 (1≤x1≤106; 0≤p1≤106) — описание первого числа.
Во второй строке каждого набора входных данных записаны два целых числа
x2 и
p2 (1≤x2≤106; 0≤p2≤106) — описание второго числа.
Выходные данные
На каждый набор входных данных выведите результат сравнения двух данных чисел. Если первое число меньше второго, то выведите '<'. Если первое число больше второго, то выведите '>'. Если они равны, то выведите '='.
Пример:
Входные данные
5
2 1
19 0
10 2
100 1
1999 0
2 3
1 0
1 0
99 0
1 2
Выходные данные
>
=
<
=
<
Примечание:
Сравнения в примере: 20>19, 1000=1000, 1999<2000, 1=1, 99<100.

Чтобы не оперировать большими числами, можно привести основания обоих чисел к одной разрядности. А дальше сравнивать показатели степени и сами числа.

for _ in range(int(input())):
    x1,p1 = input().split()
    x2,p2 = input().split()
    n1,n2 = len(x1), len(x2)
    x1,x2 = int(x1), int(x2)
    p1,p2 = int(p1), int(p2)

    if n1 < n2:
        d = n2 - n1
        p1 -= d
        x1 *= 10**d
    elif n1 > n2:
        d = n1 - n2
        p2 -= d
        x2 *= 10**d

    if   p1 < p2: print("<")
    elif p1 > p2: print(">")
    elif x1 < x2: print("<")
    elif x1 > x2: print(">")
    else:         print("=")

А в вашем коде просто надо избавиться от лишних преобразований (число-строка-число). И уж тем более не вычислять каждый раз числа в каждом if.

import sys
t = int(sys.stdin.readline())
for i in range(t):
    x1, p1 = map(int, sys.stdin.readline().split())
    x2, p2 = map(int, sys.stdin.readline().split())
    v1 = x1 * 10**p1
    v2 = x2 * 10**p2
    if   v1 > v2: print('>')
    elif v1 < v2: print('<')
    else:         print('=')


Почему мой скрипт ничего не возвращает?
Я пишу программу, которая должна выводить какой-то ответ в зависимости от того, что выбрано в нескольких select тегах
main.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Converter</title>
    <script src="eel.js"></script>
    </head>
  <body>
    <select name="type" id="type">
      <option></option>
      <option value="pp">Промышленные проекты</option>
      <option value="ppp">Потенциально промышленные проекты</option>
      <option value="np">Некоммерческие проекты </option>
    </select>
    <div id="project"></div>
    <div id="response"></div>
    <script type="text/javascript">
      const type = document.getElementById("type");
      const project = document.getElementById("project");
      const response = document.getElementById("response");
      var scnd;

      async function changeOption_(){
        let request = scnd.value;
        let result = await eel.listener(request)();
        response.innerHTML = result;
      }

      function changeOption(){
        if (type.value == "pp"){
          project.innerHTML = `<select name="scnd" id="scnd">
            <option value=\"vr\">В разработке</option>
            <option value=\"ukr\">Утверждённые к разработке</option>
            <option value=\"okr\">Обоснованные к разработке</option>
          </select>`;
          scnd = document.getElementById("scnd");
          scnd.addEventListener("change", changeOption_);
        } else if(type.value == "ppp"){
          project.innerHTML = `<select name="scnd" id="scnd">
            <option value=\"n\">None</option>
            <option value=\"ro\">Разработка ожидается/задерживается</option>
          </select>`;
          scnd = document.getElementById("scnd");
          scnd.addEventListener("change", changeOption_);
        }else{
          project.innerHTML = `<select name="scnd" id="scnd">
            <option value=\"n\">None</option>
            <option value=\"rnv\">Разработка не выяснена/нецелесообразна</option>
          </select>`;
          scnd = document.getElementById("scnd");
          scnd.addEventListener("change", changeOption_);
        }
      }

      type.addEventListener("change", changeOption);

    </script>
  </body>
</html>

main.py

import eel

eel.init("web")

eel.start("main.html", size=(700,700))

criteries = {'vr':'Probable Reserves'}

@eel.expose
def listener(code):
    return criteries.get(code)

Но когда я ввожу данные в надежде получить Probable Reserves, я не получаю ничего, никаких ошибок в отлатчике

во первых

eel.start("main.html", size=(700,700))

надо в самом конце, во вторых что бы всё вывелось надо в самой функции вместо
return criteries.get(code) написать
print(criteries.get(code))
то-есть код будет

import eel

criteries = {'vr':'Probable Reserves'}

@eel.expose
def listener(code):
    print(criteries.get(code))

eel.init("web")
eel.start("main.html", size=(700,700))

если хочешь что бы данные куда то отправлялись то

import eel

criteries = {'vr':'Probable Reserves'}

def func(obj):
    pass
    # ваш код

@eel.expose
def listener(code):
    func(obj="что-то")

eel.init("web")
eel.start("main.html", size=(700,700))


Как считать отмеченную роль в discord.py?
Я планирую сделать команду
!addrole @тест @<role>, но пока только вышло так:
!addrole @тест <role>.
Мне надо чтобы бот считывал
@<role> отмеченную в команде.
Код:

@bot.command()
async def addrole(ctx, member: ds.Member, role):
  dob_role = ds.utils.get(ctx.message.guild.roles, name=role)
  await member.add_roles(dob_role)
  await ctx.send(f'{member.mention} тебе была назначена роль {dob_role.mention}')

@bot.command()
async def addrole(ctx, member: ds.Member, role: ds.Role):
  await member.add_roles(role)
  await ctx.send(f'{member.mention} тебе была назначена роль {role.mention}')


python преобразовать список
Подскажите как можно преобразовать список с кортежем в строки не использую for. Наверное и join не подойдет.
Дело в том что мне нужно данный список отправить с помощью телеграм бота, а из списка он отправляет только 1 элемент.
Если преобазовать список в сроку, в телеграмм выглядит коряво, и без переносов.

[('10.10.10.11', 'Cisco Inc'), ('10.10.10.12', 'Cisco Inc'), ('10.10.10.13', 'Cisco Inc'), ('10.10.10.14', 'Cisco Inc')]

Хочется в телеграмм увидеть следующее

10.10.10.11 Cisco Inc
10.10.10.12 Cisco Inc
10.10.10.13 Cisco Inc
10.10.10.14 Cisco Inc

Вариант 1:

msg = "\n".join(" ".join(x) for x in data)

Вариант 2:

msg = "\n".join(map(" ".join, data))

вывод:

print(msg)
10.10.10.11 Cisco Inc
10.10.10.12 Cisco Inc
10.10.10.13 Cisco Inc
10.10.10.14 Cisco Inc


Как заменить табы (\t) на 4 пробела в Tkinter
У меня есть простенький редактор кода сделаной с Tkinter'ом с помощью
Text
При этом если нажать
TAB то появится как ни странно таб
Но мне нужны иммено 4 пробела вместо таба

Надо перехватить событие нажатия клавиши Tab. И в нём вставлять в тестовый виджет 4 пробела. Также из обработчика вернуть
break чтобы не сработал обработчик по-умолчанию.

import tkinter as tk

def tab_pressed(arg):
    #print("tab")
    text.insert(tk.INSERT, " "*4)
    return "break"

root = tk.Tk()
text = tk.Text(root)
text.pack()

text.bind("<Tab>", tab_pressed)
root.mainloop()


Выход из цикла while Python
Как сделать так чтоб слово 'quit' не входила в общий список гостей.
<code>
guestt = True
    while guestt:
        guestt = input("Pleas write your name: ")
        guest_list.write(f"Hello j{guestt} nice to meet you\n")
        if guestt == "quit":
            break
</code>

Я возможно не так вас понял. Но может быть вы хотели что-то такое:
<code>
guestt = True

while guestt:
    guestt = input("Pleas write your name: ")

    if guestt == "quit": # Условие надо поставить до добавления в список
        break

    guest_list.write(f"Hello j{guestt} nice to meet you\n")
</code>


непонятная ошибка в python
непонятная ошибка в коде на python
ругается на то что в какой то строчке не так указан "WeaponRarity", хотя всё указано правильно.
ошибка появляется через раз.
вот код:

    def meetShop():
        global hp
        global coins
        global damage

        def buy(cost):
            global coins
            if coins >= cost:
                coins -= cost
                printCoins()
                return True
            print(' ')
            print('твоих монет не хватает для покупки. попробуй вернутся позже, когда заработаешь побольше.')
            print(' ')
            return False

        WeaponLvl = r.randint(1, 5)
        WeaponDmg = r.randint(4, 10) * WeaponLvl + damage
        Weapons = ['стальной меч', 'кинжал', 'посох', 'титановый меч', 'топор мясника', 'лук', 'арбалет', 'копье']
        WeaponRarities = ['испорченный', 'обычный', 'редкий', 'мифический', 'легендарный']
        WeaponRarity = WeaponRarities[WeaponLvl]
        WeaponCost = r.randint (5, 18) * WeaponLvl
        Weapon = r.choice(Weapons)

        foutryHpCost = 10
        eightyHpCost = 18
        print (' ')
        print ('вы встретили торговца!')
        print(' ')
        printParameters()

        while hp > 0:
            MeetTor = input ('что будешь делать? (зайти/уйти):').lower()
            if MeetTor == 'зайти':
                print(' ')
                print('1) 40 hp -', foutryHpCost, 'монет')
                print('2) 80 hp -', eightyHpCost, 'монет')
                print('3) {0} {1} - {2} монет.'.format(WeaponRarity, Weapon, WeaponCost))
                print(' ')

                choice = input('торговец- Здравствуй странник, желаешь что то приобрести?:')
                if choice == '1':
                    if buy(foutryHpCost):
                        hp += 40
                        printHp ()
                        break
                elif choice == '2':
                    if buy(eightyHpCost):
                        hp += 80
                        printHp ()
                        break
                elif choice == '3':
                    if buy(WeaponCost):
                        damage = WeaponDmg
                        printDmg ()
                        break
                else:
                    print(' ')
                    print ('торговец- Прости, такого товара нет, но если появится я обязательно сообщю')
                    print(' ')
                    break
            elif  MeetTor == 'уйти':
                print(' ')
                print ('удачного пути!')
                print(' ')
                break
            else:
                continue

ошибка:

Traceback (most recent call last):
File "игра.py", line 328, in <module>
gameLoop()
File "игра.py", line 315, in gameLoop
meetShop()
File "игра.py", line 39, in meetShop
WeaponRarity = WeaponRarities[WeaponLvl]
IndexError: list index out of range

Возможно я понял в чем ошибка. В списке индексы идут от 0, а не от 1.
То есть не
1, 2, 3, 4, 5, а
0, 1, 2, 3, 4.
А у вас в строчке
WeaponLvl = r.randint(1, 5) стоит диапазон от 1 до 5. По этому, когда вы получаете значение 5 и происходит исключение
IndexError, так как элемента по индексу 5 не существует. А из-за того что вы генерируете случайные числа ошибка происходит через раз.
Решение:

WeaponLvl = r.randint(0, 4)


Наполнить столбец при условии совпадения с другим значениями
У нас есть два массива, в одном, Df1, товары и их номера.

Description
PN

SHAFT
333

ENGINE
444

ACTUATOR
555

В другом, Df2, на некоторые из номеров нам дали цену:

PN
P

333
100

444
200

Хотим добавить значения столбца "Р" напротив столбца "PN".

list= []
for h in df1['PN']:
        for u in zip(df2['PN'], df2['P']):
             if h==u[0]:
                 list.append(u)
a = len(df1['PN'])
b = len(list)
c = a - b
df1['P'] = list(list[1]).extend(['']*c)

то есть мы, если значение из столбца P равно значению столбцу PN, сделали список кортежей из совпадающих значений,
ввели новый столбец и выравняли его с длиной массива Дф1.
Остаётся только ввести эти совпадающие значения из списка кортежей в новый столбец,

for h in list[0]:
    for u in df1['PN']:
        for j in list[1]:
            if h==u:
                df1['P'].append(j)

Объект нового столбца - серия, но машина выдаёт ошибку на строку с аппэнд, что int ne iterable. Как можно доставить значения из того списка кортежей в тот столбец? спасибо.

Если вам надо объединить два дата фрейма, то почему не использовать метод
join. Пример из документации:

df = pd.DataFrame({'pn': ['K0', 'K1', 'K2', 'K3', 'K4', 'K5'],
                   'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']})
other = pd.DataFrame({'pn': ['K0', 'K1', 'K2'],
                      'p': ['B0', 'B1', 'B2']})
df.join(other.set_index('pn'), on='pn')

'''

   pn   A    p
0  K0  A0   B0
1  K1  A1   B1
2  K2  A2   B2
3  K3  A3  NaN
4  K4  A4  NaN
5  K5  A5  NaN


ошибка TypeError: execute expected at most 2 arguments, got 4
Я пытаюсь изучать Базу данных sqlite на python. Однако, выходит ошибка:

cur.execute("INSERT INTO names VALUES(?, ?, ?);", name, age,gender)
TypeError: execute expected at most 2 arguments, got 4

Не сильно понимаю, что не так с аргументами, поэтому попрошу помочь. Вот мой код:

import sqlite3

conn = sqlite3.connect('Lina.db')
cur = conn.cursor()

cur.execute("""CREATE TABLE IF NOT EXISTS names(
   name TEXT,
   age TEXT,
   gender TEXT);
""")
conn.commit()

name = input("Ваше имя: ")
age = input("Ваш возраст: ")
gender = input("Ваш пол: ")

cur.execute("INSERT INTO names VALUES(?, ?, ?);", name, age, gender)
conn.commit()

P.s Попробовал сделать так:

info = (name, age, gender)
cur.execute("INSERT INTO names VALUES(?, ?, ?);", info)

Это работает, но ради изучения мне всё равно нужно знать, как исправлять эту ошибку

В документации написано, что метод принимает два аргумента - строку запроса и кортеж аргументов
<code>
cur.execute("INSERT INTO names VALUES(?, ?, ?);", (name, age, gender))
</code>


Как сделать else не в функции [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.

Закрыт 1 год назад.

                        Улучшить вопрос

Хотел сделать калькулятор на питоне и проверку на то соответствует ли ответ пользователя, и есть такой вопрос, пайтон мне выдает ошибку:

    else:
    ^
SyntaxError: invalid syntax

при коде:

while True:

    def code():

        print(Back.RED)
        what = input("Что делаем? (+, -, *, /, %, ^): ")

        if what != ("+" and "-" and "*" and "/" and "%" and "^"):
            print("Не понял тебя")
        code()

    else:
    print(Back.MAGENTA)
    a = float(input("Введите первое число: "))
    print(Back.CYAN)
    b = float(input("Введите второе число: "))
    if what == "+":
        c = a + b

    if what == "-":
        c = a - b

    if what == "*":
        c = a * b

    if what == "/":
        c = a / b

    if what == "%":
        c = a % b

    if what == "^":
        c = a ** b

    print(Back.GREEN)
    print(Style.BRIGHT)
    print("Результат: " + str(c))

    input()

объясните пожалуйста что неправильно, сильно не ругайте, это моя вторая программа после hello world
Заранее спасибо за ответ!

Вы не можите использовать else если до него нету if, потому что else подразумвает что если не if или elif, то else, добавте перед else таб и все что идет дальше через два таба
P.S. добавьте после code() таб


Есть ли в Python аналог JS конструкции "?."?
В
JavaScript есть конструкция
foo?.bar, когда при обращении к несуществующему полю объекта возвращается
null
Существует ли подобное в
Python?

Синтаксической конструкции нет. Но вы можете использовать функцию
getattr, чтобы добиться такого же поведения:

bar = getattr(foo, 'bar', None)

А у словарей существует метод
get:

foo = {}
foo.get('bar')


Запись и чтения списка в текстовом файле
я хочу список ['ТЕКСТ', 'ТЕКСТ 1\nТЕКСТ 2', ['текст 3', 'текст 4']] записать в текстовый файл и при чтении текстового файла получать такой же список
<code>
mas = ['ТЕКСТ', 'ТЕКСТ 1\nТЕКСТ 2', ['текст 3', 'текст 4']]

with open('C:\\Code\\ST3\\e minor code\\profile.txt', 'w') as f:
    text = ''
    for i in range(len(mas)):
        if i == 0 or i == 1:
            text += '\n' + mas[i] + '\n'
        else:
            text += '\n' + '\n'.join(mas[i]) + '\n\n'

    f.write(text)

with open('C:\\Code\\ST3\\e minor code\\profile.txt', 'r') as f:
    mas_in = [line.strip() for line in f.readlines()]
    mas_out = []
    mas_end = [i for i in range(len(mas_in)) if mas_in[i] == '' or i == 0 or i + 1 == len(mas_in)]

    for i in range(len(mas_end) - 1):
        mas = [mas_in[j] for j in range(mas_end[i] + 1, mas_end[i + 1])]
        if i == 0:
            mas_out.append(mas[0])
        elif i == 1:
            mas_out.append('\n'.join(mas))
        else:
            mas_out.append(mas)

    mas_in = mas_out

</code>
Есть ли более рациональный способ решения данной задачи ?

В качестве одного из вариантов - сохранять как json.
<code>
import json

mas = ['ТЕКСТ', 'ТЕКСТ 1\nТЕКСТ 2', ['текст 3', 'текст 4']]

with open('file.txt', 'w') as f:
    json.dump(mas, f, ensure_ascii=False)

with open('file.txt', 'r') as f:
    new_mas = json.load(f)

print(new_mas)
</code>


Определить количество символов для каждой строки в текстовом файле
В текстовом файле для каждой отдельной строки определить количество в ней символов.
Пример:

Hello world!
Привет мир!
One, two, three

Результат:

13 symbols.
12 symbols.
16 symbols.

Я понял как посчитать количество символов для всего файла, но не могу понять как это сделать для каждой строки.
Мой код:

f1 = open('text.txt', 'r')
data = f1.read()
number_of_ch = len(data)
print(number_of_ch)

Открывайте файл в операторе
with - важный навык аккуратного программирования.
Файл в Питоне перебирается по строкам без дополнительных усилий.

print выводит свои аргументы через пробел - простое форматирование в вашем случае.

Код:

# with open('text.txt', encoding='utf-8') as f:
# если вы хотите читать файл в кодировке UTF-8 на Windows
with open('text.txt') as f:
    for line in f:
        print(len(line), 'symbols.')


Как сделать выполнение какой-либо команды в питоне в опр. период времени? [дубликат]

На этот вопрос уже даны ответы здесь:

Как правильно сделать временный цикл?

                                (4 ответа)

Закрыт 1 год назад.

Каждый раз перезапускать код не особо хочется, чтобы получать обновлённые данные - глупо и хотелось бы автоматизировать процесс. Можно ли сделать в питоне таймер, который бы активировал по своему окончанию код, а потом вновь отсчитывал время?

Вы можете сделать цикл:
<code>
import time

while True:
    time.sleep(10) # Ваш таймер, время в секундах
    # Ваш код
</code>


поиск простых чисел на python
помогите плис решить задачу на пайтон. допустим есть лист с числами  мне нужно найти простые числа и создать с ними новый лист.
входные данные
lst = [0,1,2,3,4,5,6,7,8,9,10,11]
выходные данные
res = [0,2,3,5,7,11]

def prime(n):
    res = []
    k = 0
    for i in n:
        l = i
        for k in range(2, l // 2 + 1):
            if (l % k == 0):
                k = k + 1
        if (k <= 0):
            res.append(l)
    return res

Исправляешь
is_prime из этого ответа (надо добавить проверку на 1) и делаешь

res = [x for x in lst if is_prime(x)]


Можно ли использовать selenium в телеграм боте на сервере [закрыт]

Закрыт. На этот вопрос невозможно дать объективный ответ. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.

Закрыт 1 год назад.

                        Улучшить вопрос

У меня есть бот на python, написанный на библиотеке aiogram, и в этом боте используется библиотека selenium. Сейчас мне необходимо выложить этого телеграм бота на сервер. Вопрос в следующем, насколько сложно это сделать, ведь для selenium необходимо установить драйвер geckodriver. Может кто-нибудь сможет подсказать, как это сделать правильно, и какой вообще хостинг для этого лучше использовать

Полагаю для теста подойдет бесплатный Heroku. Вот более детальная статья по установке geckodriver на Heroku
Если есть другой VPS/VDS с linux, то еще проще - глянь как установить на линукс


Как заполнить столбец pandas словарем?

Коллеги, такой вопрос возник, есть столбец pandas с пустыми значениями, как его заполнить именно словарем.

То есть должно получится:

      asset                        wk
0   RTSI.ME  {0: 1, 1: 0.24, 2: 0.45}
1       BTC  {0: 1, 1: 0.24, 2: 0.45}
2  DX-Y.NYB  {0: 1, 1: 0.24, 2: 0.45}
3      GC=F  {0: 1, 1: 0.24, 2: 0.45}
4      BZ=F  {0: 0.5, 1: 0.3, 2: 0.2}
5     RUB=X  {0: 1, 1: 0.24, 2: 0.45}
6   RTSI.ME  {0: 1, 1: 0.24, 2: 0.45}

Но сейчас получается:
      asset                        wk
0   RTSI.ME  {0: 1, 1: 0.24, 2: 0.45}
1       BTC                       0.3
2  DX-Y.NYB                       0.2
3      GC=F                       NaN
4      BZ=F  {0: 0.5, 1: 0.3, 2: 0.2}
5     RUB=X                       NaN
6   RTSI.ME                       NaN

Pandas итерирует присваиваемое значение value. А нужно чтобы он этого не делал. Превратить присваиваемое значение в строку, тоже не вариант. Потому что его потом надо вытаскивать, чтобы передавать дальше, а как его преобразовать в словарь не знаю. Пробовал, обойти не используя fillna через loc, но примерно таже проблема с попыткой интегрировать передаваемое значение словаря.

base_table = pd.DataFrame(
    {'asset': ["RTSI.ME", 'BTC', 'DX-Y.NYB', "GC=F", 'BZ=F', 'RUB=X', 'RTSI.ME'],
     "wk": [{0: 1, 1: 0.24, 2: 0.45}, np.NAN ,  np.NAN,  np.NAN,  {0: 0.5, 1: 0.3, 2: 0.2},  np.NAN, np.NAN]})  # добавляем базовые значения
base_table["wk"]=table["wk"].fillna(value={0: 0.5, 1: 0.3, 2: 0.2})#Заполняем пустые для которых значения не вычислены значениями по умолчанию. Конечно каждое значение wk добавить в свой столбец, но не хотелось бы идти по такому пути, потому что заполнять таблицу не удобно.


Можно ли использовать словари с командами?
пытался написать функцию с черепашей графикой используя словарь вместо ветвления
<code>
import turtle
t = turtle.Turtle()
d = {'f':t.fd(50), '+':t.lt(90)}
for i in range(4):
    d['f']
    d['+']
</code>
но в итоге он рисует лишь одну линию и поворачивает черепаху, и на этом всё.
Можно ли вообще так использовать словарь или я ерундой занимаюсь?

Так вы создаете словарь
строка-результат функции.
Чтобы вызывать функции используйте
lambda:

import turtle
t = turtle.Turtle()
d = {
    'f': lambda: t.fd(50),
    '+': lambda: t.lt(90),
}
for i in range(4):
    d['f']()
    d['+']()

Еще так можно передать заготовленной функции значение:

import turtle
t = turtle.Turtle()
d = {
    'f': lambda x: t.fd(x),
    '+': lambda x: t.lt(x),
}
for i in range(4):
    d['f'](50)
    d['+'](90)


Получить id последнего сообщение отправленного ботом
Например у нас есть переписка:
<code>
bot: Привет!
user: Привет!
user: Как дела?
*n-ое количество сообщений от user
</code>
Как получить id последнего сообщения, которое было отправлено ботом?

Можно поместить сообщение в переменную. Что то типа такого:

msg = bot.send_message(chat_id=chat_id, text='текст')

Затем отправить его в чат

bot.edit_message_text(chat_id=chat_id, message_id=msg.message_id, text='тут текст')

тогда id сообщения бота будет
msg.message_id


Python tkinter центрировать frame между двумя другими которые под side=left и side=right
Есть 2 frame'а, один расположен слева, второй справа. Нужно сделать, чтобы 3-ий frame располагался между ними. Фулл код:
<code>
import tkinter as tk
import tkinter.ttk as ttk

langs = ["English", "Russian"]

root = tk.Tk()
root.title("Translator")
root.resizable(0, 0)
root.geometry("1000x500")

frame1 = tk.Frame(root)
frame2 = tk.Frame(root)
frame3 = tk.Frame(root)

enter_text = ttk.Label(frame1, text="Enter text:", font="Arial 15", anchor="e")
enter_text.pack()

enter_field = tk.Text(frame1, font="Arial", height=20, width=40)
enter_field.pack()

lang1_text = ttk.Label(frame1, text="Source language:", font="Arial 15")
lang1_text.pack()

lang1_box = ttk.Combobox(frame1, values=langs, state="readonly")
lang1_box.pack()
lang1_box.current(0)

output_text = ttk.Label(frame2, text="Result:", font="Arial 15")
output_text.pack()

output_field = tk.Text(frame2, font="Arial", height=20, width=40, state="disabled")
output_field.pack()

lang2_text = ttk.Label(frame2, text="Output language:", font="Arial 15")
lang2_text.pack()

lang2_box = ttk.Combobox(frame2, values=langs, state="readonly")
lang2_box.pack()
lang2_box.current(0)

trans_btn = ttk.Button(frame3, text="\nTranslate\n", width=30)
trans_btn.pack()

frame1.pack(side="left")
frame3.pack()
frame2.pack(side="right")

root.mainloop()

</code>

Банально в той строчке где сейчас
frame3.pack():

frame3.pack(side="left", fill=tk.X, expand=True)


Как получить значения JSON в WebApp2
Столкнулся с проблемой получения данных из Json в WebApp2:

app = webapp2.WSGIApplication([Route('/test_addr', test_addr, 'test_addr')])

class test_addr(BaseWebHandler):
    def post(self):
        name = self.request.get('name')
        print('name=', name)

Через постман отправляю:

{"name": "тест дата"}

В постмане - пусто. А в принте:

('name=', '')

Вроде все как в документации, но не работает.
Кто работал с WebApp2 - как взять мне взять значение из Json по ключу
name?

Решение:
<code>
import json
def get_objJson(requestData):
    return json.loads(requestData.body)

app = webapp2.WSGIApplication([Route('/test_addr', test_addr, 'test_addr')])

class test_addr(BaseWebHandler):
    def post(self):
        objJson = get_objJson(requestData=self.request)
        print('name=', objJson['name'])
</code>


Как сделать чтобы бот писал участников голосвого канала? Discord.py
вот например пользователь пишут определенную команду и в это время он находится в голосовом канале с несколькими другими участниками и бот будет писать ники всех участников голосового канала в котором сидит  автор команды

@bot.command()
async def members_voice(ctx):
    await ctx.send(', '.join([member.mention for member in ctx.author.voice.channel.members]))


нужна помощь по задаче по классам с использованием try - except
Нужно создать программу, в которой я ввожу свои данные через консоль, и заполняю массив пользователей.
Есть класс пользователей User
str name
str surname
int age
А также конструктор для всех параметров.
В главном классе, то есть основной части, должен быть список пользователей, с максимальным размером 5 человек. Моя программа должна запрашивать пользователя ввести этих 5 пользователей через консоль.
Однако,  если я во время введения возраста введу неверные данные (не целое число), то программа должна автоматом ввести число 0 в поле возраста и добавить объект в список.
В конце ввода  программа должна вывести среднее значение возраста в списке.
вот мой код:
<code>
class User:
    name = ""
    surname = ""
    age = 0

    def __init__(self, name, surname, age):
        self.name = name
        self.surname = surname
        self.age = age

def result(self):
    count = 0
    sum_age = 0
    self.average = 0
    for i in users:
        sum_age += i.age
        count += 1
    self.average = sum_age / count
    print(self.average)

print('Input 5 users:')

u1 = User(input('Name: '), input('Surname: '), input('Age: '))
u2 = User(input('Name: '), input('Surname: '), input('Age: '))
u3 = User(input('Name: '), input('Surname: '), input('Age: '))
u4 = User(input('Name: '), input('Surname: '), input('Age: '))
u5 = User(input('Name: '), input('Surname: '), input('Age: '))

users = [u1, u2, u3, u4, u5]

for i in users:
    try:

    except:

for j in users:
    j.result()
</code>
я не могу понять как прописать в try except это условие "Однако,  если я во время введения возраста введу неверные данные (не целое число), то программа должна автоматом ввести число 0 в поле возраста и добавить объект в список."
и почему у меня не выводится средний возраст

Вы немного перемудрили. проверять возраст лучше сразу при создании объекта. Вычисление среднего возраста, по сути, не должно быть методом объекта

class User:

    def __init__(self, name, surname, age):
        self.name = name
        self.surname = surname
        try:
            self.age = int(age)
        except ValueError:
            self.age = 0

print('Input 5 users:')

u1 = User(input('Name: '), input('Surname: '), input('Age: '))
u2 = User(input('Name: '), input('Surname: '), input('Age: '))
u3 = User(input('Name: '), input('Surname: '), input('Age: '))
u4 = User(input('Name: '), input('Surname: '), input('Age: '))
u5 = User(input('Name: '), input('Surname: '), input('Age: '))

users = [u1, u2, u3, u4, u5]

sum_age = 0
for u in users:
    sum_age += u.age

print(sum_age/len(users))

Ну и ввод данных можете сделать попроще, чтоб не дублировать код

count = 5
print(f'Input {count} users:')

users = [User(input('Name: '), input('Surname: '), input('Age: ')) for _ in range(count)]


Как отловить событие, что пользователь в группе телеграм пригласил человека в чат
Появилась идея по приглашению людей в чат и после подсчета количества учатников, которых пользователь пригласил.
Не могу понять, есть ли возможность сделать такое?
Пишу на python aiogram

Ты не можешь отлавливать приглашения человека конкретным пользователем, но ты можешь отлавливать момент присоединения участника к чату


Событие выделения текста в TKinter
Я пишу GUI с использованием TKinter. И столкнулся с проблемой, на которую я не нашел решения:
В моём интерфейсе есть поле для ввода (
Entry). Пользователь вводит в него некую информацию. Мне нужно что-бы пользователь не мог выделить текст в этом поле. Это важно.
Я пробовал решить эту проблему тем, что создавал поток с помощью
Threading, и в бесконечном цикле очищал выделение с помощью
selection_clear(). Но сомневаюсь что это хорошее решение. Может есть способ отслеживать событие выделения текста в
Entry?

Не знаю есть ли нативный способ сделать это кодом на Питоне... Но т.к. в tkinter доступен интерпретатор Tcl/Tk, то через Tcl можно перехватить (переопределить) процедуру работы с созданным виджетом (в Tcl каждый виджет создаёт собственную команду (имеющую такое же имя как и сам виджет) для управления собой). А в этой процедуре просто ничего не делать, если её вызвали с параметрами
selection range (установка выделения), а для остальных вариантов вызова передавать управление старой процедуре. Эта блокировка будет работать даже с дефолтными биндингами, т.к. они тоже работают с виджетом через использование этой процедуры.

import tkinter as tk
from tkinter import ttk

def set_entry_no_select(root, entry):
    root.eval(f"""
        # Yeah, this is Tcl code inside Python :)
        rename {entry} {entry}_orig
        proc {entry} args {{
            if {{[string match {{se*}}    [lindex $args 0]] &&
                 [string match {{[atr]*}} [lindex $args 1]]}} {{
                # disable "selection adjust|to|range" sub-commands
                return
            }}
            tailcall {entry}_orig {{*}}$args
        }}
    """)

root = tk.Tk()

text = tk.StringVar(root, "Entry Entry Entry")
entry = tk.Entry(textvariable=text)
set_entry_no_select(root, entry)
entry.pack()

text2 = tk.StringVar(root, "TtkEntry TtkEntry TtkEntry")
entry2 = ttk.Entry(textvariable=text2)
set_entry_no_select(root, entry2)
entry2.pack()

root.mainloop()


Mse traning больше чем Mse testing. PyTorch ANN
<code>
inputs_train_torch = torch.from_numpy(inputs_train).float()
inputs_test_torch = torch.from_numpy(inputs_test).float()
outputs_train_torch = torch.from_numpy(outputs_train).float()
outputs_test_torch = torch.from_numpy(outputs_test).float()
model = torch.nn.Sequential(
    torch.nn.Linear(4, 15),
    torch.nn.ReLU(),
    torch.nn.Linear(15, 15),
    torch.nn.ReLU(),
    torch.nn.Linear(15, 1)
    )
criterion = torch.nn.MSELoss(reduction='mean')
criterion1 = torch.nn.L1Loss(reduction='mean')
optimizer = torch.optim.Adam(model.parameters(), lr=0.008)
for epoch in range(100):
    output = model(inputs_train_torch)
    loss = criterion(output, torch.reshape(outputs_train_torch, (81403, 1)))
    print('Epoch: ', epoch, 'MSE train: ', loss.item())
    output = model(inputs_test_torch)
    loss = criterion(output, torch.reshape(outputs_test_torch, (21654, 1)))
    print('Epoch: ', epoch, 'MSE test: ', loss.item())
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
for epoch in range(100):
    output = model(inputs_train_torch)
    loss = criterion1(output, torch.reshape(outputs_train_torch, (81403, 1)))
    print('Epoch: ', epoch, 'MAE train: ', loss.item())
    output = model(inputs_test_torch)
    loss = criterion1(output, torch.reshape(outputs_test_torch, (21654, 1)))
    print('Epoch: ', epoch, 'MAE test: ', loss.item())
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

Out[]:
Epoch:  86 MSE test:  0.03307786211371422
Epoch:  87 MSE train:  0.03682834655046463
Epoch:  87 MSE test:  0.031561754643917084
Epoch:  88 MSE train:  0.036547500640153885
Epoch:  88 MSE test:  0.028746912255883217
Epoch:  89 MSE train:  0.03666434809565544
Epoch:  89 MSE test:  0.02723623998463154
Epoch:  90 MSE train:  0.03619876876473427
Epoch:  90 MSE test:  0.02561429888010025
Epoch:  91 MSE train:  0.03621290624141693
Epoch:  91 MSE test:  0.025094548240303993
Epoch:  92 MSE train:  0.03558947145938873
Epoch:  92 MSE test:  0.024901267141103745
Epoch:  93 MSE train:  0.03537008538842201
Epoch:  93 MSE test:  0.024834109470248222
Epoch:  94 MSE train:  0.034832216799259186
Epoch:  94 MSE test:  0.0251359511166811
Epoch:  95 MSE train:  0.03468063473701477
Epoch:  95 MSE test:  0.024926314130425453
Epoch:  96 MSE train:  0.03419237211346626
Epoch:  96 MSE test:  0.025308404117822647
Epoch:  97 MSE train:  0.034069210290908813
Epoch:  97 MSE test:  0.02491961047053337
Epoch:  98 MSE train:  0.033683035522699356
Epoch:  98 MSE test:  0.025090258568525314
Epoch:  99 MSE train:  0.03355500474572182
Epoch:  99 MSE test:  0.02469632588326931
</code>
Почему MSE train больше чем MSE test. Как можно решить эту проблему? Пробовал поменять Lr и число элементов в слоях но лучший результат это.

    output = model(inputs_train_torch)
    loss = criterion(output, torch.reshape(outputs_train_torch, (81403, 1)))
    print('Epoch: ', epoch, 'MSE train: ', loss.item())
    output = model(inputs_test_torch)
    loss = criterion(output, torch.reshape(outputs_test_torch, (21654, 1)))
    print('Epoch: ', epoch, 'MSE test: ', loss.item())
    optimizer.zero_grad()
    loss.backward() # <-- обучение на лоссе теста!
    optimizer.step()

Так вы в итоге учите нейросеть именно на лоссе теста, поэтому она его хорошо и предсказывает! Учить модель нужно на трейне, а на тесте нужно только проверять качество обучения. А у вас всё наоборот получается, поэтому и качество на тесте больше, чем на трейне. Перенесите обучение на лосс трейна:

    output = model(inputs_train_torch)
    loss = criterion(output, torch.reshape(outputs_train_torch, (81403, 1)))
    print('Epoch: ', epoch, 'MSE train: ', loss.item())
    optimizer.zero_grad()
    loss.backward() # <- теперь модель учится на трейне
    optimizer.step()
    output = model(inputs_test_torch)
    loss = criterion(output, torch.reshape(outputs_test_torch, (21654, 1)))
    print('Epoch: ', epoch, 'MSE test: ', loss.item())

Я, кстати, не уверен, что тут вообще нужен
optimizer.zero_grad(), это не обнуляет обучение на каждой итерации цикла, у вас обучение вообще идёт со сменой эпохи?


Как отметить роль в discord.py?
Я хочу чтобы в сообщении бот отмечал @YouTube. Я поискал в интернете так и не нашёл, поэтому спрашиваю здесь       :)
Как отметить роль в discord.py?


Не находит файл
No such file or directory: 'IMG_20211227_220859.jpg'
listdir вроде бы выдает нужный список файлов, а random.choice выбирает один, но не пойму почему не находит, не там ищет? Вроде бы он должен полностью путь указывать в ошибке, но показывает одно имя файла. Помогите пожалуйста, головой бьюсь уже второй час.
<code>
if call.data == 'foto':
 img_list = os.listdir(configure.config['path'])
 img_otvet = random.choice(img_list)
 bot.send_photo(chat_id=call.message.chat.id, photo=open(img_otvet, 'rb' ))
</code>

listdir выдаёт только имена файлов. Надо имя соединить с путем к папке:
<code>
img_otvet = os.path.join(configure.config['path'], random.choice(img_list))
</code>


Ошибка: IntegrityError at / UNIQUE constraint failed: registration_choose.id
Делаю сайт на джанго. Я делаю голосование и хочу, чтобы в бд попадал проголосовавший пользователь, для чего пишу
voter.request.user. Но из-за этого возникает эта ошибка. Как мне ее исправить?

django.db.utils.IntegrityError: UNIQUE constraint failed: registration_choose.id
[28/Dec/2021 20:11:17] "GET / HTTP/1.1" 500 178087

views.py:

def home(request):
    value, created = Choose.objects.get_or_create(voter=request.user, pk=1)
    context = {
        "value": value,
    }

return render(request, 'registration/home.html', context)

def black(request):
    value, created = Choose.objects.get_or_create(voter=request.user, pk=1)

    if request.method == 'POST':
        select_action = request.POST['choose']

        if select_action == 'black':
            value.count_black += 1
            value.save()
        else:
            return render(request, 'registration/black.html', {"value": value})

        return redirect("home")

    context = {"value": value}
    return render(request, 'registration/black.html', context)

models.py:

from django.contrib.auth.models import User
from django.db import models

class Choose(models.Model):
    count_black = models.PositiveIntegerField(default=0, verbose_name="black")
    count_white = models.PositiveIntegerField(default=0, verbose_name="white")
    count_purple = models.PositiveIntegerField(default=0, verbose_name="purple")
    voter = models.ForeignKey(User, null=True, verbose_name='Пользователь',
    on_delete=models.PROTECT)

Метод
.get_or_create() возвращает объект, если он удовлетворяет условиям поиска. Иначе, он создаёт новый объект с переданными в него аргументами.
Судя по всему, в вашей БД уже есть один объект
Choose c
pk=1, но его
voter при вызове функции отличается, поэтому Джанго пытается создать объект с
pk=1 и
voter=reqeust.user. Но так как
pk является уникальным полем, что значит, что в базе не может быть два объекта с одним
pk , он выкидывает такую ошибку.
На мой взгляд, чтобы исправить эту ошибку, достаточно убрать аргумент
pk.


HTTP to HTTPS nginx flask
Недавно перешел в веб .
Нужна помощь в переадресации с HTTP на HTTPS .
Думаю эта информация понадобится :
Сайт на питоне (фреймворк flask) , порт 5000 , хостинг , nginx .
На данный момент сайт не имеет домен .
Код :
<code>

from func import *

from flask import Flask

app = Flask(__name__)

@app.route('/', methods = ['POST', 'GET'])
def index():
    return main()

@app.route('/<string:film>', methods = ['POST', 'GET'])
def find_(film):
    return result(film)

app.run(debug = True,port=5000,host="0.0.0.0")
</code>

<code>
from flask import Flask

app = Flask(__name__)

@app.route('/', methods = ['POST', 'GET'])
def index():
    return "main"

@app.route('/film', methods = ['POST', 'GET'])
def film():
    return "film"

if __name__ == "__main__":
    app.run(debug = True, port=5000, host="localhost", ssl_context='adhoc') #добавьте ssl_context='adhoc'
</code>
Только у вас сертификата не будет.


Python выполнение кода, но с возможностью ввода команды
<code>
def test():
    for i in range(100):
        print(i)
        time.sleep(5)

def main():
    while True:
        response = input(">>> ")

        if response == 'quit':
            # do something

</code>
Есть ли библиотека с помощью которой можно реализовать систему ввода команды в консоли, но в этот момент будет работать какая-нибудь функция? Например, происходит парсинг и сохранение данных в .txt формат. Пользователь вводит команду: quit. Программа должна завершить свой процесс и ожидать ввод новой команды. Доступ к консоли должен быть постоянным.

Если вам нужно выполнение второй функции как отдельный файл, можно использовать multiprocessing, более простой вариант - использование thread, т.е мултьипоточность


Вывести дубликаты в порядке появления
Дана строка:

s = 'asdf qwer zxcv. zxcv fdsa rewq. qazw asdf sxed. qwer crfv asdf.'

нужно получить все слова повторяющиеся более одного раза, в порядке их появления:

'zxcv asdf qwer'

Первым делом я привожу все к одному регистру, удаляю все знаки пунктуации и делю строку по пробелам на список слов:

s1 = re.sub(r'[^\w\s]', '', s.lower()).split(' ')

После чего я получаю список дубликатов:

s2 = [(i, s1.count(i)) for i in set(s1)]
ans = [i[0] for i in s2 if i[1]>1]

Как мне отсортировать этот список в порядке появления, как еще я могу получить этот список?
Еслия пробую через разницу списков , в ответе повторяются слова, а должны попадать только один раз:

 s1 = re.sub(r'[^\w\s]', '', s.lower()).split(' ')

 s2 = list(set(s1))

 for i in s2:
     if i in s1:

 s1.remove(i)

Для начала можно посчитать частоту вхождения слов:
Вариант 1 - воспользоваться collections.Counter:

from collections import Counter

freq = Counter(s1)

Вариант 2 - воспользоваться обычным словарем:

freq = {}
for word in s1:
    if word in freq:
        freq[word] += 1
    else:
        freq[word] = 1

Вариант 3 - воспользоваться collections.defaultdict:

from collections import defaultdict

freq = defaultdict(int)
for word in s1:
    freq[word] += 1

Чтобы получить список дубликатов из
freq:

res = [w for w,n in freq.items() if n > 1]

Во всех случаях результат должен получиться одинаковым:

In [352]: res
Out[352]: ['asdf', 'qwer', 'zxcv']

Можно сделать все за один проход по списку
s1:

freq = {}
res = []
for word in s1:
    if word in freq:
        freq[word] += 1
        if word not in res:
            res.append(word)
    else:
        freq[word] = 1


Ошибка при сравнении возведения в степень OverflowError: math range error
Написал программу, которая проверяет числа воздведенные в степень, но столкнулся с проблемой

import math

def compare_powers(n1,n2):
    x1, x2 = n1[0], n1[1]
    y1, y2 = n2[0], n2[1]

    if math.pow(x1,x2) == math.pow(y1,y2):
        return 0
    elif math.pow(x1,x2) > math.pow(y1,y2):
        return -1
    else:
        return 1

compare_powers([412222404,855201893], [205914948,950778202])

Я получаю такую ошибку:

OverflowError: math range error

А на
codewars не работает, пишет
Execution Timed Out, хотя это значения, которые в аргументах функции с их сайта

Тупое сравнение по количеству цифр, требуемое для записи результата в двоичной системе счисления.
<code>
from math import log2
def compare_powers(n1,n2):
    a = n1[1]*log2(n1[0])
    b = n2[1]*log2(n2[0])
    if   a > b: return -1
    elif a < b: return  1
    else:       return  0
</code>
В случае равенства, по хорошему, надо сравнивать уже значения.
Но в случае Codewars (если это эта задача) - проходит и так. :)


Как заменить цифры в двоичной CC на противоположные? [дубликат]

На этот вопрос уже даны ответы здесь:

Как поменять местами единицы и нули в двоичном представлении числа без перебора значений?

                                (2 ответа)

Закрыт 1 год назад.

Существует последовательность чисел, каждое из которых переводится в двоичную СС. Как заменить в каждом из получившихся чисел 0 на 1, и 1 на 0?
<code>
for i in range(0, 256):
    b = bin(i)[2:].zfill(8)

#тут нужна замена

    print(b)
</code>

Самое простое и короткое - использовать
str.maketrans и
str.translate:

t = str.maketrans('01', '10')
for i in range(0, 256):
    b = bin(i)[2:].zfill(8)
    b = str.translate(b, t)
    print(b)


декоратор внутри класса
хочу использовать декоратор внутри класса, но не знаю, как туда отправить аргументы из self (чертова инкапсуляция)
<code>
class FileCreator:
    def __init__(self, dir):
        self.dir = Path(dir)  # директория для хранения файлов
        self.data = datetime.today().strftime('%Y-%m-%d')  # сегодняшняя дата

    def _save_json(path):  # декоратор
        def decorator(self, func):
            print(self.dir)
            def wrapper(*args, **kwargs):
                output = func(*args, **kwargs)
                with open(self.dir / path, 'w', encoding='utf-8') as f:
                    json.dump(output, f, indent=4, ensure_ascii=False)
                return output
            return wrapper
        return decorator

    @_save_json('data.json')  # заданный аргумент декоратора
    def _make_data_json(self):  # метод, который хочу декорировать
        data = datetime.datetime.strptime(self.data, '%m/%d/%Y')
        data = {'data': data.date().strftime('%d.%m.%Y')}
        return data
</code>
в общем хотелось бы декоратор, в котором можно было бы прописать названия файла и он бы его сохранял как json в опред. папке, которая уже записана в self внутри класса.

Не стоит
_save_json втаскивать в класс. Понятно, что по логике он относится к нему, но там начинается путаница c self, его нужно определять как staticmethod, и это очень запутывает. Лучше вынести отдельно, т.к. декоратор - это просто функция, которая принимает и возвращает другую функцию, и никакая специфическая для классов логика в нём обычно не нужна.
Вот как-то так должно работать:

def _save_json(path):
    def decorator(func):                          # Здесь не нужен self
        def wrapper(self, *args, **kwargs):       # А вот как раз здесь self нужен
            output = func(self, *args, **kwargs)
            with open(self.dir / path, 'w', encoding='utf-8') as f:
                json.dump(output, f, indent=4, ensure_ascii=False)
            return data                           # А здесь, вероятно, не data, а output?
        return wrapper
    return decorator

class FileCreator:
    def __init__(self, dir):
        self.dir = Path(dir)
        self.data = datetime.today().strftime('%Y-%m-%d')

    @_save_json('data.json')
    def _make_data_json(self):
        data = datetime.datetime.strptime(self.data, '%m/%d/%Y')
        data = {'data': data.date().strftime('%d.%m.%Y')}
        return data


Raspberry Pi Python | Файл не сохраняется в указанную директорию
на Raspberry Pi 3 B+ с помощью Python хочу сохранить файлы в указанную директорию.
Вот отрывок кода:
<code>
 def Render(self, pic_path, dict_path):
    global t, dates1, dates2, dates3
    image = cv2.imread(pic_path)
    # print(image.shape) # Width, Height, numOfColorChannels
    # TODO: add possible frames
    # frame = image
    for i in range(3):
        if (i == 0):
            frame = image
            name = "\home\pi\Desktop\Hydro\Pictures\p1\p{}.png".format(t)
            dates1["Picture"] += [name]
        elif (i == 1):
            frame = image
            name = "\home\pi\Desktop\Hydro\Pictures\p2\p{}.png".format(t)
            dates2["Picture"] += [name]
        elif (i == 2):
            frame = image
            name = "\home\pi\Desktop\Hydro\Pictures\p3\p{}.png".format(t)
            dates3["Picture"] += [name]
        t += 1

        frameBGR = cv2.GaussianBlur(frame, (7, 7), 0) # blurr
        """kernel = np.ones((15, 15), np.float32)/255
        frameBGR = cv2.filter2D(frameBGR, -1, kernel)"""
        hsv = cv2.cvtColor(frameBGR, cv2.COLOR_BGR2HSV) # convert to hsv

        colorLow = np.array([49, 75, 0]) # TODO: correct low & high values (done)
        colorHigh = np.array([82, 255, 255])
        mask = cv2.inRange(hsv, colorLow, colorHigh) # hsv values to define mask

        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
        mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
        mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) # morphological transformation mask
        result = cv2.bitwise_and(frame, frame, mask = mask)
        IsWritten = cv2.imwrite(os.path.join(name), result)

        if (IsWritten):
            total_pix = result.size
            green_pix = np.count_nonzero(result)
            percentage = round(green_pix * 100 / total_pix, 2)
            if (i == 0):
                dates1["Green Pixels"] += [green_pix]
                dates1["Percantage"] += [percentage]
            elif (i == 1):
                dates2["Green Pixels"] += [green_pix]
                dates2["Percantage"] += [percentage]
            elif (i == 2):
                dates3["Green Pixels"] += [green_pix]
                dates3["Percantage"] += [percentage]
            HydroEye.Logs(1)
    stat = Statistic.Statistics()
    stat.create(dates1, dates2, dates3)

def Logs(self):
    f = open(os.path.join("/home/pi/Desktop/Hydro/Logs/Logs.txt"), "a", encoding="UTF-8")
    date = str(datetime.datetime.now().strftime("%d.%m.%y %H:%M:%S"))
    f.write(f"[{date}] Захват и анализ изображения.\n")
    f.close()
</code>
По итогу все файлы все равно сохраняются в корневую директорию и им присваивается название пути, по которому они должны были сохраниться. Перепробовал уже множество способов. В чём проблема?

Разделитель каталогов в линукс
/ а не
\. Исправьте слеши на прямые, но лучше пользуйтесь
pathlib.


Библиотеки для Decision Tree
Задача построит Decision Tree Regression используя разные библиотеки. Не знаете ли вы библиотеки для DT? Мне нужно лишь название библиотек.

Конечно же, первым делом нужно смотреть в
sklearn:

классический DecisionTreeRegressor
чуть более сложный ExtraTreeRegressor

Ну а после них уже можно переходить к ансамблям из множества деревьев в том же
sklearn:

случайный лес RandomForestRegressor
ещё вариант случайных деревьев ExtraTreesRegressor


get_object_or_404, Page not found
Я только начинаю изучать django, подскажите, пожалуйста, с чем связана ошибка Page not found (404)
No AkpVictim matches the given query?
Views.py

def victim(request):
    error = ''
    id_incidents = request.session.get('Id_Incidents', 'ничего не передано')
    if request.method == 'POST':
        form = AkpVictimForm(request.POST)
        if form.is_valid() and 'next' in request.POST:
            just_created = form.save(commit=False)
            just_created.An_Foreign_Field = get_object_or_404(AkpVictim, Id_Incidents=id_incidents)
            just_created.save()
            return redirect('main:group')
        elif 'back' in request.POST:
            return redirect('main:incident')
        else:
            error = 'Форма заполнена некорректно'

    form = AkpVictimForm()
    data = {
        'form': form,
        'error': error,
        'id_incidents': id_incidents,
    }
    return render(request, 'main/victim.html', data)

Urls.py

app_name = "main"

urlpatterns = [
    path('', views.start, name="start"),
    path('incident', views.incident, name="incident"),
    path('victim', views.victim, name="victim"),
    path('group', views.Groups.as_view(), name='group'),

get_object_or_404 как и следует из названия возвращает объект, а если он не найден, выкидывает эксепшн 404 страница не найдена. В вашем случае в AkpVictim нет записи с Id_Incidents=id_incidents.
Если вы предполагаете что в сессии может не быть id_incidents, то вместо
get_object_or_404 вам надо получать все
AkpVictim.objects.filter(Id_Incidents=id_incidents) и в зависимости от результата (найдена ли запись), обрабатывать запрос


Копирование словаря с вложенным списком и кортежем
Основной вопрос:
Почему в копии словаря 'new_var' значение словаря 'var' в индексе '[0]', 'list', меняется, а в '[1]', 'tuple', нет?
Ведь оба параметра в данном примере идут как вложения и что бы они не менялись, нужно использовать 'deepcopy'. В чем моя ошибка?
Весь код:

var = {'list': [[1, 2], ['a', 'b']], 'tuple': ('foo', 'bar', )}
new_var = var.copy()
var.update({'str': 'string'})
var['list'].append ([True, False])
var['tuple'] += ('baz', )

Идем пошагово.
Есть словарь:

var = {'list': [[1, 2], ['a', 'b']], 'tuple': ('foo', 'bar', )}

Создаем его копию (не глубокую):

new_var = var.copy()

Делаем 'var.update'

var.update({'str': 'string'})

Получаем 'var' и 'new_var':

{'list': [[1, 2], ['a', 'b']], 'tuple': ('foo', 'bar'), 'str': 'string'}
{'list': [[1, 2], ['a', 'b']], 'tuple': ('foo', 'bar')}

'var' обновился со значением '{'str': 'string'}',
а 'new_var' остался без изменений, т.к. это копия.
Далее делаем '.append':

var['list'].append ([True, False])

Получаем 'var' и 'new_var':

{'list': [[1, 2], ['a', 'b'], [True, False]], 'tuple': ('foo', 'bar'), 'str': 'string'}
{'list': [[1, 2], ['a', 'b'], [True, False]], 'tuple': ('foo', 'bar')}

Первый вопрос: Почему значение листа '[True, False]' было перенесено в копию 'new_var'?
(Полагаю потому, что это вложение в виде ссылки)
Далее добавляем пункт в 'tuple':

var['tuple'] += ('baz', )

Получаем 'var' и 'new_var':

{'list': [[1, 2], ['a', 'b'], [True, False]], 'tuple': ('foo', 'bar', 'baz'), 'str': 'string'}
{'list': [[1, 2], ['a', 'b'], [True, False]], 'tuple': ('foo', 'bar')}

Второй вопрос: Почему в этом случае 'baz' добавилось только в словарь 'var', но не в его копию 'new_var', как это было в прошлом пункте?
P.S. Вероятно, мой вопрос глупый, я только учусь.

Разница в том, что
tuple в Python является неизменяемым (immutable) объектом . Поэтому для кортежей не существует метода
.append() и   вам пришлось заменить значение по ключу
"tuple" ссылкой на новый кортеж.
Ваш пример:

Out[321]:
{'list': [[1, 2], ['a', 'b'], [True, False]],
 'tuple': ('foo', 'bar'),
 'str': 'string'}

In [322]: id(var["tuple"])
Out[322]: 140364687889408

In [323]: var['tuple'] += ('baz', )

In [324]: id(var["tuple"])
Out[324]: 140364687888704  # <--- обратите внимание на изменившийся `id` !

In [325]: var
Out[325]:
{'list': [[1, 2], ['a', 'b'], [True, False]],
 'tuple': ('foo', 'bar', 'baz'),
 'str': 'string'}

In [326]: id(new_var["tuple"])
Out[326]: 140364687889408  # <-- new_var["tuple"] все еще указывает на кортеж __до__ изменения

var['tuple'] += ('baz', ) эквивалентно:

var['tuple'] = var['tuple'] + ('baz', )

А
var['tuple'] + ('baz', ) создает новый кортеж с результатом сложения.


Как с помощью random.choice выбрать одну картинку из папки
Не хочу отдельно прописывать каждую картинку, можно ли сразу из папки выбирать?
Пишу бота в телегу, через телегбота
<code>
img_list = [r'C:\Users\Star\Desktop\telegbot\photo\photo1.jpg', r'C:\Users\Star\Desktop\telegbot\photo\photo2.jpg', r'C:\Users\Star\Desktop\telegbot\photo\photo3.jpg', r'C:\Users\Star\Desktop\telegbot\photo\photo4.jpg']

    img_path = random.choice(img_list)
    bot.send_photo(chat_id=call.message.chat.id, photo=open(img_path, 'rb'))
</code>

os.listdir(path) даёт список всех файлов в папке.

img_list = os.listdir(r'C:\Users\Star\Desktop\telegbot\photo\')

Возможно, потребуется отфильтровать только жипеги.


Вот моя реализация.
<code>
with open(r"matrix.txt", "r") as file:
    matrix = [list(map(lambda x: x[0]=='-', line.split())) for line in file]

height = len(matrix)
width = len(matrix[0])

c1, c2, area = (0, 0), (0, 0), 0

for row in range(height):
    for col in range(width):
            r, c = row, col
            while c < width and matrix[r][c]:
                c += 1

            while c > col and r < height:
                while r < height and all(matrix[r][col:c]):
                    r += 1
                a = (c - col) * (r - row)
                if a > area: c1, c2, area = (col, row), (c-1, r-1), a

                if r < height:
                    while c > col and not all(matrix[r][col:c]):
                        c -= 1
                    a = (c - col) * (r - row)
                    if a > area: c1, c2, area = (col, row), (c-1, r-1), a

print(c1, c2, area)
</code>


Определение типов в динамически типизированных языках
Пишу на динамических языках как Python, Common Lisp и тд. И вот, бывает просматриваю исходный код библиотек, если у них не хватает документации, и бывает проблема определить какого типа входные данные ожидает функция, конструктор и тд. В статическом языке я бы это увидел по описанию типа, а тут приходится гадать. Может есть какой-то способ узнавать какой тип ожидается, о котором я не знаю?
Например, функция ждет параметр с именем  id. В условном с++ я бы увидел string id, и понял бы.

Чаще всего, используемая библиотека все-таки содержит документацию. Плюс сейчас еще модно использовать опциональную стат.типизацию в Python и Ruby, как раз для этих целей.
Самый простой способ - посмотреть исходники. Если не помогает - запустить REPL (командой python для Python, irb для Ruby) и передать все мыслимые типы, которые, как вы подозреваете, могут подойти.
Оптимистичный способ - инструменты вывода типа. Обычно такие встроены в IDE и могут дать подсказку. Есть более продвинутые инструменты командной строки (typeprof в Ruby с недавних пор поставляется сразу), которые помогут вывести тип почти из любого кода.


Ну вы бы хоть что-то сами попытались. Это же элементарно:
<code>
res = data.groupby('id').sum() # .reset_index()
</code>


Как можно укоротить решение уравнений через sympy?
Я хотел бы сделать свой код приятнее по возможности. Как можно изменить код, чтобы не писать кучу таких условий? Функция принимает коэффициенты, знак и ответ. Уравнения имеют вид: k +/*- x = answer
<code>
def solve_type_5(K1, char4, A):
    if char4 == '-':
        return solveset(Eq(int(K1) - x, int(A)), x)
    elif char4 == '+':
        return solveset(Eq(int(K1) + x, int(A)), x)
    elif char4 == '/':
        return solveset(Eq(int(K1) / x, int(A)), x)
    else:
        return solveset(Eq(int(K1) * x, int(A)), x)
</code>

Попробуйте так, хотя приходится гадать, сработает ли в вашем случае - вы не дали полноценного примера кода, который можно было бы запустить и проверить:

from operator import add, sub, truediv, mul

def solve_type_5(K1, op, A):
    return solveset(Eq(op(int(K1), x), int(A)), x)

res = solve_type_5(K1, mul, A)

Ну либо если нужно именно из символов преобразовывать, то можно сделать словарь и преобразовывать символы в операции через него:

ch2op = {
    '-': sub,
    '+': add,
    '/': truediv,
    '*': mul
}
op = ch2op['-']
res = solve_type_5(1, op, 2)


Объединение списков словарей
Имеется список, внутри которого находятся другие списки. Вложенные списки могут быть либо строками, либо словарями. Нужно сгруппировать все вложенные списки-строки, идущие подряд, во вложенные списки.
Например:
Входные данные:
[["sth"], [{"a": 5}], [{"b": 10}], [{"test": 11}], ["test"], [{"c": 15}], [{"d": 20}]
Выходные данные:
[["sth"], [{"a": 5}, {"b": 10}, {"test": 11}], ["test"], [{"c": 15}, {"d": 20}]

test = [["sth"], [{"a": 5}], [{"b": 10}], [{"test": 11}], ["test"], [{"c": 15}], [{"d": 20}], ["test2"], [{"e": 25}]]
copy = test.copy()
print(copy)
temp = []

for item in copy:
    if not (isinstance(item[0], str)):
        print(f"Смотрим после {item[0]}")
        for j in range(copy.index(item), len(copy) - copy.index(item)):
            if not (isinstance(copy[j][0], str)):
                print(copy[j][0])
                temp.append(copy[j][0])
                copy[j][0] = ""
            else:
                break

print(copy.index(['']))
copy.insert(copy.index(['']), temp)
for item in copy:
    if (item == ['']):
        copy.pop(copy.index(item))

copy.pop(copy.index(['']))

Моя программа создает только первую группу списков

[['sth'], [{'a': 5}, {'b': 10}, {'test': 11}], ['test'], [{'c': 15}], [{'d': 20}], ['test2'], [{'e': 25}]]

Собираем в список элементы, пока одного типа, если разного, накопленный список добавляем в результат, а текущий элемент в новый аккумулятор
<code>
test = [["sth"], ['a'], [{"a": 5}], [{"b": 10}], [{"test": 11}], ["test"], [{"c": 15}], [{"d": 20}], ["test2"], [{"e": 25}]]

acc = [test[0][0]]            # сюда будем собирать внутренние списки
res = []                      # а сюда результат
for item in test[1:]:         # первый элемент уже там
    if isinstance(item[0], type(acc[0])):
        acc.append(item[0])
    else:
        res.append(acc)
        acc = item
res.append(acc)              # последний  список

print(res)
</code>


Не могу найти ошибку в коде. Задача с сайта ACMP (951 вирус)
На вход дают размены матрицы N, M (количество строк и столбцов соответственно). На 2 строчке число K - клеток с вирусами и сами клетки вирусов. Через каждую единицу времению происходит заражение ближайших клеток. Нужно вывести время заражения всей области.

Пример:
Ввод 4 5
2 2 1 4 5
Вывод 4

Мой код на 10 тесте выдает неправильный ответ

def f(e):
    gg=[]
    for i in range(n):
        for j in range(m):
            if e[i][j]==1:
                if (j+1)<m:
                    gg.append(i)
                    gg.append(j+1)
                if (j-1)>=0:
                    gg.append(i)
                    gg.append(j-1)
                if(i-1)>=0:
                    gg.append(i-1)
                    gg.append(j)
                if (i+1)<n:
                    gg.append(i+1)
                    gg.append(j)
    for i in range(0,len(gg),2):
        e[gg[i]][gg[i+1]]=1

    return e

gg=[]
n,m=map(int,input().split())
mas=[]
ss=0
fff=0
t=0
d=list(map(int,input().split()))
r=1
for i in range(n):
    ff=[]
    for j in range(m):
        if r<len(d):
            if (i+1)==d[r] and (j+1)==d[r+1]:
                ff.append(1)
                r+=2
            else:
                ff.append(0)
        else:
            ff.append(0)
    mas.append(ff)
    #print(mas)
for i in range(n):
    ss+=sum(mas[i])
if ss==n*m:
    print(0)
else:
    for i in range(80):
        mas=f(mas)
        ss=0
        t=t+1
        if fff:
            break
        ###print(t)
        for i in range(n):
            ss+=sum(mas[i])
            ###print(mas[i])
            if ss==m*n:
                print(t)
                fff=1
                break

Как минимум, у вас ошибка в алгоритме инициализации. Вы ожидаете на входе отсортированные координаты. Например, попробуйте переставить пары координат (
2 1 и
4 5) из вашего примера входных данных, и увидите, что начальное состояние вашей матрицы будет неправильное.
Вот такой ввод:

4 5
2 4 5 2 1

Ну и вообще, программу можно составить более компактно.

n,m = map(int, input().split())
matrix = [[False]*n for _ in range(m)]

x, *coords = map(int, input().split())
for i in range(x):
    matrix[coords[i*2+1]-1][coords[i*2]-1] = True

count = 0
while not all(sum(matrix, [])):
    new_matrix = [matrix[i].copy() for i in range(m)]
    for col in range(n):
        for row in range(m):
            if matrix[row][col]:
                for dc, dr in ((-1,0), (0,-1), (1,0), (0,1)):
                    c, r = col + dc, row + dr
                    if 0 <= c < n and 0 <= r < m:
                        new_matrix[r][c] = True
    count += 1
    matrix = new_matrix

print(count)


Python. Ошибка при запуске скомпилированного приложения на Windows
вчера столкнулся с такой проблемой, когда тестировал приложение Python в скомпилированном виде при помощи модуля Nuitka на виртуальной машине Windows 7.
При открытии приложения появлялось диалоговое окно с ошибкой : Запуск программы невозможен, так как на компьютере отсутствует python310.dll. Попробуйте переустановить программу.
Такая же ошибка появлялась и после переустановки программы. Возможно ли внести какие-либо коррективы в код, чтобы программа не выдавала ошибки?
Также хотелось бы отметить, что такая же ошибка возникает даже, если программа будет скомпилирована при помощи PyInstaller.

Ошибка в том что в windows 7 не поддерживается python 3.9+


Обработка одновременного нажатия двух клавиш
Я кажется немного понял на что python ругается, но до сих пор ломаю голову.

RuntimeWarning: coroutine 'move_ka' was never awaited
self.tk.mainloop(n)

сам код небольшой, признаюсь(я еще никогда не работал с этой библиотекой)
Почему она мне понадобилась?
Потому что когда я нажимаю две клавиши то ничего не происходит, так как работает только если одну клаву нажму (из кода сразу видно)
<code>
from tkinter import Tk, Canvas, PhotoImage

root = Tk()
root.geometry('700x500')
root.resizable(False,False)

canvas = Canvas(root, width=300, height=400)
canvas.pack()

my_obj = PhotoImage(file= здесь моя картинка)
id_img = canvas.create_image(50,50,anchor='c',image=my_obj) #Создаем картинку

async def move_ka(event):
    if event.keysym == 'Left':
        canvas.move(id_img, -4, 0)

async def move_ka2(event):
    if event.keysym == 'Right':
        canvas.move(id_img, 4, 0)

canvas.bind_all('<KeyPress-Left>', move_ka) #При нажатии вызываем функцию
canvas.bind_all('<KeyPress-Right>', move_ka2)

root.mainloop()

</code>
Сразу скажу что я думаю это происходит из-за root.mainloop()
подскажите пожалуйста,
НО другие ссылки прошу не кидать, я гуглил более часа!

Почему она мне понадобилась?
Потому что когда я нажимаю две клавиши то ничего не происходит, так как работает только если одну клаву нажму (из кода сразу видно)

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

from tkinter import Tk, Canvas, PhotoImage

root = Tk()
root.geometry('700x500')
root.resizable(False,False)

canvas = Canvas(root, width=300, height=400)
canvas.pack()

# my_obj = PhotoImage(file= здесь моя картинка)
# id_img = canvas.create_image(50,50,anchor='c',image=my_obj) #Создаем картинку
id_img = canvas.create_rectangle(50, 50, 100, 60)

# Клавиши изначально не нажаты
left = False
right = False

def left_pressed(event):
    global left
    left = True

def left_released(event):
    global left
    left = False

def right_pressed(event):
    global right
    right = True

def right_released(event):
    global right
    right = False

def move():
    # Периодически перемещаем доску на vel (скорость)
    vel = -4 * left + 4 * right  # (нажатая клавиша "Влево" добавляет к скорости -4, "Вправо" - +4)
    canvas.move(id_img, vel, 0)
    root.after(50, move)  # Повторить перемещение через 50 мс

move()

canvas.bind_all('<KeyPress-Left>', left_pressed)
canvas.bind_all('<KeyRelease-Left>', left_released)
canvas.bind_all('<KeyPress-Right>', right_pressed)
canvas.bind_all('<KeyRelease-Right>', right_released)

root.mainloop()

Более универсально - запоминать вообще все нажатые или отпущенные клавиши в множестве: при нажатии добавлять в множество, при отпускании - удалять из него. Скорость вычисляем через наличие "Left" или "Right" в этом множестве.

...

# Клавиши изначально не нажаты
pressed_keys = set()

def key_pressed(event):
    pressed_keys.add(event.keysym)

def key_released(event):
    pressed_keys.remove(event.keysym)

def move():
    vel = -4 * ("Left" in pressed_keys) + 4 * ("Right" in pressed_keys)
    canvas.move(id_img, vel, 0)
    root.after(50, move)  # Повторить перемещение через 50 мс

move()

canvas.bind_all('<KeyPress>', key_pressed)
canvas.bind_all('<KeyRelease>', key_released)

root.mainloop()


Автозаполнение бд sql из списка, минуя колонку с автоинкрементом
Всем привет, столкнулся с таким вопросом по заполнению таблицы SQL, при помощи языка Python. Как известно данные в таблицу из списка можно занести таким вот способом.

#Добавление набора данных
surnames = ["Ivanov", "Petrov", "Sergeeva"]
names = ["Denis", "Roman", "Nastya"]
phones = ["123", "345","678"]
ages = [20,25,27]
for i in range(len(surnames)):
    cursor.execute("""INSERT INTO users_base
                         VALUES ('%s','%s','%s','%d')
                         """ % (surnames[i], names[i], phones[i],ages[i]))
conn.commit()

Я хочу реализовать, чтобы эти данные заносились со сдвигом в один столбец, чтобы заполнение данными шло со второго столбца, а в первый столбец автоматически генерировался идентификатор . Значение переменной i занести нельзя, так как при повторном запуске произойдет ошибка. Как генерировать идентификатор я знаю, у меня вопрос, как сделать, чтобы данные из списка заносились начиная не с первого, а со второго столбца. Заранее спасибо за ответы.

Ожидаемый результат:
Id    Surname   Name   Phone   Age
---   -------   ----   -----   ---
      Ivanov    Denis  123     20
      Petrov    Roman  345     25
      Sergeeva  Nastya 678     27

P.S. Вариант с указанием названий столбцов я использовать не хочу, так как столбцов достаточно много(более 30). Таблица, которую я привел в вопросе - это упрощенный образец.

Есть пара вариантов решений:

явно указать названия колонок, куда вы заносите данные:

INSERT INTO `table_name` (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);

Указать значение DEFAULT для колонки, данные которой вы менять не хотите (например, для индекса с автоинкреиентом):

INSERT INTO `table_name` VALUES (DEFAULT, ?, ?, ?);


python разобрать файл для импорта в БД
Помогите разобрать файл на куски чтобы перенести информацию в БД.
На выходе хочется иметь удобный формат для БД, например словарь.
Кусков в {} будет несколько тысяч. Нужно каждый засунуть в БД.
<code>
{
  "obj": "1002",
  "name": "pos-04",
  "pos": null,
  "type": "scanner",
  "prod": "Lenovo",
  "model": "XCV2345",
  "serial": "34767fvfg77",
  "hdd": null
}
{
  "obj": "1002",
  "name": "pos-03",
  "pos": null,
  "type": "scanner",
  "prod": "Lenovo",
  "model": "XCV2345",
  "serial": "34767fvfg77",
  "hdd": null
}{
  "obj": "1002",
  "name": "pos-02",
  "pos": null,
  "type": "scanner",
  "prod": "Lenovo",
  "model": "XCV2345",
  "serial": "34767fvfg77",
  "hdd": null
}
</code>

Помогите разобрать файл на куски

Структура файла, которую вы показали, очень похожа на файл JSON. Если заменить null на что то вроде "None", то для считывания одной(!) порции подойдёт нечто вроде:
<code>
import json

def main():
    # Читаем словарь из файла
    with open('data.json', 'r') as f:
        data = json.loads(str(f.read()))

    print(data)

if __name__ == '__main__':
    main()
</code>
А так как Вам нужно прочитать множество словарей, то надо подумать, как объединить их всех в одну структуру. Может быть будет достаточно просто поставить фигурные скобки в начале и конце файла данных.


Как изменить ширину столбцов на Листе2 excel openpylx?
Меняю ширину столбцов с помощью данной конструкции
<code>
       #Записываем результат в файл
       result = df3.loc[df1.ne(df3).any(axis=1)]
             with ExcelWriter(f'{self.path}/Результат.xlsx', mode="a") as writer:
                 result.to_excel(writer, sheet_name="Лист2", header=None, index=False)

             #Меняем ширину столбцов
             wb1 = load_workbook(f'{self.path}/Результат.xlsx', read_only=False)
             sheet1 = wb1.active
             sheet1.column_dimensions['A'].width = 18
             sheet1.column_dimensions['B'].width = 15
             sheet1.column_dimensions['C'].width = 18
             sheet1.column_dimensions['D'].width = 130
             for r1 in dataframe_to_rows(result, header=False, index=False):
                 ws_mysheet1.append(r1)
             wb1.save(f'{self.path}/Результат.xlsx')
</code>
и всё работает на Лист1 но если с помощью её попробовать задать ширину на Лист2 ничего не происходит только повторно добавляется данные в Лист2?

Разобрался.
<code>
 #Записываем результат в файл
   result = df3.loc[df1.ne(df3).any(axis=1)]
         with ExcelWriter(f'{self.path}/Результат.xlsx', mode="a") as writer:
             result.to_excel(writer, sheet_name="Лист2", header=None, index=False)

         #Меняем ширину столбцов
         wb1 = load_workbook(f'{self.path}/Результат.xlsx', read_only=False)
         sheet1 = wb1['Лист2']
         sheet1.column_dimensions['A'].width = 18
         sheet1.column_dimensions['B'].width = 15
         sheet1.column_dimensions['C'].width = 18
         sheet1.column_dimensions['D'].width = 130

         wb1.save(f'{self.path}/Результат.xlsx')
</code>