Как добавить функцию блокировки (ban) при подборе логина и пароля в Python
Как добавить функцию блокировки (ban) при попытке подбора логина и пароля, к примеру если пользователь пытался войти 15 раз с неверным логином и паролем (
if not result:)
Функция входа:

def access_password_username(message, username):
    сon = sqlite3.connect(settings.DATA_BASE)
    cur = con.cursor()
    sql = """SELECT full_name from users WHERE username = ? AND password = ?;"""
    cur.execute(sql)
    result = cur.fetchall()
    if not result:
        msg = "⚠ Ошибка.\n Неверно веден Логин или Пароль."
        bot.send_message(message.chat.id, msg, reply_markup=st, parse_mode='HTML')
    else:
        for ln in result:
            msg = f"✅ Вход выполнен под {ln[0]}"
            bot.send_message(message.chat.id, msg, reply_markup=kb_student, parse_mode='HTML')
            return

Есть такая функция ban:

def blocked(message):
    try:
        db = sqlite3.connect(settings.DATABASE, check_same_thread=False)
        sql = db.cursor()
        sql.execute("SELECT user_id FROM USERS WHERE messageid = ?",(message.reply_to_message.message_id,))
        db.commit()
        Lusers = sql.fetchall()
        for i in Lusers:
            sql.execute("SELECT user_id FROM blocked WHERE user_id = ?",(i[0],))
            if sql.fetchone() is None:
                try:
                    bot.send_message(i[0],settings.BAN)
                    bot.send_message(message.chat.id, settings.Y_BAN + str(i[0]))
                    sql.execute("INSERT INTO blocked VALUES (?)",(i[0],))
                    db.commit()
                except:
                    bot.send_message(message.chat.id, settings.Y_BAN + str(i[0]))
                    sql.execute("INSERT INTO blocked VALUES (?)",(i[0],))
                    db.commit()
                    continue
        sql.close()
        db.close()
    except Exception as ee:
        # print("error in block" + str(ee))
        return

Сделал такой функционал,
NUMBER_OF_BAN_TO_SAVE = 15, в
if not result: добавил
add_saved_ban(user_id, username, password)

def get_saved_ban(user_id):
    sql = """SELECT user_id FROM saved_ban WHERE user_id = ?"""

    saved_ban_raw = DBManager.execute_sql(sql, (user_id,)) or []
    saved_ban = []
    for ban in saved_ban_raw:
        saved_ban.append(ban[0])

    return saved_ban

def add_saved_ban(user_id, username, password):
    user_saved_ban = get_saved_ban(user_id)

    if username in user_saved_ban:
        return

    sql = """INSERT INTO saved_ban(user_id, username, password) VALUES (?, ?, ?)"""

    DBManager.execute_sql(sql, (user_id, username, password,))

    if len(user_saved_ban) == (settings.NUMBER_OF_BAN_TO_SAVE - 1):
        add_user_ban(user_id)

def add_user_ban(user_id):
    sql = """INSERT INTO USER_BAN (user_id) VALUES (?)"""

    return DBManager.execute_sql(sql, (user_id,))


Как найти проверить в столбце в файле csv?
Подскажите, пожалуйста, как проверить(не найти) наличия id в столбце?
В моем примере я получаю кучу результатов
есть, а мне нужно добиться результата чтобы результат вернулся один
есть или
нету.

with open('bd/db.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        if user.id not in row:
            print('Есть')
        else:
            print('Нету')

Можно флаг завести:
<code>
with open('bd/db.csv') as csvfile:
    found = False
    reader = csv.DictReader(csvfile)
    for row in reader:
        if user.id in row:
            found = True
            break

    print('Есть' if found else 'Нету')
</code>


Telebot нужно создать условие
Всем привет, пишу бота помощника, для подготовки к ЕГЭ. Программирую не так давно, вот и возник вопрос: как считать время простоя?
То есть, если бот не видит ответа на вопрос в течение 30-50 сек, нужно прислать человеку что-то на подобии "Ало, ты тут?"
На заранее спасибо)

Вы можете использовать модуль threading.
Вот пример:
<code>
from telebot import *
import threading as thr

bot = TeleBot("token")

def time_reply(s):
    def worker():
        time.sleep(s)
        bot.send_message("chat id", "Ты еще тут?")

    a = thr.Thread(target=worker, daemon=True)
    a.start()

time_reply(50)

bot.polling()
</code>


Как отловить в Питоне inf, -inf, nan
Я чайник, не понимаю совсем как это сделать. Нужно чтобы код возвращался к стадии записи переменных в случае если
D == inf -inf nan, а если он не равен им, то продолжал работу по нахождению иксов. Код также отлавливает ошибки и возвращает к заполнению переменных если ввести строковое или символьное значения.

import math

while True:
    print("Введите коэффициенты для уравнения - целые или рациональные числа (не бесконечно большие или малые)")
    print("ax^1+bx+c=0")
    try:
        a = float(input("a="))
        b = float(input("b="))
        c = float(input("c="))
    except ValueError:
        print("Это не целое или рациональное число")
        continue
    D = b ** 2-4 * a * c
    print("Дискриминант D = %.2f" % D)

    # if D == float("inf") or float("-inf") or ("nan"):
    #     print("Габелла, переполнение")
    #     continue

    if D > 0:
        x1 = (-b + math.sqrt(D)) / (2 * a)
        x2 = (-b - math.sqrt(D)) / (2 * a)
        print("x1 = %.2f \nx2 = %.2f" % (x1, x2))
    elif D == 0:
        x = -b / (2 * a)
        print("x = %.2f" % x)
    else:
        print("Корней нет")
    break

На основе вашего кода,
continue должен вернуть цикл к моменту ввода переменных. А на
inf и
nan лучше проверять с помощью специальных функций пакета
math. Причём функция
isinf выдаёт
True и на
inf и на
-inf:

if math.isinf(D) or math.isnan(D):
    print("Габелла, переполнение")
    continue

Как правильно подсказывают в комментарии, проверка
if not math.isfinite(D): покрывает сразу все эти варианты.


Python - Pandas, расчет разницы времени
Всем привет! Есть таблица df, содержащая данные в формате "час:мин" и
для которой нужно рассчитать разницу между строками в минутах.
Текущий скрипт должен вернуть целое значение 65 (01:15 - 00:10), но пока он дает ошибку, что идет несоответствие форматов...
<code>
import pandas as pd
from datetime import datetime

df = pd.DataFrame({'Time':['00:10','01:15','02:45','04:00']})

corr1=str(df.iloc[0,:])
corr2=str(df.iloc[1,:])
res1 = datetime.strptime(corr1,'%H:%M')
res2 = datetime.strptime(corr2,'%H:%M')
diff=res2-res1

print(diff)
</code>

Ну вы бы посмотрели, что у вас в
corr1 и
corr2. Там такая строка (на примере
corr1):

'Time    00:10\nName: 0, dtype: object'

Нельзя просто брать и всё подряд в
str преобразовывать. Вот так будет работать (значение ячейки уже строка, просто нужно его правильно взять):

corr1=df.iloc[0,0]
corr2=df.iloc[1,0]

Результат после такого исправления:

1:05:00


NoReverseMatch at /info/1
весь день пытался понять почему выдаёт ошибку:
NoReverseMatch at /info/1
Reverse for 'like_book' with arguments '(None,)' not found. 1 pattern(s) tried: ['like/(?P[0-9]+)\Z']
views.py

def LikeView(request, pk):
    book = get_object_or_404(BookModel, id=request.POST.get('book_id'))
    book.likes.add(request.user)
    return redirect('more_info', pk=pk)

html

<form action="{% url 'like_book' book.pk %}" method='POST'>
           {% csrf_token %}
           <button type="submit" name="book_id" value="{{ book.id }}" class="btn btn-danger btn-sm">Like</button>
       </form>

urls.py

urlpatterns = [
   path('', index, name='index'),
   path('allbook', AllBookView.as_view(), name='allbook'),
   path('addbook', AddBookView.as_view(), name='addbook'),
   path('register', RegisterView.as_view(), name='reg'),
   path('login', LoginView.as_view(), name='login'),
   path('logout', LogoutView.as_view(), name='logout'),
   path('info/<int:id>', MoreInfoView.as_view(), name='more_info'),
   path('profile', profileview, name='profile'),
   path('password-change', ChangePasswordView.as_view(), name='change_pass'),
   path('like/<int:pk>', LikeView, name='like_book')

]

А если измените эту строку вот так. Будет работать?
<code>
book = get_object_or_404(BookModel, id=pk)

и тут вот так redirect('more_info') без pk=pk
</code>


Pandas выдает предупреждение. Как это исправить?
Код

passed = df[df['math score'] >= passmark]
passe = int(passed['math score'].count())
al = int(df['math score'].count())

passed_course = df[df['test preparation'] == 'completed'][df['gender'] == 'female'][df['math score'] >= passmark].groupby('gender')['gender']

no_course = df[df['test preparation'] != 'completed'][df['gender'] == 'female'][df['math score'] < passmark].groupby('gender')['gender']

print(f'Доля студентов сдавших экзамен по математике - \n{(passe/al)}\n')
print(f'Доля женщин проходивших курс и сдавших экзамен - \n{(passed_course.count()/al)}\n')
print(f'Доля женщин не проходивших курс и не сдавших экзамен - \n{(no_course.count()/al)}\n')

Предупреждение

C:\Users\Oskarr\AppData\Local\Temp/ipykernel_9044/835242634.py:6: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
  passed_course = df[df['test preparation'] == 'completed'][df['gender'] == 'female'][df['math score'] >= passmark].groupby('gender')['gender']
C:\Users\Oskarr\AppData\Local\Temp/ipykernel_9044/835242634.py:8: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
  no_course = df[df['test preparation'] != 'completed'][df['gender'] == 'female'][df['math score'] < passmark].groupby('gender')['gender']

Если вы хотите применить к датафрейму сразу несколько условий, то делать это нужно так, объединив маски "логическим and" (и обязательно взять условия в скобки, так нужно):

passed_course = df.loc[(df['test preparation'] == 'completed')&(df['gender'] == 'female')&(df['math score'] >= passmark)]

Т.е. выборку нужно производить по объединённой маске условия. У вас же получается цепочка выборок и пандас не уверен, что вы от него хотите, когда берёте по булевой маске датафрейма выборку из подвыборки этого датафрейма.
Ну то есть если посмотреть по шагам, то в выборке
df[df['test preparation'] == 'completed'] уже просто может быть меньше строк, чем в
df, а вы пытаетесь из неё сделать выборку по булевой маске
df['gender'] == 'female', которая будет иметь столько строк, сколько их было в исходном датафрейме. И для пандас это выглядит проблемой - булевая маска больше, чем число строк датафрейма, к которому она применяется. Да, по индексу их всё ещё можно сопоставить и выкинуть из маски те элементы, которых нет в индексе датафрейма, но выглядит это для пандаса подозрительно, о чём он и предупреждает.


Сортировка столбцов pandas
Всем привет! Изучаю pandas и никак не могу решить одну проблему
Есть DataFrame, который содержит 2 колонки, в котором нужная мне информация разделена между собой пустыми ячейками
Вот пример:

    A   B
0   NaN NaN
1   NaN NaN
2   H   1.0
3   G   2.0
4   F   3.0
5   E   4.0
6   D   5.0
7   C   6.0
8   B   7.0
9   NaN NaN
10  NaN NaN
11  NaN NaN
12  O   1.0
13  N   2.0
14  M   3.0
15  L   4.0
16  K   5.0
17  J   6.0
18  I   7.0
19  NaN NaN
20  NaN NaN
21  NaN NaN
22  O   1.0
23  NaN NaN
24  NaN NaN
25  NaN NaN
26  Q   1.0
27  P   2.0
28  NaN NaN
29  NaN NaN
30  V   1.0
31  U   2.0
32  T   3.0
33  NaN NaN

Я ищу способ, с помощью которого я смогу определить те строки, которые находятся после и до пустых ячеек и отдельно отсортировать их в алфавитном порядке
Вот что я пытаюсь сделать на основе первого примера:

    A   B
0   NaN NaN
1   NaN NaN
2   B   7.0
3   C   6.0
4   D   5.0
5   E   4.0
6   F   3.0
7   G   2.0
8   H   1.0
9   NaN NaN
10  NaN NaN
11  NaN NaN
12  I   7.0
13  J   6.0
14  K   5.0
15  L   4.0
16  M   3.0
17  N   2.0
18  O   1.0
19  NaN NaN
20  NaN NaN
21  NaN NaN
22  O   1.0
23  NaN NaN
24  NaN NaN
25  NaN NaN
26  P   2.0
27  Q   1.0
28  NaN NaN
29  NaN NaN
30  T   3.0
31  U   2.0
32  V   1.0
33  NaN NaN

И после этого я смогу удалить пустые ячейки с помощью df.dropna() и получить желаемый результат
До и после частей почти всегда разное количество пустых ячеек, сами эти части тоже содержать рандомное кол-во строк. Я пытался как-то это решить, но ничего не придумал)
Надеюсь я правильно и доступно объяснил и заранее спасибо за ответ!

Сделать новую колонку, поместить туда что-то вроде:

df['group'] = -df['A'].isna().cumsum()

После этого сортировать по нужным колонкам, включив эту колонку с группой на первое место, чтобы по нужным колонкам сортировка шла уже внутри группы между
NA, а не глобально:

df = df.sort_values(['group', 'B'], ascending=False)


plist не видит код plist файла
Программирую на питоне. Пишу программу для переработки файла и столкнулся с проблемой.
Встроенная библиотека plistlib наотрез отказывается видеть хоть что то в коде. Она возвращает просто пустой словарь.
Вот код plist файла (он в одну строку)

<?xml version="1.0"?><plist version="1.0" gjver="2.0"><dict><k>LLM_01</k><d><k>_isArr</k><t /><k>k_0</k><d><k>kCEK</k>4<k>k2</k><s>Unnamed 0</s><k>k4</k><s>H4sIAAAAAAAAC6WQwXEDIQxFG1Jm9AUCdnJyDS5ABbiFFB-DyGEjWDuTC395fB4sj3tqBMtsYhC1ZKJqgId4OMz2ASsGZrZqMGgfmrE1wxdsKFjeU-D_imOp6B3f8JZErO9fifpr_Ij4lUa3Gv7LbcpGQ48bEnEP9SgemZ6jf1cnM1qPezrGTMbogrFwy2P0VbAHiD9BICEcSonAep4nJXkC5nzmJfAy9y_7dV0PWGR96uTh1MmPwPWSR0_b9NtlP_xtqmtPwobny344d_YjrxuO9Xu6p7_emWde32fy4M_pkkdP2fTLpn_85t-oKs3OvQQAAA==</s><k>k5</k><s>Player</s><k>k13</k><t /><k>k21</k>2<k>k16</k>1<k>k80</k>53<k>k50</k>35<k>k47</k><t /><k>k48</k>29<k>kI1</k><r>-41.8</r><k>kI2</k><r>4.97752</r><k>kI3</k><r>0.6</r><k>kI6</k><d><k>0</k><s>0</s><k>1</k><s>0</s><k>2</k><s>0</s><k>3</k><s>0</s><k>4</k><s>0</s><k>5</k><s>0</s><k>6</k><s>0</s><k>7</k><s>0</s><k>8</k><s>0</s><k>9</k><s>0</s><k>10</k><s>0</s><k>11</k><s>0</s><k>12</k><s>0</s></d></d></d><k>LLM_02</k>35</dict></plist>

Подскажите пожалуйста что делать с библиотекой.

Надеюсь что это Вам поможет:

pip install xmltodict

from pprint import pprint
from typing import Iterable

from xmltodict import parse

plist_text = '<?xml version="1.0"?><plist version="1.0" gjver="2.0"><dict><k>LLM_01</k><d><k>_isArr</k><t /><k>k_0</k><d><k>kCEK</k><i>4</i><k>k2</k><s>Unnamed 0</s><k>k4</k><s>H4sIAAAAAAAAC6WQwXEDIQxFG1Jm9AUCdnJyDS5ABbiFFB-DyGEjWDuTC395fB4sj3tqBMtsYhC1ZKJqgId4OMz2ASsGZrZqMGgfmrE1wxdsKFjeU-D_imOp6B3f8JZErO9fifpr_Ij4lUa3Gv7LbcpGQ48bEnEP9SgemZ6jf1cnM1qPezrGTMbogrFwy2P0VbAHiD9BICEcSonAep4nJXkC5nzmJfAy9y_7dV0PWGR96uTh1MmPwPWSR0_b9NtlP_xtqmtPwobny344d_YjrxuO9Xu6p7_emWde32fy4M_pkkdP2fTLpn_85t-oKs3OvQQAAA==</s><k>k5</k><s>Player</s><k>k13</k><t /><k>k21</k><i>2</i><k>k16</k><i>1</i><k>k80</k><i>53</i><k>k50</k><i>35</i><k>k47</k><t /><k>k48</k><i>29</i><k>kI1</k><r>-41.8</r><k>kI2</k><r>4.97752</r><k>kI3</k><r>0.6</r><k>kI6</k><d><k>0</k><s>0</s><k>1</k><s>0</s><k>2</k><s>0</s><k>3</k><s>0</s><k>4</k><s>0</s><k>5</k><s>0</s><k>6</k><s>0</s><k>7</k><s>0</s><k>8</k><s>0</s><k>9</k><s>0</s><k>10</k><s>0</s><k>11</k><s>0</s><k>12</k><s>0</s></d></d></d><k>LLM_02</k><i>35</i></dict></plist>'

def od_to_dict(obj, **kwargs):
    from typing import Mapping

    if isinstance(obj, Mapping):
        obj = dict(obj)

        for key, value in obj.items():
            obj[key] = od_to_dict(value)

    elif isinstance(obj, str):
        return obj

    elif isinstance(obj, Iterable):
        return list(map(od_to_dict, obj))

    return obj

pprint(
    od_to_dict(
        parse(
            plist_text
        )
    )
)

Если не использовать дописанную od_to_dict то на выходе получите обычный OrderedDict

{'plist': {'@gjver': '2.0',
           '@version': '1.0',
           'dict': {'d': {'d': {'d': {'k': ['0',
                                            '1',
                                            '2',
                                            '3',
                                            '4',
                                            '5',
                                            '6',
                                            '7',
                                            '8',
                                            '9',
                                            '10',
                                            '11',
                                            '12'],
                                      's': ['0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0']},
                                'i': ['4', '2', '1', '53', '35', '29'],
                                'k': ['kCEK',
                                      'k2',
                                      'k4',
                                      'k5',
                                      'k13',
                                      'k21',
                                      'k16',
                                      'k80',
                                      'k50',
                                      'k47',
                                      'k48',
                                      'kI1',
                                      'kI2',
                                      'kI3',
                                      'kI6'],
                                'r': ['-41.8', '4.97752', '0.6'],
                                's': ['Unnamed 0',
                                      'H4sIAAAAAAAAC6WQwXEDIQxFG1Jm9AUCdnJyDS5ABbiFFB-DyGEjWDuTC395fB4sj3tqBMtsYhC1ZKJqgId4OMz2ASsGZrZqMGgfmrE1wxdsKFjeU-D_imOp6B3f8JZErO9fifpr_Ij4lUa3Gv7LbcpGQ48bEnEP9SgemZ6jf1cnM1qPezrGTMbogrFwy2P0VbAHiD9BICEcSonAep4nJXkC5nzmJfAy9y_7dV0PWGR96uTh1MmPwPWSR0_b9NtlP_xtqmtPwobny344d_YjrxuO9Xu6p7_emWde32fy4M_pkkdP2fTLpn_85t-oKs3OvQQAAA==',
                                      'Player'],
                                't': [None, None]},
                          'k': ['_isArr', 'k_0'],
                          't': None},
                    'i': '35',
                    'k': ['LLM_01', 'LLM_02']}}}


Как использовать список, который находится в родительском классе, в дочернем классе, который находится в другом файле?
У меня есть родительский класс, который находится файле test2.py

l = [[1,2], [3,4]]

class main:
     l1 = []

     def __init__(self, a, b):
         self.a = a
         self.b = b

     def solve(self):
         main.l1.append(self.a+3)

     def printtt(self):
         import test3
         p = test3.Segm(self.a, self.b)
         p.printt()

for i in l:
    w = main(i[0], i[1])
    w.solve()
w.printtt()

А также дочерний файл в файле test3.py

class Segm():
     def __init__(self, a, b):
         self.a = a
         self.b = b

     def printt(self):
         import test2
         o = test2.main(self.a, self.b)
         print(o.l1)

Мне нужно использовать список (находящийся в родительском классе в другом файле) в дочернем, все работает, но оно выводит то что мне нужно 2 раза, возможно кто знает как сделать так чтобы список выводился только 1 раз?
Вывод
[4, 6]
[4, 6]

Я не уверен что правильно понимаю то, что вы хотите сделать,
но предложу попробовать следующее:
main.py

from test3 import Segm                                     # +++

my_list = [
    [1, 2],
    [3, 4]
]

class Main:
    l1 = []

    def __init__(self, a, b):
        super().__init__()
        self.a = a
        self.b = b

    def solve(self):
        self.l1.append(self.a + 3)

    def printtt(self):
#         import test3
        segm = Segm(self)                                  # +++ (self)
        segm.printt()

for i in my_list:
    main = Main(i[0], i[1])
    main.solve()

main.printtt()

test3.py

class Segm():
     def __init__(self, parent):                # +++ parent
         self.parent = parent

     def printt(self):
         print(self.parent.l1)                  # +++ self.parent


Пожалуйста, помогите оптимизировать нечитабельный участок кода
Предыстория к коду: есть файл xlsx, в котором находятся объединенные ячейки, но объединены они криво, там где не нужно они объединены, там где нужно - могут быть обычными. Я решил, что легче взять просто всё строчки из этого файла, которые мне нужны, а значения None (None будут появляться, т.к. в объединенных ячейках заполняется лишь первая, крайняя левая), буду преобразовывать к прошлому значению, которое было известно. Всё это отрабатывает как нужно, теперь к коду:

mvz_list = ['1', '1', '1', '2', '3', '4', '5', '6', '7', '7']
filials = ['Краснодар', 'Краснодар', 'Краснодар', 'Москва', 'Санкт-Петербург', 'Санкт-Петербург', 'Сочи', 'Владимир', 'Владимир', 'Владимир']
list_of_all_used_values = []

for i, value_mvz in enumerate(mvz_list):
    print('-----------------------------------------------')
    print(f'Берем {value_mvz}')
    list_for_one_filial = []
    counter = 1
    if value_mvz not in list_of_all_used_values:
        list_of_all_used_values.append(value_mvz)
        list_for_one_filial.append(value_mvz)
        for i2 in range(len(mvz_list[i+1:])):
            if filials[i] == filials[i+counter]:
                if mvz_list[i + counter] not in list_of_all_used_values:
                    list_for_one_filial.append(mvz_list[i + counter])
                    list_of_all_used_values.append(mvz_list[i + counter])
                    counter+=1
            else:
                counter+=1
        print(f'Временный список для филиала {filials[i]}: {list_for_one_filial}')
        print(f'Список уже использованных значений: {list_of_all_used_values}') #Принтую просто для наглядности, чтобы посмотреть, что всё работает как нужно
        print('-----------------------------------------------')

        print(f'Производим некоторые действия для "временного списка": {list_for_one_filial}')

Списки
mvz_list и
filials - это и есть то, что я получаю при парсинге Excel своим способом, описанным выше.
Далее мне необходимо перебрать списки и для каждого филиала сформировать свой временный список со всеми значениями, которые относятся только к нему. Это определяется порядковым номером в списка. Если у
mvz_list[0] и
mvz_list[1] одинаковые
filials[0] и
filials[1] - значит это нам подходит и мы добавляем оба значения к временному списку этого филиала, чтобы уже далее работать с этим временным списком.
Конкретно этот кусок кода мне совершенно не нравится, но я не знаю, как же именно лучше сделать, чтобы сохранить хоть какую-то читабельность и функциональность.
Заранее извиняюсь, что расписал целую поэму, это сделано для того, чтобы была полная картина ситуации.
Если запустите код, то принтами будет выводиться то, что я имел ввиду.

Так не проще будет:
<code>
mvz_list = ['1', '1', '1', '2', '3', '4', '5', '6', '7', '7']
filials = ['Краснодар', 'Краснодар', 'Краснодар', 'Москва', 'Санкт-Петербург', 'Санкт-Петербург', 'Сочи', 'Владимир', 'Владимир', 'Владимир']
filial_mvz = dict()
for i in range(0, len(mvz_list) - 1):
    filial = filials[i]
    if filial in filial_mvz:
        mvz_set = filial_mvz[filial]
    else:
        mvz_set = set()
        filial_mvz[filial] = mvz_set
    mvz = mvz_list[i]
    mvz_set.add(mvz)

for filial, mvz_set in filial_mvz.items():
    list_for_one_filial = list(mvz_set)
    print(f'Временный список для филиала {filial}: {list_for_one_filial}')
    print('-----------------------------------------------')
</code>
?


Автоматическое заполнение пользователя в формах django
Есть модель Post, на основании которой создается форма PostForm и вьюха post_create.
Необходимо, чтобы имя автора поста автоматически подставлялось (создание поста доступно только авторизованному пользователю)
Модель

class Post(models.Model):
    text = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name='posts'
    )
    group = models.ForeignKey(
        'Group',
        blank=True,
        null=True,
        on_delete=models.SET_NULL
    )

    class Meta:
        ordering = ['-pub_date']

    def __str__(self):
        return self.text

форма

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ('text', 'group')
        widgets = {'author': forms.HiddenInput()}

вьюха

def post_create(request):
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():

            form.author = request.user
            form = form.save()
            return redirect(f'/profile/{author}/')
        else:
            return render(request, 'posts/create.html', {'form': form})
    else:
        form = PostForm()
        return render(request, 'posts/create.html', {'form': form})

Возможно initial поможет в вашем вопросе.
<code>
form = PostForm(request.POST, initial = {'author':request.user})
</code>


Не сохраняется данные в .db [закрыт]

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

 Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

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

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

Вопрос заключается в том что когда я хочу добавить новый студент код не сохраняет данные студента в файл .db? Файл .db создался но пустым.. a.save() не работает, там надо сохранять с id... Вот полный код:
<code>
    import shelve

    class Student():
        path = 'Students'
        def __init__(self, name, age, mark, level, id=None):
            self.name = name
            self.age = age
            self.mark = mark
            self.level = level
            self.id = id

        @property
        def name(self):
            return self.__name

        @name.setter
        def name(self, name):
            if isinstance(name,str) and name.isalpha():
                self.__name = name
            else:
                self.__name = "Ne pravilno"

        @property
        def age(self):
            return self.__age

        @age.setter
        def age(self, age):
            if isinstance(age, int) and age > 0 and age < 120:
                self.__age = age
            else:
                self.__age = 0

        @property
        def mark(self):
            return self.__mark

        @mark.setter
        def mark(self, mark):
            if isinstance(mark, int) and mark > 0 and mark < 10:
                self.__mark = mark
            else:
                self.__mark = 0

        @property
        def level(self):
            return self.__level

        @level.setter
        def level(self, level):
            if isinstance(level, int) and level > 0 and level < 5:
                self.__level = level
            else:
                self.__level = 0

        def save(self):
            with shelve.open(Student.path) as students:
                keys = list(students.keys())
                if len(keys) > 0:
                    id = int(keys[-1]) + 1
                    students[str(id)] = self
                else:
                    id = 1
                self.id = str(id)

        def update(self):
            with shelve.open(Student.path) as students:
                students[self.id] = self

        def objects():
            objs = []
            with shelve.open(Student.path) as students:
                for item in students.values():
                    objs.append(item)
            return objs

        def get_by_id(id):
            with shelve.open(Student.path) as students:
               return students[id]

        def __str__(self) -> str:
            return f'{self.id} {self.name} {self.age} {self.mark} {self.level}'

    def printList():
        for student in Student.objects():
            print(student)

    def Filtr():
        print("       Filter      ")
        print("1.Name")
        print("2.Level")
        print("3.Age")
        print("4.Mark")
        n = int(input("Answer: "))

        lpeopl = []
        if n > 0 and n <= 4:
            if n == 1:
                n = input("Vvedite pervuyu bukvu imeni: ")

                for item in Student.objects():
                    if item.name.startswith(n):
                        lpeopl.append(item)

                if len(lpeopl) != 0:
                    for item in lpeopl:
                        print(item)

            elif n == 2:
                n = input("Vvedite level: ")
                for item in Student.objects():
                    if item.level==n:
                       print(item)

            elif n == 3:
                n=int(input("Vvedite vozrast:"))
                for item in Student.objects():
                    if item.age==n:
                        print(item)

            elif n == 4:
                n=int(input("Vvedite ball:"))
                for item in Student.objects():
                    if item.mark==n:
                        print(item)

        else:
            print("Shu ikkitadan birini tanlang!")

    def menu():
        print("1. Vvesti na ekran spisok studentov")
        print("2. Dobavit noviy student")
        print("3. Filter studentov")
        javob = int(input("Otvet: "))
        if javob == 1:
            printList()
        elif javob == 2:
            ism = input("Student ismini kiriting: ")
            age = int(input("Yoshni kiriting: "))
            mark = int(input("Bahoni kiriting: "))
            level = int(input("Level kiriting: "))
            a = Student(ism, age, mark, level)
            a.save()
            printList()
        elif javob == 3:
            Filtr()
menu()
</code>

<code>
elif javob == 2:
    ism = input("Student ismini kiriting: ")
    age = int(input("Yoshni kiriting: "))
    mark = int(input("Bahoni kiriting: "))
    level = int(input("Level kiriting: "))
    a = Student(ism, age, mark, level)
    a.save()
    printList()
</code>
Тут я забыл после a.save() добавить a.update()
Всем спасибо за то что обращали внимание.
Вопрос решен.


Ошибка при создании таймера обратного отсчета в python
Пытаюсь создать таймер обратного отсчета на 3 минуты с помощью Python Tkinter. По истечении 3 минут окно должно закрыться. Возникает ошибка и я не могу понять почему. При запуске окна ничего кроме синей полоски на зеленом фоне нет.
Вот код:

from tkinter import *
from datetime import datetime
from time import strptime, time
from tkinter import *
from datetime import datetime
from datetime import timedelta

root = Tk()

root.title('QuizopTimer')

root.geometry('1000x800')

root['bg'] = 'limegreen'

def update_time():
    format = '%H:%M:%S'
    s2 = (datetime.now() + timedelta(minutes=3)).strftime(format)
    now = (datetime.now()).strftime(format)
    s3 = datetime.strptime(s2, format) - datetime.strptime(now, format)
    timerlbl.config(text=s3)
    if not s3 == '00:00:00':
        now2 = (datetime.now()).strftime(format)
        s4 = datetime.strptime(s2, format) - datetime.strptime(now2, format)
        timerlbl.config(text=s4)
    else:
        root.destroy()
    timerlbl.after(1000, update_time)

timerlbl = Label(root, font=('calibri', 50, 'bold'), background='blue', foreground='white')

timerlbl.pack(anchor=CENTER)
root.mainloop()

update_time()

Ошибка:

Возникло исключение: TclError
invalid command name ".!label"
  File "C:\Games\quizopfortrn\timertest.py", line 18, in update_time
    timerlbl.config(text=s3)
  File "C:\Games\quizopfortrn\timertest.py", line 31, in <module>
    update_time()

Первый вызов
update_time должен быть до вызова
root.mainloop(), т.к. всё что следует за ним будет выполнено только при завершении программы.
Второй момент, это замер прошедшего времени - он у вас при каждом вызове
update_time равен 3 минутам, потому что вычисляется внутри функции: вычисление финиша надо сделать один раз перед первым запуском таймера.

from tkinter import *
from datetime import datetime, time, timedelta

root = Tk()
root.title('QuizopTimer')
root.geometry('300x200')
root['bg'] = 'limegreen'

def update_time():
    now = datetime.now()
    if now < target:
        remains = round((target - now).total_seconds())
        text = time(second=remains % 60, minute=remains // 60).strftime(format)
        timerlbl.config(text=text)
    else:
        root.destroy()
    timerlbl.after(1000, update_time)

timerlbl = Label(root, font=('calibri', 50, 'bold'), background='blue', foreground='white')
timerlbl.pack(anchor=CENTER)

format = '%H:%M:%S'
target = datetime.now() + timedelta(minutes=3)

update_time()

root.mainloop()


Ожидание перед парсингом
Делаю парсинг сайта через requests + bs4.
Столкнулся с такой задачей: часть кода сайта записано в script и парсинг просто выдаёт пустое значение из-за того, что сам script сайта прогружается не вместе с html кодом.
Другими словами, я получаю
<div class="tab-cont"> </div>. Через простой браузер значения в этом поле я получаю через несколько секунд после прогрузки страницы, но через парсер получаю пустое значение.
Каким образом можно сделать вход на страницу, но выполнение get запроса через несколько секунд?

url = 'site.com'
r = request.get(url, headers=header)
soup = BeautifulSoup(r, 'html.parser')
info = soup.find('div', class_ = 're-tab-cont')

>>> info = <div class="detail-tab-cont"> </div>

Что бы парсить сайт, который подгружается динамически - вам нужно использовать selenium, и там есть специальный модуль
implicitly_wait()

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

options = Options()
driver = webdriver.Firefox(options=options)
driver.implicitly_wait(5.5)

Так же можете использовать решение из коробки с помощью
time

from time import sleep

time.sleep(5.5)


Как в датафрейме найти столбец с наибольшим числом Nan значений и вывести его индекс и количество таких значений
Работаю с большим csv файлом с помощью pandas.
df.isnull().sum() выводит все столбцы, а как определить тот, где больше всего пропущенных значений?

df.isnull().sum().idxmax()

Название столбца с максимальным количеством пропущенных значений

df.isnull().sum().max()

Вывод значения максимума в столбце


Оптимизация отрисовки спрайтов и фона
Возможно ли как то оптимизировать отрисовку да бы не просаживать fps?
Я загружаю в проект фоны(1920х1080) и спрайты(900х1080, в формате png c прозрачным фоном), и подгоняю их под нужные размеры окна через
pg.transform.scale.
При отрисовке окна в фуллскрин fps падает с 60 до 40, а нагрузка на процесс возрастает до 20%
Я так же проверил... происходит ли постоянное обновление... и нет... нет ничего такого что бы сильно нагружало.

Нашел причину!
Я не совсем понимаю как... но оно так...
Я импортировал изображение спрайта добавив к нему
.convert_alpha()
Так что бы получилось
self.image = pg.image.load(image_file).convert_alpha()
И fps перестал скакать, надеюсь это кому-то поможет


Как в питоне объединить 2 массива в один?
Как в этом примере объединить эти два массива в один?

from array import *
f = array('i', [1, 3, 5, 6, 0])
c = array('i', [0, 2, 4, 7, 9])

Вывод:

[1, 3, 5, 6, 0, 0, 2, 4, 7, 9]

Я что-то не понимаю, или ответ ниже?:-)
<code>
from array import *
f = array('i', [1, 3, 5, 6, 0])
c = array('i', [0, 2, 4, 7, 9])

print (list (f+c)) # [1, 3, 5, 6, 0, 0, 2, 4, 7, 9]

</code>


Как реализовать key в сортировке?
Допустим, есть какая-нибудь сортировка, например, пузырьком:

def bubble_sort(array):
    for i in range(len(array) - 1):
        for j in range(len(array) - i - 1):
            if array[j] > array[j + 1]:
                array[j], array[j + 1] = array[j + 1], array[j]

bubble_sort([63, 80, 62, 69, 71, 37, 12, 90, 19, 67])

У меня есть массив кортежей вида:
[('name', 5, 5), (...), (...)]
Я могу его отсортировать как мне нужно с помощью встроенной сортировки:

sorted(data, key=lambda x: (-x[1], x[0], -x[2]))
Как реализовать в своей сортировке (в данном случае в сортировке пузырьком) этот аргумент key? Чтобы он сортировал сначала по возрастанию, потом по убыванию, в общем, получить такой же функционал, который выше (как у встроенной сортировки)

Добавить параметр
key, во всех сравнениях его использовать. Всё:

def bubble_sort(array, key=lambda x: x):
    for i in range(len(array) - 1):
        for j in range(len(array) - i - 1):
            if key(array[j]) > key(array[j + 1]):
                array[j], array[j + 1] = array[j + 1], array[j]


Как обработать телефонный номер python [дубликат]

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

Неправильно работает сравнение переменной с несколькими значениями через or

                                (3 ответа)

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

Мучаюсь и не понимаю, к делу. Есть код который должен вывести какой оператор у номера телефона
<code>
phone = '0501177711'

if int(phone[0]) == 0:

        if int(phone[1:3]) == 67 or 68 or 96 or 97 or 98:

            operator = 'Киевстар'

        elif int(phone[1:3]) == 50 or 66 or 95 or 99:

            operator = 'Vodafone'

        elif int(phone[1:3]) == 63 or 73 or 93:

            operator = 'Lifecell'
</code>
Ответ: Киевстар, хотя должно выбить водафон и так уже полтора часа сижу. В чём проблема может быть? Я пробовал и str и int приравнивать но не выходит

@Kowl так ты пишешь одно условие:
int(phone[1:3]) == 67, а дальше одни or идут, так же нельзя делать, ты по сути строишь условия типа ЧИСЛО ИЛИ ЧИСЛО. Ты пиши тогда
int(phone[1:3]) == 67 or int(phone[1:3]) == 96. Но лучше вообще просто сделать так:
if int(phone[1:3]) in (67, 68, 96, 97, 98)
upd: Можно писать и так, по идее, должно быть быстрее:

if phone.startswith(('67', '68', '96'), 1, 3)


Как починить PyCharm на Ubuntu?
Установил PyCharm Community 2022.1 через snap на Kubuntu 22.04 LTS.Потом скачал проект с гитхаба через Get From VCS и после решил добавить интерпретатор через настройки, но вылазиет ошибка "Directory /home/user/project/venv/bin/python not found". Как ее решить?По умолачанию в дистрибутиве установлен Python версии 3.10.4.

Мне помогло следующее
<code>
$ sudo apt install python3-pip
$ pip3 install virtualenv
</code>


Сумма соседних элементов в матрице
не могу понять как двигаться дальше, вроде бы строку и столбцы нашёл, но не знаю правильно ли,  как мне найти сумму соседних элементов, направьте в правильное русло мышления
<code>
b = input()
a = []
while b != 'end':
    a.append([int(i) for i in b.split()])
    b = input()
for row in range(len(a)):
    for col in range(len(a[row])):
</code>

на просторах интернета нашел один лайфхак, когда мы итерируем и боимся выйти за пределы индекса, нужно вычесть из координаты длину объекта, так перейдем в обратное индексирование для вашего случая сумма соседних по строке(для первого: второй и последний) выглядит так :
<code>
s = a[col][row-1] + a[col][row-len(row)+1]
</code>


python как получить возвращаемое значение асинхронной функции
Как можно получить возвращаемое значение асинхронной фукнции
<code>
import asyncio

async def test(asd: bool):
    if asd is True:
        print("true")
        return True
    else:
        print("not true")
        return False

# наподобие обычной функции
res = test(asd=0)
print(f"{res=}, {type(res)=}")
</code>

import asyncio

async def test(asd: bool):
    if asd is True:
        print("true")
        return True
    else:
        print("not true")
        return False

my_response = asyncio.run(test(asd=0))   # нашел такое решение работающее :)


Не записываются заголовки в csv файл

Сейчас заголовок записывается только в последний csv файл  noncontr_lv.csv
Как сделать чтобы заголовки записывались во все файлы  ?

мой код :

import ast
import csv

def contract_lv(list_d, write_header):
    with open('contract_lv.csv', 'a+', encoding='utf-8', newline='') as file_lv:
        writer = csv.writer(file_lv, delimiter=";")
        if write_header:
            writer.writerow(['Customer ID'])
        print(final_date['CustomerId'], file=file_lv, sep=';')

def post_lv(final_date, write_header):
    with open('post_lv.csv', 'a+', encoding='utf-8',newline='') as file_post_lv:
        writer = csv.writer(file_post_lv, delimiter=";")
        if write_header:
            writer.writerow(['CardNumber'])
        print(final_date['CardId'], file=file_post_lv, sep=';')

def noncontract_lv(final_date, write_header):
    with open('noncontr_lv.csv', 'a+', encoding='utf-8',newline='') as file_noncontr_lv:
        writer = csv.writer(file_noncontr_lv, delimiter=";")
        if write_header:
            writer.writerow(['Agreement Nr'])
        print(final_date['AgreementID'], file=file_noncontr_lv, sep=';')

with open('2222222.txt', 'r', encoding='utf-8') as file:
    lines = file.readlines()
    write_header = True
    for line in lines:
        final_date = ast.literal_eval(line)
        if final_date["ContractType"] == "Yes":
            contract_lv(final_date, write_header)
            write_header = False
        elif final_date["ContractType"] == "Yes":
            post_lv(final_date, write_header)
            write_header = False
        elif final_date["ContractType"] == "None":
            noncontract_lv(final_date, write_header)
            write_header = False

import csv

headers = ['Name', 'Birthday', 'Height']

data = [
    ['Илья', '1999-12-02', '195'],
    ['Alex', '2000-05-11', '188']
]
# Если в данных есть кирилица и вы их потом собираетесь открывать в Excel
# То лучше используйте кодировку utf-8-sig и unix_dialect
with open('my.csv', 'w', encoding='utf-8-sig', newline='') as file:

    writer = csv.writer(file, dialect=csv.unix_dialect)
    writer.writerow(headers)
    writer.writerows(data)

"Name","Birthday","Height"
"Илья","1999-12-02","195"
"Alex","2000-05-11","188"

Но если по честному, посмотрите на pandas, вы очень просто раскидаете по условиям по DataFrame и каждый из них сохраните хоть в excel хоть в csv хоть в json


как измерить время выполнения кода в python?
...есть ли в PyCharm встроенная возможность отслеживать время выполнения?

import time

start = time.time() ## точка отсчета времени

##код программы

end = time.time() - start ## собственно время работы программы

print(end) ## вывод времени


Как работает выделение и освобождения памяти для процесса?
Если смотреть на определенном уровне абстракции то все понятно, мы запрашиваем у ОС память она нам выделяет страницы определенного размера и шлет их адреса.
Вопрос как это работает на более глубоком уровне.

Мы запустили новый процесс (прости бинарник скомпилированный), ему ОС уже выделила адреса, в какой момент она их выделила? можем ли мы получить все эти адреса? Для своего внутреннего использования.
После того как мы получили адреса, правильно ли я понимаю что нам больше нет необходимости обращаться к ОС и мы будем брать эти адреса из внутреннего стека уже внутри самой программы это контролировать?
Если в какой то момент мы запускаем сборщик мусора python\golang освобождает ли он память обратно для ОС или он освобождает только внутри приложения для повторного использования? Т.е. фактически он просто возвращает адреса страниц памяти в внутренний стек процесса в котором хранятся адреса куда можно что-то записать?

Я занимался этими вопросами много много лет назад, поэтому возможно сейячас появилось и что-то более новое, но тем не менее.
Если вы действительно хотите понять принципы, то начинать надо не с вопросов на форуме, а с чтения основополагающих книг. Ну например, уже много поколений программистов учатся по книге

Таненбаум Э., Бос Х. Современные операционные системы

И хоть книга не новая, но принципы они на то и принципы, что не меняются десятилетиями. В общем - ОЧЕНЬ рекомендую.
Далее, когда разберетесь с фундаментаом, нужно смотреть уже как "оно" работает в конкретной ОС. Так, для систем семейства  Windows найти можно по ключевому слову WinAPI. Есть описания работы по выделению памяти в Windows системах у разных авторов. Ну например:

Побегайло А.П. Системное программирование в Windows.
Щупак Ю. А.  Win32 API. Эффективная разработка приложений.
Безруков В.А. Win32 API. Программирование/учебное пособие
Литвиненко Н. А. Технология программирования на С++. Win32 API-приложения.
Рихтер Дж., Назарр К. Windows via C/C++. Программирование на языке Visual C++
Харт Д.  Системное программирование в среде Windows.

Много чего можно найти на сайте Microsoft. Но в любом случае подчеркну, ни один из приведенных источников вы не поймете, если предварительно не освоите "фундамент". Это я не занудствую, это просто многолетний опыт, как практической работы системного программирования так и преподавания, в том числе и рассматриваемых  вопросов.
Поскольку управление памяти - это один из самых внутренних слоев любой ОС, то во первых, что-бы непосредственно посмотреть "что там и как" придется предварительно освоить хакинг. Начиная, с того, как что-то запускать в режиме "ядра". И приципов работы на уровне системных вызовов.  Но по крайней мере, в книгах, приведенных выше вы можете (если сумеете) использовать С++. (Потому как изначально доступ был только на уровне ассемблера, потом API немного "подняли"). В общем смотрите источники, а далее - углубляйтесь по мере наличия (или пропажи) интереса.
Что касается Linux/Android и пр. то также попадались аналогичные источники, только попадались они мне уже тогда, когда для меня вопрос утратил актуальность. Но если надо искать - ключевые слова "системный вызов", "(низкоуровневое) управление памятью", "виртуализация памяти" и т.д.
Удачи.


Как сделать хорошо построенный текст по примеру Python
Всё почти сделал но ломаю голову над одним, к делу
У меня есть вот такой код:

        operations = func.operations()
        #Getting data
        final_str = ''
        for opertime in operations:
            regtime1 = datetime.datetime.fromtimestamp(int(opertime[1]))
            formatedate1 = regtime1.strftime("%m.%d.%Y")
            formatetime1 = regtime1.strftime("%H:%M")

            final_str += '\n'+formatetime1 + ' - ' + opertime[0]

В нем, программа получает из бд 2 столбца в котором (operation, time). В первом какая операция была и во втором время операции. Я хочу сделать сделать всё в вот таком виде:

- Дата: 02.05.2022

16:02 - Покупка шампуня

15:58 - Покупка утюга

12:13 - Покупка подписки

10:25 - Покупка карты

- Дата: 01.05.2022

22:20 - Покупка подписки

17:05 - Покупка бытовой техники

16:59 - Покупка мяса

16:58 - Покупка фена

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

Если операции сгруппировать по дате, то проблем вывести не будет
Пример:

import datetime as DT
from collections import defaultdict

operations = [
    ('Покупка мяса', 1650456884),
    ('Покупка техники', 1650463121),
    ('Покупка машины', 1650463177),
    ('Покупка кольца', 1650463544),
    ('Покупка листа А4', 1650482406),
    ('Покупка товара', 1650523818),
    ('Покупка подписки', 1650525954),
    ('Покупка фена', 1650532411),
    ('Покупка люстры', 1650545934),
]

date_by_operations = defaultdict(list)
for name, timestamp in operations:
    regtime = DT.datetime.fromtimestamp(timestamp)
    date_by_operations[regtime.date()].append(
        (regtime.time(), name)
    )

for date, ops in date_by_operations.items():
    print(f'- Дата: {date:%d.%m.%Y}')

    for time, name in ops:
        print(f'{time:%H:%M} - {name}')

    print()

Результат:

- Дата: 20.04.2022
17:14 - Покупка мяса
18:58 - Покупка техники
18:59 - Покупка машины
19:05 - Покупка кольца

- Дата: 21.04.2022
00:20 - Покупка листа А4
11:50 - Покупка товара
12:25 - Покупка подписки
14:13 - Покупка фена
17:58 - Покупка люстры


Кодек utf-8 не может декодировать байт 0xd0 в позиции 0 [закрыт]

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

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

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

Это сообщение было исправлено и отправлено на проверку 1 год назад, но повторное открытие сообщения провалилось:

Исходные причины закрытия не были исправлены

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

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

Traceback (most recent call last):
  File "/home/maminhacker/PycharmProjects/pythonProject/txt.py", line 4, in <module>
    a = input('Операция?(r - прочитать, w - создать, пересоздать, a - добавить в файл):')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 0: invalid continuation byte

Типо 1 раз работает, 1 раз выскакивает ошибка и опять 1 раз работает, и снова. Я уже перепробовал все, что знал. Например попробовал в конце кода
a = input('Операция?(r - прочитать, w - создать, пересоздать, a - добавить в файл):') написать через запятую
encoding = 'utf=8' и попробовать то же самое во всем остальном коде. Не знаю правильно я пытался исправить ошибку, но я что-то попытался сделать. Я даже, наверное, уже знаю что надо делать, но не знаю как.
частичка кода:

a = input('Операция?(r - прочитать, w - создать, пересоздать, a - добавить в файл):')

    text = input( 'Файл с которым будем работать:' )
        if a == 'r':
            file = open(text, 'r', encoding='utf-8') # на всякий случай переконвертировал в utf-8
        print('В этом файле написано:')
        print(file.read())
        file.close()

Надеюсь поможете, потому что на этом сайте точного ответа я так и не нашел.

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


Как работает алгоритм сортировки кучей?
Есть алгоритм сортировки кучей по возрастанию:

Вставлять элементы, делая min-heap
Удалять элементы (root), оставляя свойства

У меня есть вопросы к этому коду:
<code>
def heap_sort(arr, size):
    for i in range(size // 2 - 1, -1, -1):
        heapify(arr, size, i)

    for i in range(size - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)

    print(arr)

def heapify(array, size, index):
    done = False

    while not done:
        largest = index
        left = 2 * index + 1
        right = 2 * index + 2

        if left < size and array[largest] < array[left]:
            largest = left

        if right < size and array[largest] < array[right]:
            largest = right

        if largest != index:
            array[index], array[largest] = array[largest], array[index]
            index = largest
        else:
            done = True
</code>

Как получается сортировка по возрастанию, если куча max-heap
Я понимаю, что в heap_sort первый цикл строит кучу, второй удаляет элементы, знаю, как работает удаление и добавление в куче. Но я не понимаю, почему отсчет идет к концу с size // 2 - 1. Почему во втором цикле тоже идет отсчёт к концу
Почему это все работает, если где-то пишут, что левый элемент считается по формуле 2i, а здесь 2i + 1. Я тестил свою сортировку кучей с 2i + 1 на левый элемент и все ломалось

При этом я не до конца понимаю условий в heapify. Буду благодарен, если кто-нибудь понятным языком и подробно объяснит, как работает алгоритм сверху

1..  Вот эта операция

arr[i], arr[0] = arr[0], arr[i]

ставит вершину - наибольший элемент -  в конец массива, затем остаток кучи (верхняя часть) восстанавливает свойства кучи, следующий максимум ставится вторым с конца и т.д., и в результате получается сортировка по возрастанию
2.. "Отсчёт" идёт к началу, за это отвечает шаг -1 в range. Почему с
size // 2 - 1? - да потому что это индекс последнего родителя в куче, у элементов с большим номером нет деток.
3.. Левый элемент считается по формуле 2i, если индексация идёт с единицы, а здесь использована индексация с нуля.


Камера cv2 python
Можно ли сделать как-то проверку через
cv2 на наличие камеры.
Просто я хочу сделать условие, если камера есть = делать одно, но если её нет - другое

Имеется ответ на enSO, который решает вашу проблему.
Сама функция проверки выглядит так

import cv2

def returnCameraIndexes():
    # checks the first 10 indexes.
    index = 0
    arr = []
    i = 10
    while i > 0:
        cap = cv2.VideoCapture(index)
        if cap.read()[0]:
            arr.append(index)
            cap.release()
        index += 1
        i -= 1
    return arr

cams = returnCameraIndexes()

Функция проверяет первые 10 индексов и возвращает доступные. Тестировал на Win10 pro.
Результат => возвращен лист
[0, 1]. Нулевой индекс - встроенная камера, первый - внешняя.
Логично предположить, что пустой лист будет означать отсутствие камеры, можно проверить и написать логику

if cams:
    # действия при наличии камеры
    pass
else:
    # действия при ее отсутствии
    pass


Как срез в виде строки преобразовать в объект, который можно использовать как срез массива
В цикле получаю список срезов

qw = ['0:10, 0:20', '10:20, 20:40', '20:30, 40:60']

То есть каждый срез представлен в виде строки.
После этого пытаюсь применить этот срез к массиву

im = [[[0,0,0], [0,0,0]], [[0,0,0], [0,0,0]], [[0,0,0], [0,0,0]]...]

Но т.к. это строка, то применить не получиться.
Пыталась сделать так, но поняла что приду опять к строке

ind = i.split(',')
ind = [int(i) for i in ind]
int_ind = ','.join(ind)

Необходимо получить объекты массива по заданным срезам.

for i in qw:
  print(img[i])

где i должен быть работающим срезом, то есть

img[0:10, 0:20]

Нужно вытащить все числа из строк (это можно сделать с помощью регулярных выражений), преобразовать их в целые

Сформировать объект среза. Тут смысл в том, что срез вида
img[a:b] - это объект типа
slice, когда два среза через запятую - это кортеж (tuple) из двух
slice. Т.е.:

img[0:10] это то же самое что
img[slice(0, 10)] (или
img[slice(0, 10, None)], но пустой шаг слайса можно не указывать)

img[0:10, 0:20] -
img[(slice(0, 10), slice(0, 20))].

В этом можно убедиться на таком коде:

class Test:
    def __getitem__(self, x):
        return x

print(Test()[0:10])  # slice(0, 10, None)
print(Test()[0:10, 0:20])  # (slice(0, 10, None), slice(0, 20, None))

Таким образом, нужно сформировать объект вида
(slice(0, 10), slice(0, 20)), подставить туда числа с первого шага.

import numpy as np
import re

def convert_to_slice(s: str):
    a, b, c, d = map(int, re.findall(r"\d+", s))  # Вытаскиваем все числа из строки (считаем, что их всегда 4 штуки)
    return (slice(a, b), slice(c, d))  # Формируем объект нужного вида

img = np.array([[[0,0,0], [1,1,1]], [[2,2,2], [3,3,3]], [[4,4,4], [5,5,5]]])

# Результат должен получиться одинаковым
print(img[0:1, 0:2])
print(img[convert_to_slice('0:1, 0:2')])

Результат:

[[[0 0 0]
  [1 1 1]]]
[[[0 0 0]
  [1 1 1]]]

Если смотреть в контексте вашего предыдущего вопроса, то вместо формирования строк-срезов можно в цикле сразу формировать список из объектов-срезов:

def convert_to_slice(a, b, c, d):
    return (slice(a, b), slice(c, d))

qw = []

for i in range(5):
    qw.append(convert_to_slice(
        i * y_shift, i * y_shift + y_size,
        i * x_shift, i * x_shift + x_size,
    ))


Телеграм бот python бот не может корректно работать с несколько пользователями одновременно
@bot.message_handler(commands="start")
def start(message):
    bot.send_message(message.chat.id, "Введи свое имя")
    bot.register_next_step_handler(message, question1)

def question1(message):
    user_name = message.text
    # Дальше я эту переменную хочу записывать в какой то файл типа excel или еще какой то

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

сам разбирался с этим вопросом два дня, увидел случайно методы словарей решил почитать и вроде разобрался, тоже советую к прочтению, как в пример могу привести тебе это
<code>
user_dict = {}

class User:
    def __init__(self, name):
        self.name = name
        self.accumulation_rub = 0
        self.income_rub = 0
        self.expense_rub = 0
        self.profit_rub = 0
        self.memory_sum = 0
        self.memory_sum_old = 0

@bot.message_handler(commands=['help', 'start'])
def send_welcome(message):
    msg = bot.send_message(message.chat.id, 'Введите x')
    bot.register_next_step_handler(msg, next_step_valuey)

def next_step_valuey(message):
    chat_id = message.chat.id
    name = message.from_user.id
    userid = User(name)
    user_dict[chat_id] = userid

    valuex = message.text
    userid = user_dict[chat_id]
    userid.valuex = valuex

    msg = bot.send_message(message.chat.id, f'Введите y', parse_mode =
    'html')
    bot.register_next_step_handler(msg, next_step_valuesum)

def next_step_valuesum(message):
    chat_id = message.chat.id
    valuey = message.text
    userid = user_dict[chat_id]
    userid.valuey = valuey

    valuewalletsum = int(userid.valuex) + int(userid.valuey)
    userid.valuewalletsum = valuewalletsum

    bot.send_message(message.chat.id, f'x {userid.valuex} \n'
                                      f'y {userid.valuey} \n'
                                      f'sum {userid.valuewalletsum}')
</code>


Как определить, что контрол в переменной - это ScrolledText?
В данном примере удаляются только виджеты классов Entry и Label. Но еще надо, чтобы удалялись и ScrolledText. Как их удалить?
<code>
def dele(event): # удаление виджетов
    for w in root.winfo_children():
        if w.winfo_class() == 'Entry': w.destroy()
    for w in root.winfo_children():
        if w.winfo_class() == 'Label': w.destroy()
    for w in root.winfo_children():
        if w.winfo_class() == 'ScrolledText': w.destroy()
</code>

У
ScrolledText
winfo_class() == 'Frame' (т.к. он создан на основе фрейма, в котором лежит текстовое поле и полосы прокрутки). Просто проверяйте тип самих объектов, а не
winfo_class:

for w in root.winfo_children():
    if isinstance(w, Entry): w.destroy()
    if isinstance(w, Label): w.destroy()
    if isinstance(w, ScrolledText): w.destroy()


Не могу понять синтаксис решения
Есть вот такая задача:
Банкоматы позволяют использовать 4- или 6-значные PIN-коды, а PIN-коды не могут содержать ничего, кроме ровно 4 или ровно 6 цифр.
Если функции передана допустимая строка PIN-кода, верните true, иначе верните false.
Вот решение:
<code>
def validate_pin(pin):
    return len(pin) in [4, 6] and pin.isdigit()
</code>
Не могу понять список [4,6], он же включает 5, а получается что не включает, как так? Где можно посмотреть описание синтаксиса вышеуказанного выражения?

Список [4, 6] включает только два элемента 4 и 6
Все элементы на промежутке включает срез, он пишется через двоеточие [4 : 6]
<code>
a = [4,6]
b = [0, 1, 2, 3, 4, 5, 6]
print(a)  # [4,6]
print(b[4:7])  # [4,5,6]
</code>


Как получить номер пользователя с помощью AIOgram, если он уже им поделился?
<code>
# keyboard
share_keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
share_button = types.KeyboardButton(text="Share", request_contact=True)
share_keyboard.add(share_button)

@dp.message_handler(ChatTypeFilter(chat_type=types.ChatType.PRIVATE))
async def understand_message_handler(message: types.message):

if message.text == "Register" and not await check_user(message.from_user.id):
    await message.answer("Enter phone number:",
                         reply_markup=share_keyboard)
    await Registration.registration_number.set()

@dp.message_handler(state=Registration.registration_number)
async def input_number(message: types.Message, state: FSMContext):
await state.finish()
telephone = message.contact.phone_number
connection = await get_connection()
sql = f"INSERT INTO users(id, number) VALUES ({message.from_user.id}, {telephone})"
cursor = connection.cursor()
cursor.execute(sql)
connection.commit()

# ERROR
'NoneType' object has no attribute 'phone_number'
</code>
Использую AIOgram и этот код выдает ошибку. А сам message.contact = None, но когда я использовал telebot, такой вариант работал. Подскажите, пожалуйста, как получить номер, которым поделился пользователь, с помощью AIOgram

Ответ: в стандартном message handler разрешены только текстовые сообщения - нужно это поменять добавив фильтр content_types=types.ContentType.CONTACT


ScrolledText каждый раз создается заново при попытке вывода текста
При вызове функции
vivod(res) каждый раз создается новое текстовое поле. Пытался вытащить создание это поля из функции, в результате печатает только первый вызов. Надо, чтобы все вызовы выводились в один
ScrolledText

from tkinter import *
from tkinter.scrolledtext import ScrolledText

root = Tk()     # создание окна #
wid_r = root.winfo_screenwidth() - 20
hei_r = root.winfo_screenheight()
root.geometry('{}x{}'.format(wid_r,hei_r))

res = [         # массив для проверки #
    [1,2,3,4],
    [5,6,7,8],
    [4,2,1,3]
]

def vivod(res):         # вывод в ScroledText # # !'ПРОБЛЕМКА ЗДЕСЬ'! #
    st= ScrolledText(root, width=50, height=10)
    st.insert(INSERT, '\n')
    for i in res:
        for j in i:
            st.insert(INSERT,j)
            st.insert(INSERT, '\t')
        st.insert(INSERT, '\n')
    st.configure(state='disabled')
    st.pack()

def gauss_decision(res):    # решение системы #
    k = 1
    while k != len(res)-1:
        for i in range(1,len(res)):
            q = res[i][0]
            for j in range(len(res[0])):
                res[i][j] = res[i][j] - (q/res[0][0] * res[0][j])
                vivod(res)
                if ((i == len(res)-1) and (j == len(res[0])-1)):
                    for ii in range(k+1, len(res)):
                        w = res[ii][k]
                        for jj in range(k, len(res[0])):
                            res[ii][jj] = res[ii][jj] - (w/res[k][k] * res[k][jj])
                            vivod(res)
                    k += 1

def result(event):      # функции для вывода в ScrolledText по нажатию кнопки#
        vivod(res)
        gauss_decision(res)

button_result = Button(text = 'res')    # Кнопка #
button_result.bind('<Button-1>',result)
button_result.place(x=100, y=10, height=30,
                width=120)

root.mainloop()

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

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

def vivod(res):
    st.configure(state='normal')
    st.insert(INSERT, '\n')
    for i in res:
        for j in i:
            st.insert(INSERT,j)
            st.insert(INSERT, '\t')
        st.insert(INSERT, '\n')
    st.configure(state='disabled')

...

button_result = Button(text = 'res')    # Кнопка #
button_result.bind('<Button-1>',result)
button_result.place(x=100, y=10, height=30,
                width=120)

st = ScrolledText(root, width=50, height=10, state='disabled')
st.pack()


Разбор невалидного JSON в Python, экранирование или удаление лишних двойных кавычек в ключе
В процессе парсинга получаю невалидный код JSON который необходимо распарсить функцией json.loads

import json
parsed_string = '{"name":"Иван","age":"25","bad":"Строка c лишн"им символом"}'
json.loads(parsed_string)

Очевидно получаю следующую ошибку :

  File "/usr/lib/python3.8/json/decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 61 (char 60)

подскажите как убрать лишнюю двойную кавычку у значения с ключом "bad"
к сожалению ресурс который пытаюсь спарсить иногла отдает JSON именно в таком виде, без экранирования лишних кавычек и повлиять я на это не могу
массив данных очень большой и где именно встретится лишняя кавычка и встретится ли вообще не предугадать

import simplejson as json
import re

parsed_string = '{"name":"Иван", "age":"25","bad": "Строка c л,ишн"им символом"}'

def convert(elem: str):
    return re.sub(r'(?<!^)"(?!$)', r'', elem)

items = ''.join(
    map(
        convert,
        filter(
            bool,
            re.split(
                r'(\{\s*?"|\s*?"\s*?:\s*?"|"\s*?,\s*?"|\s*?"\s*})',
                parsed_string,
                flags=re.S
            )
        )
    )
)

print(json.loads(items))
# {'name': 'Иван', 'age': '25', 'bad': 'Строка c л,ишним символом'}

Или вот так:

import simplejson as json
import re

parsed_string = '{"name":"Иван", "age":"25","bad": ""Строка c л,ишн"им символом"}'

elements = [
    *filter(
        bool,
        re.split(
            r'(\{\s*?"|\s*?"\s*?:\s*?"|"\s*?,\s*?"|\s*?"\s*})',
            parsed_string,
            flags=re.S
        )
    )
]

for idx in range(1, len(elements), 2):
    if isinstance(item := elements[idx], str):
        elements[idx] = item.replace('"', '')

print(json.loads(''.join(elements)))
# {'name': 'Иван', 'age': '25', 'bad': 'Строка c л,ишним символом'}

В первом случае если двойная кавычка будет первым символом значения то будет ошибка

Справедливости ради нужно сказать, что данный метод будет работать только в том случае, если мы уверены, что все значения в json строковые и не пустые

'{"name":null, "age":"25","bad": ""Строка c л,ишн"им символом"}'
# На выходе даст
{'name:null, age': '25', 'bad': 'Строка c л,ишним символом'}
# ^^^^^^^^^^^^^^

'{"name":"", "age":"25","bad": ""Строка c л,ишн"им символом"}'
# Бросит исключение


Как в цикле python узнать что файл новый
Существует цикл в python:
<code>
 for i in file:
            if os.path.exists(MY_PATH_GIT+i):
                #copy for anasys on linux
                os.system(f'cp "{MY_PATH_GIT+i}" {place+"/"}')
                #On this step we sort deleted\not deleted file for deploy and pmd analys
                file_true.append(MY_PATH_GIT + i)
            else:
                print('\n========= deleted ' + MY_PATH_GIT + i + ' =========\n')  # checking the bot
</code>
Он проверяет что файл существует, чтобы добавить его в список который далее будет подставлен в строчку для валидации, но существует тип файлов, который к валидации допускается только если он новый, как я могу добыть такую инофрмацию?

Определитесь с тем, что такое "новый" (переменная с датой-критерием).

Используйте для получения даты создания файла:

 import os.path, time
 date_of_creation = os.path.getctime(MY_PATH_GIT+i)

Сравните дату с этим критерием.

И для полноты картины (дата последнего изменения):

    date_of_change=os.path.getmtime(MY_PATH_GIT+i)


Можно ли соединить информацию из разных процессов в 1 список
Необходимо объединить списки из 4 процессов в 1, возможно ли это и как это сделать?
<code>
if __name__ == '__main__':

    cpus = multiprocessing.cpu_count()
    if length % cpus == 0:
        pass
    proc_1 = Process(target=get_mes, args=(m_id[0:length//2],1,))#m_id[0:length//2
    proc_1.start()
    proc_2 = Process(target=get_mes, args=(m_id[length // 2*2:(length // 2)*3], 2,))
    proc_2.start()
    proc_3 = Process(target=get_mes, args=(m_id[length // 2*3:(length // 2)*4], 4,))
    proc_3.start()
    get_mes(m_id[length//2:(length//2)*2],0)
</code>

Пример к коментарию

from multiprocessing import Pool
from random import randint

def simple_rand(a, b, c):
    return (a + b + c) * randint(2, 5)

item_list = [(1, 3, 5,), (8, 9, 10)] * 50

if __name__ == '__main__':

    with Pool(8) as pool:
        new_item_list = [item for item in pool.starmap(simple_rand, item_list)]

    print(new_item_list)

UPD:

на счет разбить на части (хотя это уже другой вопрос)

lst = [5] * 15

def chunks(iterable, chunk_size: int):
    for i in range(0, len(iterable), chunk_size):
        yield iterable[i:i + chunk_size]

print([item for item in chunks(lst, len(lst) // 4 + bool(len(lst) % 4))])
# [[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5]]


Как добавлять не более 1 записи в таблицу если есть дубликаты Django pandas
Есть парсер который берет данные из CSV и добавляет их в модели django
В CSV есть много дубликатов, как добавить только 1 запись и остальные пропустить если они такие же?
Сам парсер:

def get_vehicle_brand():
    tmp_data = pd.read_csv('C:/Users/Sirius_McLine/PycharmProjects/BrixoDoc/ImportCSV/vehicles.csv', sep=';')
    vehicle_brand = [
        VehicleBrands(
            Name=tmp_data.loc[row]['VEH_BRAND']
        )
        for row in tmp_data.index
    ]
    VehicleBrands.objects.bulk_create(vehicle_brand)
    print('------add VEHICLE BRAND--------')

CSV:

VEH_TYPE_NO;VEH_MODEL_NO;VEH_BRAND
1052;14669;ABARTH
1053;14669;ABARTH
1054;14670;ABARTH
1060;14673;ABARTH
2589;14674;ABARTH
2589;14674;NISSAN
2589;14674;NISSAN
2589;14674;MERCE

И вот тут видно что в столбце VEH_BRAND много одинакового, как не пропускать одинаковые записи?

воспользуйтесь методом
drop_duplicates по определенному столбцу:

import pandas as pd

df = pd.read_csv("your.csv", sep=";").drop_duplicates(["VEH_BRAND"])
print(df)

   VEH_TYPE_NO  VEH_MODEL_NO VEH_BRAND
0         1052         14669    ABARTH
5         2589         14674    NISSAN
7         2589         14674     MERCE


Как передать каждое из значений списка в другую функцию?
Имеется тлеграм бот, написанный на библиотеке
aiogram. Пытаюсь реализовать такой функционал: по команде берутся значения из БД и инициируется таск на выполнение функции с определенным интервалом (с помощью библиотеки
aioschedule). Код на данный момент выглядит так:

@dp.message_handler(commands=['check'])
async def cycle_restart(msg: types.Message):
    cursor.execute('SELECT * FROM table WHERE status = ?', ('correct',))
    rec = cursor.fetchall()
    for row in rec:
        code = row[3] #уникальный идентификатор
        uid = row[1] #ID пользователя
        job = aioschedule.every(5).seconds.do(count, c_id=code, u_id=uid)
        while True:
            await aioschedule.run_pending()
            cursor.execute('SELECT status FROM table WHERE id = ?', (code,))
            rec = cursor.fetchall()
            for row in rec:
                if row[0] == 'stop':
                    aioschedule.cancel_job(job)
                    return
            await asyncio.sleep(1)

В итоге, даже если в БД присутствует 1+ подходящих строк, то берется только первая и запускается 1 таск. Никак не могу сообразить, как поправить цикл, чтобы задание назначалось с каждой из переменных, полученных из БД.

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

   if row[0] == 'stop':
       aioschedule.cancel_job(job)
       return

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

@dp.message_handler(commands=['check'])
async def cycle_restart(msg: types.Message):
    cursor.execute('SELECT * FROM table WHERE status = ?', ('correct',))
    rec = cursor.fetchall()
    jobs = {}
    for row in rec:
        code = row[3] #уникальный идентификатор
        uid = row[1] #ID пользователя
        job = aioschedule.every(5).seconds.do(count, c_id=code, u_id=uid)
        jobs[code] = job

    for code, job in jobs.items(): # повторяем для каждой запущенной задачи
        while True:     # этот цикл ждет когда завершится задача с кодом code
            await aioschedule.run_pending()
            cursor.execute('SELECT status FROM table WHERE id = ?', (code,))
            # т.к. code уникальный - запись всегда одна, можно делать fetchone
            status_row = cursor.fetchone()
            if status_row[0] == 'stop':
                aioschedule.cancel_job(job)
                continue  # выходим из цикла для текущей задачи
            await asyncio.sleep(1)

Еще одно замечание. Делать запрос
SELECT * FROM table WHERE status = ?, а потом читать колонки по индексу - ненадежно, так как порядок полей, которые БД возвращает при использовании
*, может измениться. Или явно указывайте имена полей
SELECT uid, code, и т.д FROM ... или получайте поля по имени (как именно это делать, зависит от используемой БД).


TelegramBot на Python не запускается
Ошибок в кодеPycharm не выдаёт,в консоли тоже нет ошибок, но при вводе команды start в Теллеграм ничего не происходит. Бот создан с использованием TelegramBotAPI. Токен бота брал в @BotFather
<code>
import telebot
import config

bot = telebot.TeleBot(config.Token)

@bot.message_handler(comands=['start'])
def welcome(message):
    sti = open(r'static\ welcome.webp', 'rb')
    bot.send_sticker(message.chat.id, sti)
    bot.send_message(message.chat.id, (''
                                       'Добро пожаловать ,{0.first_name}! \nЯ -\
     /<b>{1.first_name}<\b> ,бот,который поддержит людей.').format(message.from_user, bot.get_me((),
                                                                                parse_mode='html')

                                                                   @ bot.message_handler(content_types=['text'])))
</code>

Осмелюсь предположить что вы не использовали
bot.infinity_polling() - эта строчка запускает бота. Так в таком виде код лучше не держать, в своем ответе показываю отформатированный вариант.

import telebot
import config

bot = telebot.TeleBot(config.Token)

@bot.message_handler(commands=['start'])
def send_welcome(message):
    bot.send_message(message.chat.id, 'Добро пожаловать ,{0.first_name}! \nЯ -\/<b>{1.first_name}<\b> ,бот,который поддержит людей.').format( message.from_user,bot.get_me((), parse_mode="html"))

bot.infinity_polling()


ограничения рекурсии в python
почему рекурсия выполняется только 995 раз? и как это можно исправить?

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

from numba import njit

@njit()
def factorial(n):
    s = 1
    d = 0
    for i in range(2, n + 1):
        s *= i
        while s >= 10:
            s /= 10
            d += 1
    return s,d

s,d = factorial(37_826_497)
print(f'{s}e+{d}')

Вывод:

4.349383396225913e+270213647


как добавить html в view django
У меня есть Viev который собирает данные с формы и отправляет на email, мне нужно что бы на email приходили данные с новой строчки, я пробовал добавить в переменную message теги списка но на почту эти тэги приходят просто текстом и все в 1 строчку
помогите пожалуйста!!!
Мой View

def message_test(request):
    if request.method == 'POST':
        form = FeedBackLite(request.POST)
        if form.is_valid():
            message = \
                      'Имя: ' + form.cleaned_data['name'] + \
                      ' Телефон: ' + form.cleaned_data['phone'] + \
                      ' Е-mail ' + form.cleaned_data['email'] + \
                      ' Конец сообщения'
            mail = send_mail(form.cleaned_data['name'], message, '[email protected]',
                             ['[email protected]'], fail_silently=False)
            if mail:
                print('success_message')
                form.save()
                return redirect(forms_success)
            else:
                print('error_message')
    else:
        form = FeedBackLite()

На почту это приходит вот так в одну строчку
Имя: Имя имя имя Телефон: +7 (999) 999-9999Е-mail [email protected] Конец сообщения
а нужно что бы с новой строки

Попробуйте использовать
"\n".
'Имя: ' + form.cleaned_data['name'] + '\n'


Вывести значение переменной python на странице html
Не понимаю, что я делаю не так.
Из POST-запроса передается значение в переменную
getnumb, которую хочу напечатать на странице.
Просто ничего не происходит.
Код Python:

@app.route('/index', methods=['POST', 'GET'])
def index():
    if request.method == "POST":
        getnumb = request.form['getnumb']
        return redirect('index.html')
    else:
        return render_template("base.html")

Код index.html:

<form method="post">
        <input type="text" name="getnumb"><br>
        <button type="submit">ADD</button>
</form>
<h3>{{getnumb}}</h3>


Хочу добавить коды страниц в source.html но выскакивает ошибка TypeError: write() argument must be str, not BeautifulSoup [закрыт]

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

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

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

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

<code>
import requests
from bs4 import BeautifulSoup
url = input("> ")
r = requests.get(url, headers={'Accept-Language': 'en-US,en;q=0.5'})
stat = r.status_code
s = BeautifulSoup(r.text, "lxml")
file = open("source.html", "w")
file.write(s)
file.close()
if stat == 200:
    print("Content saved")
else:
    print("The URL returned ", stat, "!")
</code>

import requests
from bs4 import BeautifulSoup

url = input("> ")
r = requests.get(url, headers={'Accept-Language': 'en-US,en;q=0.5'})
stat = r.status_code
s = BeautifulSoup(r.content, "lxml")
with open("source.html", "w", encoding='UTF-8') as file:
    file.write(str(s))
if stat == 200:
    print("Content saved")
else:
    print("The URL returned ", stat, "!")


Перед дозаписью файла, скрипт должен выбросить случайное исключение и завершиться

import random

errors = [
    'Не повезло',
    'Повезло но не сильно',
    'Красавчик, продолжай дальше'
]

rnd = 0
fl = 0
with open('out_file.txt', 'w') as file:
    while rnd <= 777:
        nums = int(input('Введите число: '))
        rnd += nums
        if 13 == random.randint(1, 13):
            raise random.choice(errors)
        print(nums, file=file)

Вот набросал, и работает как-то рандомно, то бросает исключения то нет и потом сам ругается на:

raise random.choice(errors)
TypeError: exceptions must derive from BaseException

Запрашиваем у пользователя число до тех пор, пока сумма этих чисел не станет больше либо равна 777.Каждое введённое число при этом дозаписывается в файл out_file.txtПеред дозаписью с вероятностью 1 к 13 выбрасывает пользователю случайное исключение и завершается. Пример:

Введите число: 10
Введите число: 500
Введите число: 200
Введите число: 67
Вы успешно выполнили условие для выхода из порочного цикла!

Содержимое файла out_file.txt:
10
500
200
67

Вариант 2:

Введите число: 10
Введите число: 500
Вас постигла неудача!

Содержимое файла out_file.txt:
10

Оберните текст ошибки в тип Exception:
<code>
import random

errors = [
    'Не повезло',
    'Повезло но не сильно',
    'Красавчик, продолжай дальше'
]

rnd = 0
fl = 0
with open('out_file.txt', 'w') as file:
    while rnd <= 777:
        nums = int(input('Введите число: '))
        rnd += nums
        if 13 == random.randint(1, 13):
            raise Exception(random.choice(errors))
        print(nums, file=file)
</code>


Не до конца понял что вам нужно, но вот это может вам помочь:
<code>
x_size = 1280
y_size = 720
x_shift = 640
y_shift = 360
h = 1300
w = 2100
for i in range(5):
    print(f'{i * y_shift}:{i * y_shift + y_size}, {i * x_shift}:{i * x_shift + x_size}')
</code>


Как написать что данные введены не правильно, и чтобы ошибка не выдавалась
Хотел написать программу которая взаимодействует с модулем brawlstats и прога запрашивает тег игрока в игре после чего пишется сколько у него кубков. Ну вот задача если я напишу неправильный тегом игрока, то тогда в консоле напишется ошибка и прога закроется, а нужна чтобы писалась что тег введен неверно.
<code>
@bot.message_handler(content_types=["text"])
def mess(message):
    get_message_bot = message.text.strip()
    player = client.get_profile(get_message_bot)
    try:
        bot.send_message(message.chat.id, f"Имя профиля: {player.name}\nТвои кубки: {player.trophies}\nМакс. кубков: {player.highest_trophies}", parse_mode="html")

    except Exception as E:
        bot.send_message(message.chat.id, f"Вы ввели не правильно свой тег")
</code>
Пример с правильным тегом:
Введите свой тег: 28gqvqjqy --> У вас 28100 кубков\
Пример с не правильным тегом:
Введите свой тег: dwawadzx --> raise NotFoundError(404, invalid_chars=invalid)
brawlstats.errors.NotFoundError: An incorrect tag has been passed.Invalid characters: D, W, A, W, A, D, Z, X\
я хочу чтобы код писал при не правильным тегом писал что тег не правильно написан. Хотя я думаю что заместо ответа я получу -1 как всегда, но если вы ответьте на мой вопрос то я буду сильно благодарен

try:
    player = client.get_profile(input("Введите свой тег"))
    print(player.trophies)
except Exception as E:
    print(E)  # Если нужна ошибка
    print('Неверно набран тег')  # Если нужно вывести определенный текст


Сортировка списка по части елемента нижеописанным алгоритмом
Есть список out = ['123 700', '456 -300', '789 -200'] состоящий из 3 элементов разделенных точкой с запятой. Каждый элемент - это номер счета - пробел - сумма.
Нужно отсортировать список по сумме таким алгоритмом:
Проходим циклом по всем элементам и сохраняем в переменную вне цикла элемент с минимальной суммой.
После выполнения цикла записываем эту сумму в новый список outsort и удаляем ее из out. У меня все работает правильно, но строка с удалением ломает алгоритм, как изменить код, чтоб удалять правильно?
<code>
out = ['123 700', '456 -300', '789 -200']
q = 1
minn = "999 99999999"
i_minn = 0
outsort = []
while q <= len(out):
    for i in range(len(out)):
        if int(minn[4:]) > int(out[i][4:]):
            minn = out[i]
            i_minn = i
    outsort.append(minn)
    del out[i_minn]
    q += 1

print(out)
print(outsort)

['123 700', '456 -300', '789 -200'] - исходный список
['456 -300', '789 -200', '123 700'] - ожидаемый список
['456 -300', '456 -300'] - то что получается этим кодом
</code>

Так надо, если алгоритм не менять (и фраза "строка с удалением ломает алгоритм" сбивает с толку - с этой строкой всё нормально):

out = ['123 700', '456 -300', '789 -200']
# Тут не нужен i_minn
outsort = []
# Поменяли неверное условие выхода и убрали лишний счетчик
while len(out):
    # Поменяли минимальный элемент
    minn = '999 999999999'
    for i in range(len(out)):
        if int(minn[4:]) >= int(out[i][4:]):
            minn = out[i]
            i_minn = i
    outsort.append(minn)
    del out[i_minn]

print(out)
print(outsort)

Если поменять алгоритм:

out = ['123 700', '456 -300', '789 -200']
outsort = sorted(out, key=lambda x: int(x[4:]))
print (outsort)


Не сортируется список Python
Всем добрый день! Возникла проблема с сортировкой списка. Требуется прочитать файл, разбить каждую строку на список слов, для каждого слова проверить, есть ли слово в списке, после завершения программы отсортировать и распечатать слова в алфавитном порядке. Не могу понять чем вызвана эта проблема, список сформировался, но сортировка по алфавиту не происходит.
<code>
romeo_append = []
romeo_open = open('romeo.txt')

for romeo_list in romeo_open:
    romeo_split = romeo_list.split()
    if romeo_split in romeo_append:
       continue
    romeo_append.append(romeo_split)
    romeo_append.sort()

print(romeo_append)
</code>
Вывод должен быть таким:

['Arise', 'But', 'It', 'Juliet', 'Who', 'already', 'and', 'breaks',
'east', 'envious', 'fair', 'grief', 'is', 'kill', 'light', 'moon',
'pale', 'sick', 'soft', 'sun', 'the', 'through', 'what', 'window',
'with', 'yonder']

А на деле он вот такой:

[['Arise', 'fair', 'sun', 'and', 'kill', 'the', 'envious', 'moon'],
['But', 'soft', 'what', 'light', 'through', 'yonder', 'window',
'breaks'], ['It', 'is', 'the', 'east', 'and', 'Juliet', 'is', 'the',
'sun'], ['Who', 'is', 'already', 'sick', 'and', 'pale', 'with',
'grief']]

Чтобы расширить список всеми элементами другого, используйте
+ или
extend.
Аппендом же вы добавляете подсписок.


Замена всех None в запросе на пустую строку Python
При запросе в базу, пустые ячейки преобразуются в None и так же отображаются на странице.
Мне нужно заменить каждую ячейки с None на пустую строку.
Вот кусочек имеющегося кода с запросом
<code>
        for id in tpaList:
        cursor = self.connections['DB_Name'].execute(f''' SELECT *
                                                            FROM [DB_Name].[dbo].[Table_Name]
                                                                AND EndDate IS NULL
                                                            ORDER BY StartDate DESC ''')
        columns = [column[0] for column in cursor.description]
        for row in cursor.fetchall():
            idleJournal.append(dict(zip(columns, row)))
    return idleJournal
</code>

Можно сгенерировать новый список, заменив
None на
'':

for row in cursor.fetchall():
    row = ['' if x is None else x for x in row]
    idleJournal.append(dict(zip(columns, row)))

Или при генерации словаря:

for row in cursor.fetchall():
    idleJournal.append({k: ('' if v is None else v) for k, v in zip(columns, row)})


Как вызвать метод дочернего класса, записанного в другом файле?
У меня возникла проблема, если кто знает как ее решить и имеет время, помогите пожалуйста.
Я имею родительский класс, который находится в файле tester.py

l1 = [1, 1, 2]

class A:
   def __init__(self,l):
      self.l = l

   def qw(self):
        if l1[0] == 1:
           import qwe
           qwe.calculate()

f = A(l)
f.qw()

И также дочерний класс который находится в файле qwe.py

import tester

class B(tester.A):

   def calculate(self):
        print(self.l[0]+'Ok')

Я хочу использовать метод дочернего класса который находится в другом файле в родительском. Я пыталась сделать это так

              import qwe
            qwe.calculate()

f = A(l1)
f.qw()

Но у меня возникает ошибка и я не знаю почему, возможно, кто-то знает решение?

Вам надо объект класса B создать внутри класса A, тогда к нему можно будет применить метод calculate
test.py

l1 = [1, 1, 2]

class A:
   def __init__(self,l):
      self.l = l

   def qw(self):
        if l1[0] == 1:
           import test2
           qwe = test2.B(l1)
           qwe.calculate()

f = A(l1)
f.qw()

test2.py

class B():
    def __init__(self, _list):
        self._list = _list

    def calculate(self):
        print(f'{self._list[0]} Ok')


Ошибка 'NoneType' object has no attribute 'find_all' не могу понять, почему?
Ошибка 'NoneType' object has no attribute 'find_all'  не могу понять, почему? Помогите, пожалуйста, мне срочно нужно.
<code>
r = requests.get(url)
soup = BeautifulSoup(r.content,'lxml')
soup = soup.find('img',class_='icon-btn').find_all('onclick').text[k]
</code>

Все потому что вы не можете использовать метод
.find_all() в методе
.find(), а так же у вас имя переменной объекта соупа точно такое же как и при поиске элемента вам нужно делать наоборот, примерно вот так:

soup = BeautifulSoup(r.content,'lxml')
soupItem = soup.find_all('img',class_='icon-btn')
for items in soupItem:
    item = items.find('onclick').text[k]
    print(item)

Грубо говоря вы для начала обнаруживаете все объекта класса icon-btn, потом в цикле проходитесь по ним и забираете нужный вам элемент onclick, и делаете с ним уже все что вам только угодно, выводите, сохраняете и тд


Ошибка в задаче со словарями
Известна информация о книгах, поступивших в библиотеку (Автор, цена
количество шт.). Вывести автора, у которого больше всех книг поступило в
библиотеку.
Как исправить в коде ниже ошибку 'int' object has no attribute 'get'?
<code>
inf = int(input())
d = dict()
for i in range(inf):
    key = input('name: ')
    value = int(input('amount: '))
    d[key] = value
print(max(inf, key=inf.get))
</code>

Думаю, что вы хотели получить из словаря ключ, соответствующий наибольшему значению.
Что пошло не так?

Вы пытаетесь применить метод
get() от словаря к числовому значению
inf.
Находить максимум только из одного числа - не лучшая затея.

Если мои рассуждения верны, то вам нужно это:

print(max(d, key=d.get))


Может ли PyCharm ругаться просто так?
Надо было решить задачу с таким условием:

Напишите программу, которая находит общий доход, затем выводит фрукт с минимальным доходом и удаляет его из словаря. Выведите итоговый словарь на экран.
Результат работы программы:
Общий доход за год составил 35419.34 рублей
Самый маленький доход у grapefruit. Он составляет 300.4 рублей
Итоговый словарь: {'apple': 5600.2, 'orange': 3500.45, 'banana': 5000.0, 'bergamot': 3700.56, 'durian': 5987.23, 'peach': 10000.5, 'pear': 1020.0, 'persimmon': 310.0}

Получился такой код:

incomes = {
    'apple': 5600.20,
    'orange': 3500.45,
    'banana': 5000.00,
    'bergamot': 3700.56,
    'durian': 5987.23,
    'grapefruit': 300.40,
    'peach': 10000.50,
    'pear': 1020.00,
    'persimmon': 310.00,
}

print('Общий доход за год составил', sum(incomes.values()), 'рублей')

for key in incomes:
    if incomes[key] == min(incomes.values()):
        worst_product = key

print('Самый маленький доход у {0}. '
      'Он составляет {1} рублей'.format(worst_product, min(incomes.values())))

incomes.pop(worst_product)

print('Итоговый словарь:', incomes)

Но PyCharm почему-то подчеркивает worst_product в строке:

      'Он составляет {1} рублей'.format(worst_product, min(incomes.values())))

Name 'worst_product' can be undefined
При этом, все работает
В чем причина?

Суть ошибки в том, что если словарь incomes окажется пуст - в переменную worst_product не будет присвоено значение. Возможно, это и не ошибка вовсе, но PyCharm-то не знает что должно произойти в этом случае.
Это предупреждение можно подавить через явную инициализацию worst_product перед циклом (что является общим способом для любых языков программирования):

worst_product = None
for key in incomes:
    if incomes[key] == min(incomes.values()):
        worst_product = key

Или же можно воспользоваться else-блоком к циклу (так можно делать только в Питоне):

for key in incomes:
    if incomes[key] == min(incomes.values()):
        worst_product = key
        break
else:
    worst_product = None

В любом случае, случай пустого словаря надо в дальнейшем правильно обработать. Или не нужно, если он невозможен, а задача лишь в подавлении предупреждения.
PS у вас цикл квадратный на пустом месте, не надо так делать. Почитайте про алгоритм поиска минимального элемента.


Удаление лишних значений ссылающихся друг на друга объектов
У меня есть примерно такой список (упрощено до общей реализации)

a = [
['0', 11],
['1', 3],
None,
['3', None],
['4', 6],
['5', None],
['6', None],
['7', 10],
None,
['9', 4],
['10', 11],
['11', None]
]

В нем каждое значение - либо
None, либо список, в котором первый элемент - какая-то полезная нагрузка, а второй -
None или индекс элемента на который он ссылается.
Например:

print(a[a[0][1]])  # Выведет ['11', None]
print(a[a[1][1]])  # Выведет ['3', None]
print(a[a[4][1]])  # Выведет ['6', None]
print(a[a[7][1]])  # Выведет ['10', 11]
print(a[a[9][1]])  # Выведет ['4', 6]
print(a[a[10][1]]) # Выведет ['11', None]

Задача состоит в том, чтобы удалить из данного списка все
None элементы так, чтобы эти ссылки на индексы не съехали. и ссылались на те же самые элементы.
То есть чтобы получилось так:

a = [
['0', 9],
['1', 2],
['3', None],
['4', 5],
['5', None],
['6', None],
['7', 8],
['9', 3],
['10', 9],
['11', None]
]

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

print(a[a[0][1]])  # Выведет ['11', None]
print(a[a[1][1]])  # Выведет ['3', None]
print(a[a[3][1]])  # Выведет ['6', None]
print(a[a[6][1]])  # Выведет ['10', 9]
print(a[a[7][1]])  # Выведет ['4', 5]
print(a[a[8][1]]) # Выведет ['11', None]

Индексы поменялись, но сами данные, как можно заметить, не изменились.
Я знаю язык и т.д, но не могу разработать сам алгоритм, я пробовал проходить последовательно по массиву, пробовал в обратном порядке, но у меня индексы съезжают. Подскажите пожалуйста, как получить результат, который я ожидаю?

Возможно есть более хитрые алгоритмы, но по тупому делается примерно так - вы проходите по массиву, удаляете ненужные элементы и запоминаете в словаре соответствие старого индекса и нового, новый индекс равен старому минус дельта, дельта перед циклом = 0, при каждом удалении увеличивается на 1. После первого цикла делаете второй цикл по массиву и заменяете индексы в ссылках по словарю:
Вот пример:
<code>
def print_array(arr, text):
    print(text)
    for idx, item in enumerate(arr):
        if item and item[1]:
            print(idx, ':', item, '-->', arr[item[1]])
        else:
            print(idx, ':', item)

def delete_none(arr: list):
    old_new = dict()
    delta = 0
# Обратите внимание - первый цикл мы делаем по копии исходного списка
# это необходимо, поскольку мы удаляем элементы прямо в цикле.
# Если мы будем делать цикл по исходному списку, то элемент сразу за удаленным будет потерян для логики.
# Возможно, в python это как-то можно сделать по другому, но я не настолько его знаю
    for idx, item in enumerate(arr[:]):
        if not item:
            del arr[idx - delta]
            delta += 1
        else:
            old_new[idx] = idx - delta

    for item in arr:
        old_index = item[1]
        if old_index:
            if old_index in old_new:
                new_index = old_new[old_index]
                item[1] = new_index
            else:
                item[1] = None

def main():
    a = [
        ['0', 11],
        ['1', 3],
        None,
        ['3', None],
        ['4', 6],
        ['5', None],
        ['6', None],
        ['7', 10],
        None,
        ['9', 4],
        ['10', 11],
        ['11', None]
    ]
    print_array(a, 'Before')
    delete_none(a)
    print_array(a, 'After')

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


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

direktoria:
  | foo.py
  | direktoria2:
    | bar.py

Мне нужно в файле
bar.py импортировать файл
foo.py
Если бы они были на одном уровне я бы просто сделал
import foo.py
Но в этом случае не работает даже например
__import__("..\\foo")
Возможно ли это вообще?

В случае если
PYTHONPATH=/full/path/to/direktoria.

from direktoria import foo


Ребята, на помощь, как подключить рандом к этой фигне, я сделал чтобы оно выдавало 4 записи, а хочется чтобы выдавало 1 рандомом из 50
<code>
@dp.message_handler(Text(equals="TEXT"))
async def get_last_five_newsy(message: types.Message):
    with open(os.path.abspath("newr_dict.json")) as file:
        newr_dict = json.load(file)

    for k, v, in sorted(newr_dict.items())[:4]:
        news = f"{v['movieItem_title']}\n" \
               f"{v['movieItem_details']}\n" \
               f"{v['movieItem_url']}"
</code>

Поскольку воспроизводимого примера не видать ограничусь общим примером
<code>
from random import choices, choice

d = {
    'a': 1,
    'b': 2,
    'c': 3,
    'd': 4
}
# Выбираем случайное одно из случайных 2х
print(
    choice(choices([*d.items()], k=2))
)

</code>