Как передать аргументы команды в класс
Пишу бота для дискорда. Недавно узнал о кнопках в библиотеке disnake.py, и возник вопрос: так как кнопки для сообщения это отдельный класс, как тогда можно передавать в него аргументы прямо из команды?
class Send_Money:

class Send_Money(disnake.ui.View):
    def __init__(self):
        super().__init__(timeout=20)
        self.value = Optional[bool]

    @disnake.ui.button(label='Да', emoji='✅', style=disnake.ButtonStyle.green)
    async def confirm(self, button: disnake.ui.Button, inter: disnake.CommandInteraction, author, user, valute, amount):
        with open('users.json', 'r') as f:
            users = json.load(f)
        v = int(users[f'{author.id}'][valute.upper()])
        if amount > 0:
            if amount <= v:
                await inter.response.send_message('Вы успешно отправили валюту!')
                await add_valute(author, valute, -int(amount))
                await add_valute(user, valute, int(amount))

Команда:

@bot.command(aliases=['перевод_средств', 'перевод'])
async def send_money(ctx, member: disnake.Member, amount: int, value):
    view = Send_Money()
    await update_data(member)
    if value in rub:
        msg = await ctx.send(f'Вы точно хотите отправить **{amount} рублей** пользователю {member.mention}?', view=view)
        valute = 'rub'
    await sleep(20)
    await msg.delete()

В функцию
__init__ вписываете аргументы, которые нужно получить, как в обычной функции

class Worker:
    def __init__(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2

Worker('123', '321')


CallBack Data не обрабатывается в телеграм боте
Пишу бота для телеграм с aiogram. Сначала пользователь нажимает на кнопку "Промокод", а после сообщение бота обновляется и и появляется текст "Введите промокод:" с инлайн кнопкой назад, но так как начинает ожидаться текстовое сообщение, то call data перестает обрабатьваться и вернуться в меню невозможно. Можно как - то обьединить message и callback_query хэндлеры?
<code>
@dp.callback_query_handler(text='promo')
async def promosystem(call: types.CallbackQuery):
    global msgid
    await call.message.edit_text(f"Введите промокод:", reply_markup=ikb_back)
    msgid = call.message.message_id
    await promo.msgtext.set()

@dp.message_handler(state=promo.msgtext)
async def checkpromo(message: types.Message, state=FSMContext):
    isex = OpenAIDB.isexistpromo(message.text)
    await state.finish()
    await message.delete()
</code>

Ответ на данный вопрос очень прост: перед вызовом message_handler мы вызываем еще один callback_query_handler с параметром "state = '*' и call.data кнопки:
<code>
@dp.callback_query_handler(text='promo')
async def promosystem(call: types.CallbackQuery):
    global msgid
    await call.message.edit_text(f"Введите промокод:", reply_markup=ikb_back)
    msgid = call.message.message_id
    await promo.msgtext.set()

@dp.callback_query_handler(text='back', state="*")
async def backprofile(call: types.CallbackQuery, state: FSMContext):
    await state.finish()
    profile = OpenAIDB.getprofile(call.from_user.id)
        await call.message.edit_text(f'Ваше имя: {profile[1]}\nВаш ID: {profile[0]}\n\nСтатус подписки: неактивна \n\nКоличество оставшихся запросов: {profile[3]}\nКоличество использованных запросов: {profile[2]}', reply_markup=ikb_profile)

@dp.message_handler(state=promo.msgtext)
async def checkpromo(message: types.Message, state=FSMContext):
    isex = OpenAIDB.isexistpromo(message.text)
    await state.finish()
    await message.delete()
</code>


Как отправить сообщение ботом в определенную беседу вк
<code>
vk.messages.send(message = f'{message.content}', random_id = get_random_id())
</code>

Указать параметр
peer_id:

PEER_ID: int = ...

vk.messages.send(
    random_id=get_random_id(),
    peer_id=PEER_ID,
    message=f'{message.content}',
)

Для групповой беседы:

2000000000 +
id беседы


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

def func(b):
    if b:
        return lambda y: abs(y)
    return lambda y: -abs(y)

print(func(False)(1)) # -1
print(func(True)(-4)) # 4


Почему возникает ошибка ValueError?
Я натренировал
Random Forest Classifier. Сохранил модель, используя
pickle. После, в другом
python-файле, загрузил модель и передал ей предложение, которое ввёл.
Возникает ошибка:

ValueError: X has 14 features, but RandomForestClassifier is expecting 148409 features as input".

Вот формы данных:

train dataset features size: (23588, 148409)
train dataset label size: (23588,)
test dataset features size: (10110, 148409)
test dataset label size: (10110,)

Вот форма одного предложения:

text_test shape (15, 14)

Код в файле с постройкой модели:

from sklearn.feature_extraction.text import CountVectorizer, TfidTransformer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

vectorizer = CountVectorizer()
BoW_transformer = vectorizer.fit(data['Text'])
BoW_data = BoW_transformer.transform(data['Text'])
tf_idf_transformer = TfidfTransformer().fit(BoW_data)
data_tf_idf = tf_idf_transformer.transform(BoW_data)
text_train, text_test, label_train, label_test = train_test_split(
    data_tf_idf, data['Label'], test_size=0.3
)
print(f"train dataset features size: {text_train.shape}")
print(f"train dataset label size: {label_train.shape}")
print(f"test dataset features size: {text_test.shape}")
print(f"test dataset label size: {label_test.shape}")
RF_classifier = RandomForestClassifier()
RF_classifier.fit(text_train, label_train)
predict_train = RF_classifier.predict(text_train)
predict_test = RF_classifier.predict(text_test)

Код в файле с входными данными:

import pickle
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfTransformer, CountVectorizer

vectorizer = CountVectorizer()
BoW_transformer = vectorizer.fit(input_string)
BoW_data = BoW_transformer.transform(input_string)
tf_idf_transformer = TfidfTransformer().fit(BoW_data)
data_tf_idf = tf_idf_transformer.transform(BoW_data)
text_test, label_test = train_test_split(
    data_tf_idf, test_size=1
)
print("text_test shape", text_test.shape)
with open("saved_model.pickle", 'rb') as f:
    RF_classifier = pickle.load(f)
predict_test = RF_classifier.predict(text_test)

Проблема, видимо, в том, что векторизатор имеет разные словари в разных файлах. Но как сделать иначе, я не знаю.

Да, проблема в разной подготовке фич. Фичи должны подготавливаться одинаково при тренировке модели и при получении предсказания, иначе вы получите если не ошибку, то просто какой-то бред при предсказании.
В общем, если вы используете какие-то трансформеры с внутренним состоянием и делаете им
fit на данных, по которым тренируете модель, то вам нужно также сохранять эти трансформеры через
pickle как и вашу модель, а когда делаете предсказание, то читать эти трансформеры из файла и делать ими уже только
transform, без
fit.
Кроме того, некоторые трансформеры имеют аналоги без внутреннего состояния, например, вместо
CountVectorizer можно использовать
HashingVectorizer, качество предсказаний возможно будет чуть хуже (а может быть и не будет), но при этом
HashingVectorizer не хранит состояние и поэтому во-первых потребляет гораздо меньше памяти, а во-вторых его состояние не нужно сохранять и потом загружать (у него его просто нет), а нужно просто инициализировать его теми же аргументами при предсказании, что и при тренировке модели, и этого будет достаточно.


Добавить кнопку для вывода значения combobox в tableview
Есть код:

from PyQt5 import QtWidgets, QtCore

class Delegate(QtWidgets.QItemDelegate):
    def __init__(self, owner, choices):
        super().__init__(owner)
        self.items = choices
    def createEditor(self, parent, option, index):
        self.editor = QtWidgets.QComboBox(parent)
        self.editor.addItems(self.items)
        return self.editor
    def paint(self, painter, option, index):
        value = index.data(QtCore.Qt.DisplayRole)
        style = QtWidgets.QApplication.style()
        opt = QtWidgets.QStyleOptionComboBox()
        opt.text = str(value)
        opt.rect = option.rect
        style.drawComplexControl(QtWidgets.QStyle.CC_ComboBox, opt, painter)
        QtWidgets.QItemDelegate.paint(self, painter, option, index)
    def setEditorData(self, editor, index):
        value = index.data(QtCore.Qt.DisplayRole)
        num = self.items.index(value)
        editor.setCurrentIndex(num)
    def setModelData(self, editor, model, index):
        value = editor.currentText()
        model.setData(index, QtCore.Qt.DisplayRole, QtCore.QVariant(value))
    def updateEditorGeometry(self, editor, option, index):
        editor.setGeometry(option.rect)

class Model(QtCore.QAbstractTableModel):
    def __init__(self, table):
        super().__init__()
        self.table = table
    def rowCount(self, parent):
        return len(self.table)
    def columnCount(self, parent):
        return len(self.table[0])
    def flags(self, index):
        return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
    def data(self, index, role):
        if role == QtCore.Qt.DisplayRole:
            return self.table[index.row()][index.column()]
    def setData(self, index, value, role):
        if role == QtCore.Qt.EditRole:
            self.table[index.row()][index.column()] = value
        return True

class Main(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        # set combo box choices:
        choices = ['apple', 'orange', 'banana']
        # create table data:
        table   = []
        table.append(['A', choices[0]])
        table.append(['B', choices[0]])
        table.append(['C', choices[0]])
        table.append(['D', choices[0]])
        # create table view:
        self.model = Model(table)
        self.tableView = QtWidgets.QTableView()
        self.tableView.setModel(self.model)
        self.tableView.setItemDelegateForColumn(1, Delegate(self,choices))
        # make combo boxes editable with a single-click:
        for row in range( len(table) ):
            self.tableView.openPersistentEditor(self.model.index(row, 1))
        # initialize
        self.setCentralWidget(self.tableView)
        self.setWindowTitle('Delegate Test')
        self.show()

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    main = Main()
    app.exec_()

нужно добавить кнопку, которая печатает выбранное значение combobox
пробовал выводить:

 df = str(self.tableView.model().index(0, 1).data())
 print(df)

но выводит только первоначальное значение combobox и не меняет его

Действительно, как написано в комментарии перепутаны местами аргументы в setModelData(). Нужно:

model.setData(index, QtCore.QVariant(value), QtCore.Qt.DisplayRole)

Но кроме этого DisplayRole нужно изменить на EditRole

model.setData(index, QtCore.QVariant(value), QtCore.Qt.EditRole)

после этого все работает как ожидалось.


Почему utf8 не может декодировать byte-тип? [дубликат]

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

локализация функции os.popen() в Python

                                (2 ответа)

Закрыт 7 месяцев назад.

Код в 3 строки лишнего ничего нет

import subprocess

res = subprocess.check_output("ipconfig")
print(res.decode())

но почему я получаю это?

Traceback (most recent call last):
  File "c:\Users\Alisher\Documents\GitHub\Backdoor\web\victim.py", line 4, in <module>
    print(res.decode())
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8d in position 2: invalid start byte

Я уже везде копался, многие предлагали вместо utf8 использовать ISO кодировки, но не помогает. Ошибки не получаю, но текст состоит из непонятных символов. Как мне это исправить? Какие данные вам нужны чтобы помочь мне?
Windows 10
Python 3.10.6

В комментариях дали ссылку на ответ, спасибо!
<code>
import subprocess

res = subprocess.check_output("ipconfig")
print(res.decode('cp866'))
</code>
Исходя из этого ответа я сделал вывод, что нужно декодировывать в кодировке cp866.


Как воспроизвести звук не прерывая (паралельно) выполнению других команд
Как мне воспроизвести звук асинхронно?
Пробовал pyglet (келых три строчки кода так еще и после выполнения звука все останавливается), playsound (просто не играл звук при
block=False),
just_playback (вообще не установился), pygame (слишком много весит). И у всех одна и та же проблема: приостанавливается выполнение кода. Есть ли какая-то библиотека которая могла бы в одну строчку кода, асинхронно воспроизвести звук.

#pg - pyautogui
shut = pg.confirm(text="Завершить єпично работу ПК?", title="Єпичное завершение2023 ", buttons=["OK", "НЕТ"])
if shut == "OK":
pg.hotkey("win", "r")
time.sleep(0.5)
pg.typewrite("cmd")
pg.press("enter")
time.sleep(0.5)
out = pyglet.resource.media("outro.mp3")
out.play()
pyglet.app.run() #И ниже код не выполняеться.
pg.typewrite("shutdown /s /t 17")
pg.press("enter")

P.S: Если кто-то еще и подскажет библиотеку с возможностью установки и получения значения громкости от души поблагодарю

Кстати в pyglet можно регулировать громкость, да там вообще много чего можно.
<code>
import time
from threading import Thread

from pyglet.media import Player, load

class MiniPlayer(Player):
    def __init__(self, path_to_file: str):
        super().__init__()
        source = load(path_to_file)
        self.queue(source)

    def on_play(self):
        return self.play()

    def on_pause(self):
        return self.pause()

    def get_volume(self):
        return self.volume

    def set_volume(self, value):
        self.volume = value

def change_volume(player: MiniPlayer):
    for value in range(10, 100, 10):
        time.sleep(1)
        print(value / 100)
        player.set_volume(value / 100)

def main():
    # TO DO ваш код до
    mini_player = MiniPlayer("song.mp3")
    mini_player.on_play()
    print(f"Громкость до: {mini_player.get_volume()}")
    mini_player.set_volume(0.5)
    print(f"Громкость после: {mini_player.get_volume()}")
    # TO DO ваш код после
    print("ваш код после")
    # Имитация кода после
    Thread(target=change_volume, args=(mini_player,)).start()
    time.sleep(10)

if __name__ == '__main__':
    main()
</code>
P.S. Мудрил что бы запустить в одтельном потоке но так и не вышло.


Не получается посчитать максимальную, подряд идущую последовательность символов 'ABA'
Допустим, есть последовательность символов 'ABAABABBBBBBBB'
Моя задача, найти максимальное количество подряд идущих последовательностей 'ABA'
В данном случае, ответ будет m = 2. Первые 6 символов. У меня прога печатает m=1. Почему-то каждый раз обнуляя переменную k. Не могу понять почему.
<code>
s = 'ABAABAABABBBB'
print (s)
k=0
m = 0
for i in range(2,len(s)):
    if s[i-2] == 'A' and s[i-1]=='B' and s[i]=='A':
        k=k+1
        m = max(k,m)
        i += 2
    else:
        k=0
print(m)
</code>

Пример не очень корректный. Все же по нему получается 3 подстроки подряд. Плюс с константами немного подошиблись и с логикой. Ну и как было правильно замеченно, тут цикл for не подходит. Нужен while
Получилось как-то так
<code>
s = 'ABAABABBABABBBB'
print (s)
m = 0
k = 0
i = 2
while i < len(s):
    if s[i-2] == 'A' and s[i-1]=='B' and s[i]=='A':
        k += 1
        i += 3
    else:
        i += 1
        m = max(k, m)
        k = 0

print(m)
</code>
Т.е. логика примерно следующая: если условие соблюдается, то увеличиваем счетчик количества подстрок k в текущей последовательности.
Как только условие не сработало, то сравниваем число подсток в последовательности, с тем что уже было. Это функция max и переменная m. А счетик подстрок k обнуляем.
Ну и если условие выполняется, то переходим на три символа вперед. А если нет - то только на один


Задача на Python N^3 = N1^3 + N2^3 + N3^3
Всем доброго дня, требуется реализовать следующую Задачу двумя способами:
Найти наименьшее натуральное число N такое, что N^3 = N1^3 + N2^3 + N3^3, при этом
N1≠N2≠N3.
С первым способом трудностей нет, написал через фор, со вторым возникли проблемы. Хотел писать через Вайл, но все никак не выходит. Помогите, пожалуйста.
Удачный вариант с for:

check = set()
for a in range(1,10):
    for b in range(1, 10):
        for c in range(1, 10):
            for d in range(1, 10):
                if (b != c and c != d and b != d):
                    if (a ** 3 == ((b ** 3) + (c ** 3) + (d ** 3))):
                        check.add(a)
print(min(check))

Неудачный вариант с while:

a = 1
b = 1
c = 1
d = 1
while a < 10:
    a+=1
    while b < 10:
        b+=1
        while c < 10:
            c+=1
            while d < 10:
                d+=1
                if (b != c and c != d and b != d):
                    if (a ** 3 == ((b ** 3) + (c ** 3) + (d ** 3))):
                        print(a)


Переформатирование кода в List Comprehensions
Написал код который парсит csv файл и формирует список в формате
[['value_1', 'value_2', km], ....]:

with open("values.csv") as file:
    text = file.read().splitlines()

db = []
for i in range(len(text)):
    text_string = text[i]
    new_element = text_string.split(';')
    third_to_int = int(new_element.pop())
    new_element.append(third_to_int)
    db.append(new_element)

Можно как то сделать код короче в формате List Comprehensions?
Пытаюсь вот так но выдает ошибку.

new_db = [[text[i].text_string.split(';').pop] for i in range(len(text))]

Сделал,

new_db = [text[i].split(';') for i in range(len(text))]

но теперь нужно что бы 3 значение было тип int, а не строка?
Так тоже не получается:

new_db = [map(int, i.split(';')) for i in text]

Если два раза разбирать строку, то так:

with open('values.csv') as f:
    db = [line.split(';')[:-1] + [int(line.split(';')[-1])] for line in f]
print(db)

Если разбирать один раз, то так:

with open("temp.txt") as f:

    def cvt(tokens):
        return tokens[:-1] + [int(tokens[-1])]

    db = [cvt(line.split(';')) for line in f]

print(db)

Или так:

with open("temp.txt") as f:
    db = [
        (lambda tokens: tokens[:-1] + [int(tokens[-1])])(line.split(';'))
        for line in f
    ]
print(db)


Неопределенное поведение json
Я написал программу на питоне с использованием json, которая перечисляет каждый position Y, и заменяет значения на 5. Вместо того что бы перечислить все position Y и заменить значение на 5, он просто делает файл пустым, стирает все данные, при чем ошибок компилятор не выдает ошибок
Вот код
<code>
import json

import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()

file_path = filedialog.askopenfilename(initialdir="/storage/emulated/0/Android/hypper maps/Saves/")
with open(file_path, 'r', encoding='utf-8') as f:
  jn = f.read()
  dt = json.loads(jn)

i = 0

whl = True
while whl:
    i+=1
    with open(file_path, 'w', encoding='utf-8') as f:
        dt['props'][i]['position']['y'] = 5
        if i == 200:
            whl=False
</code>

попробуй так
<code>
import json
import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()

file_path = filedialog.askopenfilename(initialdir="/storage/emulated/0/Android/hypper maps/Saves/")
with open(file_path, 'r', encoding='utf-8') as f:
    jn = f.read()
    dt = json.loads(jn)

i = 0

whl = True
while whl:
    i+=1
    dt['props'][i]['position']['y'] = 5
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(json.dumps(dt, indent=2)) #эта строка нужна, но её не было
    if i == 200:
        whl=False

</code>


Ошибка vk_api.exceptions.ApiError
Есть код:
<code>
session.method('messages.send', {'user_id' : id, 'message' : 'test', 'random_id' : '0'})
</code>
При выполнении кода получаю ошибку:

vk_api.exceptions.ApiError: [17] Validation required: please open redirect_uri in browser

В документации VK API по коду ошибки 17 сказано:

Действие требует подтверждения — необходимо перенаправить пользователя на служебную страницу для валидации.

В библиотеке vk_api получить
redirect_uri можно в объекте
ApiError

from vk_api.exceptions import ApiError

try:
    session.method('messages.send', {'user_id': id, 'message': 'test', 'random_id': '0'})
except ApiError as e:
    print(e.error["redirect_uri"])

Эту ссылку уже открывает пользователь токена в браузере. Пользователь подтверждает и метод можно использовать снова.


Разделение переменной на переменные
Допустим, на вход подается строка:
2 + x = 12
программа должна разделить это на 4 переменные:

first = 2
second = x
third = 12
task = "+"

как такое сделать?

Вы можете использовать регулярные выражения для вашей задачи (или нет - см. примечание в конце):

import re

inp = "2 + x = 12"     # или  inp = input()  для ввода из консоли
first, task, second, __, third = re.split(r"\s+", inp)

first = int(first)
third = int(third)

После этого кода будут значения переменных такие:

first = 2
second = "x"
third = 12
task = "+"

Объяснение:

Функция
split() модуля
re (т.е.
re.split()) принимает как первый параметр регулярное выражение, для которого второй параметр будет делиться на части.
В регулярном выражении
r"\s+":

\s значит пробел (space) или табулятор (или другой пустой символ),

+ значит, что такой символ может повториться.

Значит, строка
inp будет делиться на основании присутствия подстрок из пустых символов.

Таким образом, результатом использования функции
re.split() будет список

["2", "+", "x", "=", "12"]

из которого вытащим отдельные элементы так называемой распаковкой списка:

first, task, second, __, third = ...

Для ненужного элемента
= мы использовали (чудесное) имя
__, чтобы ясно было видеть, что нам его не надо.

Примечание:
В вашем конкретном случае, когда между отдельными частями находятся только пробелы, возможно обойтись без регулярных выражений (
import re) а применить только стандартную функцию
split():

first, task, second, __, third = inp.split()


Pls help newbie
Задача:

Создать функцию update_car_info,
в которой все именованные аргументы будут объединены в
словарь car.
Добавить в словарь новый ключ is_available с значением True
Вернуть из функции измененный словарь.
Вызвать функцию с именованными аргументами brand и price,
их значения могут быть любыми
Вывести в терминал результат вызова функции

<code>
def update_car_info(**car):
    newdict = {'is_available': True}
    return newdict

update_car_info('brand', 'price')
</code>

TypeError: update_car_info() takes 0 positional arguments but 2 were given

Попробуйте как-то так:
<code>
def update_car_info(**car):
  car['is_available'] = True
  return car

print(update_car_info(brand='BMW', price=100500))
</code>


Вывести последовательные строки по условию Pandas
Как из предоставленного DF вывести пользователей, которые совершали события в очередности: "Проснулся" => "Почистил зубы" => "Пошел на работу"?
Примерно понимаю что нужно использовать shift, но не совсем понимаю как с ним работать
<code>
d = {'Время': ['2023-01-01 00:00:00', '2023-01-01 00:00:01', '2023-01-01 00:00:01', '2023-01-01 00:00:05', '2023-01-01 00:00:07', '2023-01-01 00:00:10', '2023-01-01 00:00:18', '2023-01-01 00:00:25', '2023-01-01 00:18:00', '2023-01-01 00:20:00'],
    'Пользователь': ['Петр', 'Иван', 'Петр', 'Петр', 'Семен', 'Иван', 'Федор', 'Иван', 'Алексей', 'Игнат'],
     'Событие': ['Проснулся', 'Проснулся', 'Почистил зубы', 'Пошел на работу', 'Умылся', 'Почистил зубы', 'Умылся', 'Пошел на работу', 'Пошел на работу', 'Заснул']
    }

df = pd.DataFrame(d)

df['check_1'] = df.groupby('Пользователь')['Событие'].shift(+2)=='Проснулся'

df['check_2'] = df.groupby('Пользователь')['Событие'].shift(+1)=='Почистил зубы'

act = df.loc[(df['Событие'] == 'Пошел на работу') & (df['check_1'] == True) & (df['check_2'] == True)]

people_uniq = act.Пользователь.unique()
</code>
Почему-то результат выходит меньше ожидаемого

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

df = pd.DataFrame({'Индекс': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                   'Время': ['00:00', '00:00', '00:01', '00:02', '00:03', '00:03', '00:04', '00:05', '00:06', '00:06'],
                   'Пользователь': ['Петр', 'Иван', 'Петр', 'Петр', 'Семен', 'Иван', 'Федор', 'Иван', 'Алексей',
                                    'Игнат'],
                   'Событие': ['Проснулся', 'Проснулся', 'Почистил зубы', 'Пошел на работу', 'Умылся', 'Почистил зубы',
                               'Умылся', 'Пошел на работу', 'Пошел на работу', 'Заснул']})
s = df.groupby('Пользователь')['Событие'].sum().eq('ПроснулсяПочистил зубыПошел на работу').where(lambda x: x).dropna().index.tolist()
print(s)

['Иван', 'Петр']


Обрезать строку по известному количеству символов в конце
есть строка:

mystr = 'sometext888999'

мне нужно получить число на конце 888999
проблема в том, что sometext постоянно разный и разной длины, и replace я использовать не могу
а код вида:

mystr2 = str(mystr)[:-6]

оставляет часть перед нужными цифрами, которую мне наоборот, надо откинуть

Надо всего лишь
-6 ставить не после двоеточия, а перед ним:

mystr2 = mystr[-6:]

Ну и явно приводить к строке
str(mystr) не нужно, у вас же и так
mystr - строка.


Как получить упомянутого человека в discord.py
у меня есть строка:
for user1 in cursor.execute("SELECT nickname,sId,elo,kills,deaths,wins,lose FROM users WHERE login = ?",[ctx.mention.id]):
и мне нужно получить id именно ПЕРВОГО упомянутого человека т.к в будущем мне надо будет управлять еще 10 пользователями

При создании команды Вы можете указать аргумент в который будет помещен пользователь:

async def test(ctx, user: discord.Member) #user - туда будем помещён упомянутый пользователь.

Теперь просто вставляем его
ID:

for user1 in cursor.execute("SELECT nickname,sId,elo,kills,deaths,wins,lose FROM users WHERE login = ?",(user.id)):

Полный код:

async def test(ctx, user: discord.Member)
    for user1 in cursor.execute("SELECT nickname,sId,elo,kills,deaths,wins,lose FROM users WHERE login = ?",(user.id)):
        name = user1[0]


no such file or directory File os python
Выдает ошибку no such file or directory

File "c:/Users//AppData/Local/Programs/Algoritmika/vscode/data/extensions/algoritmika.algopython-20220718.163731.0/data/student/1276433/143002/main.py", line 97, in showChosenImage
    workimage.loadImage(workdir,filename)
  File "c:/Users//AppData/Local/Programs/Algoritmika/vscode/data/extensions/algoritmika.algopython-20220718.163731.0/data/student/1276433/143002/main.py", line 82, in loadImage
    self.image = Image.open(image_path)
  File "C:\Users\\AppData\Local\Programs\Algoritmika\algovenv\lib\site-packages\PIL\Image.py", line 2878, in open
    fp = builtins.open(filename, "rb")
FileNotFoundError: [Errno 2] No such file or directory: 'ball.png'

Код:

from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import os
from PIL import Image

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.cur_dir = ''
        self.resize(1000, 700)
        self.setWindowTitle('Easy Editor')
        global ql
        ql = QLabel('Картинка', self)

        self.left = QPushButton('Лево', self)
        self.right = QPushButton('Право', self)
        self.zerkalo = QPushButton('Зеркало', self)
        self.rezkost = QPushButton('Резкость', self)
        self.ch_b = QPushButton('Ч/б', self)
        self.papka = QPushButton('Папка', self)

        global listwidget
        listwidget = QListWidget(self)

        listwidget.setGeometry(50, 80, 150, 600)

        ql.setGeometry(250, 250, 100, 50)

        self.papka.setGeometry(50, 30, 150, 30)
        self.left.setGeometry(250, 600, 100, 30)
        self.right.setGeometry(400, 600, 100, 30)
        self.zerkalo.setGeometry(550, 600, 100, 30)
        self.rezkost.setGeometry(700, 600, 100, 30)
        self.ch_b.setGeometry(850, 600, 100, 30)
        self.papka.clicked.connect(self.showFilenameList)
        listwidget.currentRowChanged.connect(showChosenImage)

        global workdir
        workdir = ''

    def showFilenameList(self):
        workdir = QFileDialog.getExistingDirectory()
        extensions1 = ['.jpg','.jpeg','.png','.gif','.bmp']
        filenames = self.filter(os.listdir(workdir),extensions1)
        listwidget.clear()
        for filename in filenames:
            listwidget.addItem(filename)
    def filter(self, files, extensions1):
        result = []
        for filename in files:
            for ext in extensions1:
                if filename.endswith(ext):
                    result.append(filename)
        return result
class ImageProcessor():
    def __init__(self):
        self.image = None
        self.dir = None
        self.filename = None
        self.save_dir = 'Modified/'

    def do_bw(self):
        self.image = self.image.convert('L')
        self.saveImage()
        image_path = os.path.join(self.dir,self.save_dir,self.filename)
        self.showImage(image_path)

    def saveImage(self):
        path = os.path.join(self.dir,self.save_dir)
        if not(os.path.exists(path) or os.path.isdir(path)):
            os.mkdir(path)
        image_path = os.path.join(path,self.filename)
        self.image.save(image_path)

    def loadImage(self, dir, filename):
        self.dir = dir
        self.filename = filename
        image_path = os.path.join(dir,filename)
        self.image = Image.open(image_path)

    def showImage(self,path):
        ql.hide()
        pixmapimage =QPixmap(path)
        w,h = ql.age.width(),ql.height()
        pixmapimage = pixmapimage.scaled(w,h,Qt.KeepAspectRatio)
        ql.setPixmap(pixmapimage)
        ql.show()

workimage = ImageProcessor()

def showChosenImage():
    if listwidget.currentRow() >= 0:
        filename = listwidget.currentItem().text()
        workimage.loadImage(workdir,filename)
        image_path = os.path.join(workimage.dir,workimage.filename)
        workimage.showImage(image_path)

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())

Терялась переменная глобальная workdir в функции её определяющей

def showFilenameList(self):
        global workdir

так же ещё одна ошибка

w,h = ql.width(),ql.height()

так же исспользовать функцию dir как имя переменной не комильфо


Как остановить через минуту выполнение цикла for event in longpoll.listen():
listen() запускает "слушать сервер". C помощью break с условием "стоп" программа останавливается. Но как сделать, чтобы программа остановилась через определенное время, если нет событий (message), без 'KeyboardInterrupt'. Или подскажите готовый ответ по ссылке.
<code>
import time
vk = vk_api.VkApi(token=group_token)
longpoll = VkLongPoll(vk, group_id=group_id)
def write_msg(user_id, message):
    vk.method('messages.send', {'user_id': user_id, 'message': message,  'random_id': random.randrange(10**7)})

for event in longpoll.listen():
    if event.type == VkEventType.MESSAGE_NEW:

        if event.to_me:
            msg_to_me = event.text.lower()
            event_id = event.user_id

            if msg_to_me == "привет":
                write_msg(event_id, f"Привет, друг!")
            elif msg_to_me == "пока":
                write_msg(event_id, "Пока, дружище!")
            elif msg_to_me == "8":
                write_msg(event_id, "Сеанс окончен")
                break
            else:
                write_msg(event_id, "Напишите 'привет' или 'пока' или '8', если хотите завершить сессию...")
            print(f'{msg_to_me}, {event_id}')
time = 10
stop_event.wait(time)
</code>

У
VkLongPoll есть параметр
wait, который отвечает за время ожидания ответа (после которого снова отправляется запрос). Тогда
longpoll.listen(), который запускает вечный цикл, не нужен, достаточно
longpoll.check().

...

longpoll = VkLongPoll(vk, group_id=group_id, wait=60)

while len(events := longpoll.check()) > 0:
    for event in events:
        ...

Но ВКонтакте в своей документации предупреждает:

Некоторые прокси-серверы обрывают соединение после 30 секунд, мы рекомендуем указывать
wait=25.

Максимальное значение 90 секунд, что вполне достаточно.

Если данное решение вам не подходит или нужна задержка больше, вы можно создать свой
listen(), который будет выключаться через N запросов на сервер:

...

longpoll = VkLongPoll(vk, group_id=group_id, wait=20)

def custom_listen(n=3):
    counter = 0  # Текущее количество пустых запросов
    while counter < n:
        events = longpoll.check()
        if len(events) == 0:
           counter += 1
        else:
           counter = 0

        for event in events:
            yield event

for event in custom_listen(3):
    ...

Таким образом, после трёх пустых запросов, длинной 20 секунд, он завершит свой цикл.


Формирование path c помощью os.path.join
Подскажите все ли корректно при формировании path c помощью os.path.join по получаю обратный слеш перед именем файла. Как сделать что бы путь был корректный виндовый.

 with os.scandir(dirname) as files:
            for file in files:
               if file.is_file():
                   print(os.path.join(dirname, file.name))

Результат:

C:/Users/Пользователь/Desktop/XXXXX\icon.ico

Я бы перешел на pathlib
Тут сразу будет путь от директории:

from pathlib import Path

...

for file in Path(dirname).iterdir():
    if file.is_file():
        print(file)

Если нужно путь сложить, то это можно сделать через оператор
/, типа:

file_name = '1.txt'
path = Path(dirname) / 'src' / file_name

А направление слэша (
/ или
\) будет от текущей системы учитываться
Единственное то, что
file будет не строкой, а объектом со своими полями и методами, питоничьи функции из коробки (типа
open,
os.path.*,
shututil.*) умеют с ним работать, но если нужно получить именно строку, то нужно в
str оборачивать:
str(file)


Python Изменение раскладки клавиатуры
OC windows 10
для получения раскладки клавиатуры использую функцию
(она работает корректно):

import ctypes
def get_layout():
    u = ctypes.windll.LoadLibrary("user32.dll")
    pf = getattr(u, "GetKeyboardLayout")
    if hex(pf(0)) == '0x4190419':
        return 'ru'
    if hex(pf(0)) == '0x4090409':
        return 'en'

для изменения на иную раскладку:

import py_win_keyboard_layout
# переключение на русскую раскладку
py_win_keyboard_layout.change_foreground_window_keyboard_layout(0x04090419)
# переключение на английскую раскладку
py_win_keyboard_layout.change_foreground_window_keyboard_layout(0x04090409)

Переключение на en(0x04090409) происходит верно, но переключение на ру(0x04090419), игнорируется без какой-либо ошибки.
ps. попробовал использовать win32api, опять же команды игнорируются

import win32api
win32api.LoadKeyboardLayout("00000409", 1)
win32api.LoadKeyboardLayout("00000419", 2)

Буду крайне признателен за указание ошибки или иной путь решения.
Заранее благодарю за помощь!

Могу предложить такой вариант.
<code>
import pyautogui

def switch_keyboard_language():
    pyautogui.keyDown('alt')
    pyautogui.keyDown('shift')
    pyautogui.keyUp('alt')
    pyautogui.keyUp('shift')

</code>


Ветки на сообщение бота и реакции discord.py
подскажите, как сделать так, чтобы в определенном канале бот удалял сообщение, потом создавал эмбет и переписывал сообщение в эмбет, так же создавал ветку и ставил реакции на свой эмбет?
Кода немного есть, но это в основном переписывание сообщения от участника(так и нужно), и удаление оригинального сообщения(от участника конечно же)
<code>
async def on_message(ctx):
    if ctx.author != bot.user:
        await ctx.reply(ctx.content)
        await ctx.delete()```
</code>

Получаем канал методом
client.get_channel:

async def on_message(ctx):
    if ctx.author != bot.user:
        channel = client.get_channel(id)

Проверяем с какого канала пришло сообщение:

        if channel.id == ctx.channel.id:

Если это нужный нам канал:

Удаляем сообщение.

            await ctx.delete()

Создаём
embed и отправляем сообщение.

            embed = discord.Embed(title="New message:", description=ctx.content)
            message = await channel.send(embed=embed)

Добавляем к отправленному сообщению реакцию.

            await message.add_reaction('💬')

Полный код:

async def on_message(ctx):
    if ctx.author != bot.user:
        channel = client.get_channel(id)
        if channel.id == ctx.channel.id:
            await ctx.delete()
            embed = discord.Embed(title="New message:", description=ctx.content)
            message = await channel.send(embed=embed)
            await message.add_reaction('💬')


Как можно привязать кнопку телеграмм бота для перехода в группу в телеграмме?
Допустим у меня есть группа в телеграмме и бот. Могу ли я сделать кнопку которая перекидывает в чат группы через id группы? И как это реализовать на питоне

Можно сделать кнопку примерно так с помощью
pyTelegramBotApi:

import telebot
import env
groupID = env.GroupId
bot = telebot.TeleBot(env.TOKEN)
button = telebot.types.InlineKeyboardButton("example", url = bot.create_chat_invite_link(groupID))


Не работает функция вычисления НОД "Пузырьком"
Основной файл

import supportlib

def multipliers(number, all = None):
    list_multipliers = []
    if all:
        for n in range(1, number + 1):
            if number % n == 0:
                list_multipliers.append(n)
        return list_multipliers
    else:
        n = 2
        while number != 1:
            if number % n == 0:
                list_multipliers.append(n)
                number = number / n
            else:
                n += 1
        return list_multipliers

def lcm(arg):
    if type(arg) == list:
        for n in range(len(arg)):
            arg.insert(n, multipliers(arg.pop(n)))
        while arg.count(1) == len(arg) - 1:
            for tag in range(len(arg) - 1):
                list_mul = []
                for a in range(len(arg[tag])):
                    for b in range(len(arg[tag + 1])):
                        if (arg[tag])[a] == (arg[tag + 1])[b]:
                            list_mul.append((arg[tag])[a])
                arg.pop(tag)
                arg.insert(tag, 1)
                arg.pop(tag + 1)
                arg.insert(tag + 1, list_mul)
        print(arg)
        print(arg[-1])
        return supportlib.mul(arg[-1])

supportlib.py

def mul(list_of_numbers):
    return_number = 1
    for n in range(len(list_of_numbers)):
        return_number = return_number * int(list_of_numbers[n])
    return return_number

Не работает функция
lcm().
print(lcm([6, 10, 12])) выводит:

[[2, 3], [2, 5], [2, 2, 3]]
[2, 2, 3]
12

Желаемое поведение:

Получает на вход (пока что) список с int-данными
Каждый int раскладывает на множители и записывает вместо этого int множители в качестве списка
Берёт по очереди n и n + 1 списки из большого списка
n-элемент меняет на единицу, n + 1 элемент меняет на список общих чисел в n и n + 1
Повторяет так со всеми элементами
Перемножает элементы в списке расположенном в конце большого списка

Короче говоря это НОД, сделанный через своеобразный "пузырёк". Но почему-то он не работает.

Фух, я доделал этот ужОс. Пользуйтесь на здоровье!
<code>
def lcm(arg):
    if type(arg) == list:
        for n in range(len(arg)):
            arg.insert(n, multipliers(arg.pop(n)))
        while arg[-2] != 1:
            for tag in range(len(arg) - 1):
                list_mul = []
                for a in range(len(arg[tag])):
                    for b in range(len(arg[tag + 1])):
                        if (arg[tag])[a] == (arg[tag + 1])[b]:
                            list_mul.append((arg[tag])[a])
                            (arg[tag])[a], (arg[tag + 1])[b] = 1, 1
                arg[tag], arg[tag + 1] = 1, list_mul
        return supportlib.mul(arg[-1])
</code>


Сложить все значения списка включая вложенные кортежи
Как сложить все значения например вот такого списка [(5, 6, 7), 5], желательно не перебирая все значения в цикле, так как может быть еще и вложенный картеж например [(5, (6, 5), 7), 5], степень вложенности может быть разная. Функция sum не работает? Получается только переводить список в строку, очищать от скобок и запятых потом назад все в список и суммировать? Или есть другой способ?

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

import collections.abc

def traverse(item):
    if isinstance(item, collections.abc.Iterable):
        for i in item:
            yield from traverse(i)
    else:
        yield item

sum считает сумму любой последовательности.
sum(traverse(...)) сложит все элементы, которые отыщет внутри
...:

print(sum(traverse([(5, (6, 5), 7), 5])))


Ошибка при импортировании OpenCV-python ubuntu 16.04
Стоит система ubuntu 16.04 LTS с собранным python3.9 (НЕ ЧЕРЕЗ APT)
Когда я пытаюсь импортировать библиотеку OPENCV у меня выдаётся ошибка:
<code>
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.9/site-packages/cv2/__init__.py", line 181, in <module>
    bootstrap()
  File "/usr/local/lib/python3.9/site-packages/cv2/__init__.py", line 153, in bootstrap
    native_module = importlib.import_module("cv2")
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
ImportError: /lib/x86_64-linux-gnu/libz.so.1: version `ZLIB_1.2.9' not found (required by /usr/local/lib/python3.9/site-packages/cv2/../opencv_python_headless.libs/libpng16-186fce2e.so.16.37.0)
</code>
Как её исправить?

Выполни команды
<code>
pip install zlib numpy
pip install opencv-python==4.5.5.64
</code>


Как вывести статус выполнения функции в шаблон HTML в Django
Подскажите: есть шаблон, есть форма в которой я получаю определенные данные. При нажатии на кнопку в форме, данные обрабатываются во views, после обработки функция возвращает результат, например: "Все ок, задача выполнена без ошибок" или "Не ок, есть ошибки такие-то".
Вопрос: Как отобразить статус выполнения в шаблоне?
Я так понимаю, что страница уже отрендерина и, чтобы не обновлять страницу, мне нужно отобразить статус, что все ок, например.
Может есть какие-то методы у forms или еще какие-либо инструменты?

Может это вам поможет:

from django.contrib import messages

    def foo(request):
        if request.method == "POST":
            objectform = ObjectForm(request.POST)
            if objectform.is_valid():
                objectform.save()
                messages.success(request, ('Данные успешно добавлены!'))
                return redirect("/")
            else:
                messages.error(request, 'Ошибка сохранения формы.')

Шаблон:

        {% if messages %}
            <ul class="messages">
                {% for message in messages %}
                    <li {% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
                {% endfor %}
            </ul>
        {% endif %}


Python Opencv. Возможно ли выводить онко веб камеры на веб странице? Для например добавления кнопок к этому окну
Нужно сделать программу (с кнопками) для отправления фото.
Но в opencv можно только описать нажатие клавиш. Можно ли как-то выводить форму камеры в веб страницу? Есть примеры?

    #!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
import cv2
import os

from datetime import datetime
# from ui_main_window import *

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import QTimer, QThread, pyqtSignal, pyqtSlot
from PyQt5 import QtWidgets, QtCore, QtGui

class Thread1(QThread):
    changePixmap = pyqtSignal(QImage)

    def __init__(self, *args, **kwargs):
        super().__init__()

    def run(self):
        self.cap1 = cv2.VideoCapture(0)
        self.cap1.set(3, 480)
        self.cap1.set(4, 640)
        self.cap1.set(5, 30)
        while True:
            ret1, image1 = self.cap1.read()
            if ret1:
                im1 = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)
                height1, width1, channel1 = im1.shape
                step1 = channel1 * width1
                qImg1 = QImage(im1.data, width1, height1, step1, QImage.Format_RGB888)
                self.changePixmap.emit(qImg1)

def stop(self):
    #        if self.active == False:
    self.out1.release()

class MainWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.resize(660, 520)
        #        self.ui = Ui_Form()
        #        self.ui.setupUi(self)

        self.control_bt = QPushButton('START')
        self.control_bt.clicked.connect(self.controlTimer)
        self.image_label = QLabel()

        self.saveTimer = QTimer()

        self.th1 = Thread1(self)
        self.th1.changePixmap.connect(self.setImage)
        self.th1.start()

        vlayout = QVBoxLayout(self)
        vlayout.addWidget(self.image_label)
        vlayout.addWidget(self.control_bt)

    @QtCore.pyqtSlot(QImage)
    def setImage(self, qImg1):
        self.image_label.setPixmap(QPixmap.fromImage(qImg1))

    def controlTimer(self):
        if not self.saveTimer.isActive():
            # write video
            self.saveTimer.start()
            self.th2 = (self)
            self.th2.active = True  # +
            self.th2.start()
            #            self.active = True
            # update control_bt text
            self.control_bt.setText("STOP")
        else:
            # stop writing
            self.saveTimer.stop()
            #            self.active = False
            self.th2.active = False  # +

            self.th2.stop()  # +
            self.th2.terminate()  # +
            # update control_bt text
            self.control_bt.setText("START")

if __name__ == '__main__':
    app = QApplication(sys.argv)

    mainWindow = MainWindow()
    mainWindow.show()

    sys.exit(app.exec_())


Python. Как взять из списка (list) число, если там строка и число находится в ней?
Не могли бы подсказать, как в Python сложить все числа из подобного списка, если числа находятся вместе со словами и по сути являются строкой?
<code>
list_product = ['moduct 500', 'doduct 1200', 'funduk 200', 'kuduk 500']
</code>
Буду очень благодарен =)

Например так:

list_product = ['moduct 500', 'doduct 1200', 'funduk 200', 'kuduk 500']
sum=0
for el in list_product:
    sum+=int(el.split()[1])
print('Сумма',sum)

Вывод:

Сумма 2400


Как настроить отправку ответных сообщений, которые видит только пользователь, вызвавший команду? Discord py
Хочу сделать, чтобы бот отправлял ответное сообщение, которое видит только один пользователь

Мой код:
<code>
@bot.slash_command(name='namecard', description = "отправляет выбранный баннер")
async def banner(ctx, категория: str, название: str):
  pic2 = название + ".png"
  await ctx.defer()
  await asyncio.sleep(1)
  await ctx.respond(f'Баннер **«{название}»**', file=discord.File(f'General/NameCard/{категория}/{pic2}'))
</code>

Вам необходимо добавить условие
ephemeral.

ephemeral=True - видно только одному пользователю.

ephemeral=False - видно всем.
В вашем случае:

  await ctx.respond(f'Баннер **«{название}»**', file=discord.File(f'General/NameCard/{категория}/{pic2}'), ephemeral=True)


Как SpinBox реализовать добавление или удаление полей текстового ввода
Подскажите, пожалуйста, как в Python (Tkinter или PySimpleGUI) с помощью
SpinBox реализовать возможность добавления или удаления полей для ввода текста в главном окне программы путем увеличении или уменьшении значения
SpinBox.
С помощью какого фреймворка это лучше реализовывать?

Более-менее минимальный пример на tkinter. Создаваемые текстовые поля добавляем в список. Отслеживаем изменение значения в
SpinBox, если новое значение больше, чем полей уже существует - добавляем поля ввода, если меньше - удаляем.

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

entries = []

def on_change():
    value = int(spinbox.get())
    if value > len(entries):
        entries.append(tk.Entry())
        entries[-1].pack()
    elif value < len(entries):
        entries.pop().destroy()

spinbox = ttk.Spinbox(root, from_=0, to=10, command=on_change, state="readonly")
spinbox.set(0)
spinbox.pack()

root.mainloop()


Как вызвать класс из функции?
Помогите пожалуйста решить такую задачу. В классе А в функции Afun2_1 нужно вызвать класс B из функции Afun1
<code>
class A:

    def __init__(self):
        self.B_cls = B()
        self.C_cls = C()

    def Afun1(self, a, b, c):
        class B:
            def __init_(self, a, b, d):
                self.a = a
                self.b = b
                self.d = d
            def Bfun1(self):
                """something colculation"""
                return """solution 'Bfun1'"""

        class C:
            def __init__(self, f, g, h):
                self.f = f
                self.g = g
                self.h = h

        def Afun1_1(self):
            """something colculation"""

    def Afun2(self, a, e):
        def Afun2_1(a, l):
            """something colculation"""
            **"""And here for colculation, I need to get 'class B'. How to do it ? """**
            return """solution 'Afun2_1'"""
</code>

В данном контексте не очень понятно, с какой целью классы лежат внутри методов.
Когда класс лежит внутри метода, то его объявление ограничено областью видимости этого метода. Однако, это не
мешает использовать его вне метода. Например, можно присвоить объявленные внутри метода класса полям класса контейнера, как в примере ниже, и затем обращаться к соответствующим полям через экземпляр класса контейнера:
<code>
class A:

    def __init__(self):
        self.B,  self.C = self.Afun1(1,2,3)

    def Afun1(self, a, b, c):
        class B:
            def __init__(self, a=a, b=b, d=c):
                self.a = a
                self.b = b
                self.d = d
            def Bfun1(self):
                """something colculation"""
                return f"called Bfun1: B.b is {self.b}'"

        class C:
            pass

        return B, C

    def Afun2(self, a, e):
        def Afun2_1(a, l):
            return self.B(a, l).Bfun1()
        return Afun2_1(a, e)

a = A()
rv= a.Afun2(111,2222)
print (rv)

## output:

# called Bfun1: B.b is 2222'
</code>


TypeError: 'list' object is not callable os pyqt5
Не понимаю почему выдает ошибку TypeError
<code>
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import os

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.cur_dir = ''
        self.resize(1000, 700)
        self.setWindowTitle('Easy Editor')

        self.image = QLabel('Картинка', self)

        self.left = QPushButton('Лево', self)
        self.right = QPushButton('Право', self)
        self.zerkalo = QPushButton('Зеркало', self)
        self.rezkost = QPushButton('Резкость', self)
        self.ch_b = QPushButton('Ч/б', self)
        self.papka = QPushButton('Папка', self)

        self.listwidget = QListWidget(self)

        self.listwidget.setGeometry(50, 80, 150, 600)

        self.image.setGeometry(250, 250, 100, 50)

        self.papka.setGeometry(50, 30, 150, 30)
        self.left.setGeometry(250, 600, 100, 30)
        self.right.setGeometry(400, 600, 100, 30)
        self.zerkalo.setGeometry(550, 600, 100, 30)
        self.rezkost.setGeometry(700, 600, 100, 30)
        self.ch_b.setGeometry(850, 600, 100, 30)
        self.papka.clicked.connect(self.showFilenameList)

        self.listwidget.itemClicked.connect(self.showImage)
        self.workdir = ''

    def showFilenameList(self):
        self.workdir = QFileDialog.getExistingDirectory()
        extensions1 = ['.jpg','.jpeg','.png','.gif','.bmp']
        filenames = filter(os.listdir(self.workdir),extensions1)
        self.listwidget.clear()
        for filename in filenames:
            self.listwidget.addItem(filename)
    def filter(self, files, extensions1):
        result = []
        for filename in files:
            for ext in extensions1:
                if filename.endswith(ext):
                    result.append(filename)
        return result
    def showImage(self,path):
        self.image.hide()
        pixmapimage = QPixmap(path)
        width,height = lb_image.width(),lb_image.height()
        pixmapimage = pixmapimage.scaled(w,h,Qt.KeepAspectRatio)
        self.image.setPixmap(pixmapimage)
        self.image.show()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())
</code>

    def showFilenameList(self):
        ...
        filenames = filter(os.listdir(self.workdir),extensions1)
                    ^^^^^^ встроенная функция питона
        ...

    def filter(self, files, extensions1):
        ^^^^^^ метод экземпляра вашего класса
        ...

Вы, видимо, ожидаете, что вызовется метод экземпляра вашего класса
filter, но в данном коде вызывается встроенная функция питона
filter, сигнатура которой выглядит так:

filter(function, iterable)

Таким образом, этот
filter получает на вход первым аргументом список вместо функции и у него не получается вызвать этот список как функцию. Вызвать ваш метод экземпляра класса можно явно указав, что это метод экземпляра класса с помощью
self:

    def showFilenameList(self):
        ...
        filenames = self.filter(os.listdir(self.workdir),extensions1)
                    ^^^^^^^^^^^ теперь вызывается метод экземпляра вашего класса
        ...


Как получить ID в боте телеграм, в личное сообщение бота?
<code>
bot.send_message(5517014795, f"📤Сумма Обмена: {course}\n\n"                                   f"📩Сумма к Получению: {float('{0:.8f}'.format(course / (price['bitcoin']['rub'] * 1.03)))} BTC\n\n"
                                     f"🏷На кошелёк: {wallet['proverka']}\n\n"
                                     f"📅Время Заявки: {datetime.datetime.now()}\n\n"
                                     f"От Пользователя:")
</code>
Нужно чтобы в пункте от пользователя отображался его id

Попробуйте:

f"От Пользователя: {message.from_user.id}"

Объект
message у вас должен передаваться как параметр функции-обработчика


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

Вот решение, в данных быблиотеках есть специальные методы для подобных сообщений.
Aiogram:

@dp.message_handler(content_types = ['new_chat_members', 'left_chat_member'])
async def delete(message):
    await bot.delete_message(message.chat.id, message.message_id)

Telebot и т.п.:

@bot.message_handler(content_types = ['new_chat_members', 'left_chat_member'])
def delete(message):
    bot.delete_message(message.chat.id, message.message_id)


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

class Engine ():

    objects = []

    def __init__ (self):
        pass

class Obstacle:

    xy = [0,0]

    def __init__(self, x, y):
        self.xy[0] = x
        self.xy[1] = y

engine = Engine ()
engine.objects.append (Obstacle(4, 4))
engine.objects.append (Obstacle(6, 6))

При выводе массива xy, значение равно [6,6].
Код ниже выводит True.

print (engine.objects[0].xy is engine.objects[1].xy)

Проблема тут:

class Obstacle:

    xy = [0,0]

Тут
xy - переменная класса, т.е. она привязана не к конкретному экземпляру класса, а одна для всех экземпляров.
Делайте так:

class Obstacle:

    def __init__(self, x, y):
        self.xy = [0, 0]
        self.xy[0] = x
        self.xy[1] = y

Можно еще более упростить:

class Obstacle:

    def __init__(self, x, y):
        self.xy = [x, y]


Как получить конкретное значение из бд sql в python?
У меня есть код написанный на discord.py и sqlite3:
<code>
for players in cursor.execute("""SELECT player1 FROM lobby WHERE id = ?""", [0]):
    if players[0] == None:
        cursor.execute("""UPDATE lobby SET player1 = ? WHERE id = ?""", (ctx.author.id, 0))
        sqlite_connection.commit()
        embed = discord.Embed(
            description=f"[1/10] {ctx.author.mention} присоединился к очереди"
        )
        await ctx.send(embed=embed)
    print(players[0])
</code>
переменная p1 выдает: ('None',), а мне надо получить просто None без лишних символов как я могу это сделать?

Вытаскивать значения из базы данных можно с помощью
for,
in:

for test in cursor.execute("""SELECT player1 FROM lobby WHERE id = ?""", [0]):

Мы назвали переменную
test. Теперь
player1 можно использовать как
test[0]. Например:

if test[0] == None: #Вместо None лучше использовать значение по умолчанию в Вашей таблице..

Последующие значения, например
SELECT player1, player2, player3 FROM мы получаем как
test[0],
test[1],
test[2] и т.д.
Полный код:

for test in cursor.execute("""SELECT player1 FROM lobby WHERE id = ?""", [0]):
    if test[0] == None:
        ....


Разбить массив на несколько массивов по условию [закрыт]

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

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

Закрыт 9 месяцев назад.

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

Помогите, пожалуйста разбить массив на несколько по условию. Имеется примерно такой массив (из внешнего файла):
<code>
TIMESTEP: 1
ITEM: ATOMS x y z
1 2 3
1 2 3
2 2 3
TIMESTEP: 2
ITEM: ATOMS x y z
2 3 4
4 4 4
5 5 5
7 7 7
TIMESTEP: 3
ITEM: ATOMS x y z
2 3 4
4 4 4
5 5 5
3 2 1
1 1 1
1 1 1
6 6 6
</code>
Пользователь вводит значение TIMESTEP в консоли, и выводится массив значений, соответствующий данному шагу. Количество элементов в пределах одного такого подмассива - разное. Я думала, что нужно как-то работать с повторяющимися строками ITEM: ATOMS x y z, но не могу сообразить как.

Как то так:
<code>
def split_array(file_content, step):
    step_data = []
    lines = file_content.split("\n")
    reading_data = False
    for line in lines:
        if "TIMESTEP: " + str(step) in line:
            reading_data = True
        elif "TIMESTEP: " in line:
            reading_data = False
        elif reading_data:
            step_data.append(line)
    return step_data

file_content = "TIMESTEP: 1\nITEM: ATOMS x y z\n1 2 3\n1 2 3\n2 2 3\nTIMESTEP: 2\nITEM: ATOMS x y z\n2 3 4\n4 4 4 \n5 5 5\n7 7 7\nTIMESTEP: 3\nITEM: ATOMS x y z\n2 3 4\n4 4 4 \n5 5 5\n3 2 1 \n1 1 1\n1 1 1 \n6 6 6"
step = int(input("Введите номер: "))
step_data = split_array(file_content, step)
print("Данные для шага", step, ":")
print("\n".join(step_data))
</code>


надо чтоб сначала одно заданное множество выводилось, а потом другое. но все элементы просто объединяет в одно
надо чтоб сначала одно заданное множество выводилось, а потом другое. но все элементы просто объединяет в одно. Чтобы потом выполнить над ними операции
<code>
a = []
s = []
print('Количество множеств')
l = int(input())
for i in range(l):
    print('Количество элементов в множестве')
    n=int(input())
    print('Введите числа')
    for i in range(n):
        a.append(int(input()))
s = set(a)
print(s)
</code>

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

s = []
print('Количество множеств')
l = int(input())
for i in range(l):
    print('Количество элементов в множестве')
    n=int(input())
    print('Введите числа')
    a = [] # новый список
    for i in range(n):
        a.append(int(input()))
    s.append(set(a)) # добавляем в результирующий список
print(s)

Но ещё правильнее собирать данные сразу в множество, минуя список:

    a = set()
    for i in range(n):
        a.add(int(input()))
    s.append(a)


Чтение json по частям
Скажите пожалуйста, как при помощи python и библиотеки json, читать json файл по частям
Вот часть json
<code>
{
  "map": "Desert",
  "props": [
    {
      "name": "Inflatable_boat",
      "uniqueId": 490.497925,
      "position": {
        "x": -2.94143414,
        "y": -4.11158657,
        "z": 21.5624847
      },
      "rotation": {
        "x": -0.5243113,
        "y": 0.487025142,
        "z": -0.484924853,
        "w": -0.5027446
      },
      "isKinematic": true,
      "instantiationData": null,
      "runtimeData": null
    }]
}
</code>
Мне нужно что бы при помощи библиотеки json, я нашел значение map, и заменил на свое значение

Можно вот так:
В файле main.json имеется вот такой исходный текст:

{"map": "Desert","props": [{"name": "Inflatable_boat","uniqueId": 490.497925,"position": {"x": -2.94143414,"y":-4.11158657,"z": 21.5624847},"rotation": {"x": -0.5243113,"y": 0.487025142,"z": -0.484924853,"w": -0.5027446},"isKinematic": true,"instantiationData": null,"runtimeData": null}]}

Код:

import json

# Открываем файл main.json на чтение
with open("./main.json", 'r', encoding='utf-8') as f:
  jn = f.read() # Читаем содержимое файла main.json в переменную
  dt = json.loads(jn) # Преобразовываем JSON в объект Python и сохраняем в переменной

# Открываем файл main.json на запись
with open("./main.json", 'w', encoding='utf-8') as f:
  dt['map'] = 'Mytext' # Меняем значение ключа map на требуемое

  dt['props'][0]['position']['x'] = 1500
  dt['props'][0]['position']['y'] = 1501
  dt['props'][0]['position']['z'] = 1502

  f.write(json.dumps(dt)) # Преобразовываем объект Python в JSON строку и получившийся результат записываем в файл main.json

В результате получаем следующий текст в файле main.json:

{"map": "Mytext", "props": [{"name": "Inflatable_boat", "uniqueId": 490.497925, "position": {"x": -2.94143414, "y": -4.11158657, "z": 21.5624847}, "rotation": {"x": -0.5243113, "y": 0.487025142, "z": -0.484924853, "w": -0.5027446}, "isKinematic": true, "instantiationData": null, "runtimeData": null}]}


Python увеличение значения элемента массива
Вот код

print(arr)
if count == 0:
    arr.append([result, 1])
else:
    for i in range(len(arr)):
        if arr[i][0] == result:
            print("100")
            print(arr[i][0])
            print(type(arr[i][0]))
            print(arr[i][1])
            print(type(arr[i][1]))
            arr[i][1] += 1
            print("200")

Вот результат

[('XX 7777 AA\n', 1)]
100
XX 7777 AA

<class 'str'>
1
<class 'int'>

Process finished with exit code -1073740791 (0xC0000409)

Почему не получается увеличить значение на 1?

Потому что в списке (list) под именем
arr лежит лишь один элемент и он имеет тип кортеж (tuple), а tuple является неизменяемой структурой данных, его значения нельзя переписать, если бы вы посмотрели какую ошибку выдаёт python, то увидели бы сообщение:
"TypeError: 'tuple' object does not support item assignment". Для Ваших целей лучше хранить список списков:

arr = [['XX 7777 AA\n', 1]]

UPD: Как привести к нужному виду большой массив таких данных.
Возможно, что метод получения запросов как-то позволяет получать данные в ином виде, но я не буду углубляться и предложу такой тривиальный метод, с помощью функции
map(). Она позволит обойти все элементы списка и привести к нужному виду.

# Полученный набор данных в исходном виде
arr = [
('XX 77 AA', 1),
('YY 65 BC', 2),
('ZY 13 BE', 3)
]

arr = list(map(list, arr))
print(arr)

Вывод:

[['XX 77 AA', 1], ['YY 65 BC', 2], ['ZY 13 BE', 3]]


Добавить в pandas столбец с промежуточными суммами по групам
Есть данные по продажам. нужно добавить для каждого счета общее количество штук различных товаров по счету.  Другими совами - добавить столбец где для каждой группы будет сумма столбца по данной группе. Данный код работает.

import pandas as pd

df_fee = pd.DataFrame(
    dict(
        sku=2*[1, 1, 2, 3, 4, 4],
        order_id=3*[3, 3, 4, 5],
        quantity=4*[ 1, 2, 3],
    )
)

def __count_nd_fill_units_by_group(g):
    order_sum = g['quantity'].sum()
    g.loc[:, "units_in_order"] = order_sum
    #
    # g = g.assign(units_in_order=order_sum)
    #
    return g

print(df_fee)
df_fee.loc[:, "units_in_order"] = None
df_fee = df_fee.groupby(['order_id', ], group_keys=False).apply(__count_nd_fill_units_by_group)
df_fee.sort_values(by=['order_id',], inplace=True)
print(df_fee)

и выдает такой результат:

        sku  order_id  quantity
0     1         3         1
1     1         3         2
2     2         4         3
3     3         5         1
4     4         3         2
5     4         3         3
6     1         4         1
7     1         5         2
8     2         3         3
9     3         3         1
10    4         4         2
11    4         5         3
    sku  order_id  quantity  units_in_order
0     1         3         1              12
1     1         3         2              12
4     4         3         2              12
5     4         3         3              12
8     2         3         3              12
9     3         3         1              12
2     2         4         3               6
6     1         4         1               6
10    4         4         2               6
3     3         5         1               6
7     1         5         2               6
11    4         5         3               6

d:\onedrive\projects\chud_amaz\soft_in_dev\moduled_way_oop\code_questions\order_total_units_filling.py:21: FutureWarning: In a future version,
df.iloc[:, i] = newvals will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either
df[df.columns[i]] = newvals or, if columns are non-unique,
df.isetitem(i, newvals)
g.loc[:, "units_in_order"] = order_sum

Два вопроса.

по ощущениям можно лучше (короче, проще, быстрее)
что за сообщение выдается в конце. Это потенциально опасно?

Можно короче, конечно:

import pandas as pd

df_fee = pd.DataFrame(dict(sku=2*[1, 1, 2, 3, 4, 4], order_id=3*[3, 3, 4, 5], quantity=4*[ 1, 2, 3],))

df_fee["units_in_order"] = df_fee.groupby("order_id")["quantity"].transform(sum)
df_fee.sort_values("order_id",  inplace=True)

df_fee:

    sku  order_id  quantity  units_in_order
0     1         3         1              12
1     1         3         2              12
4     4         3         2              12
5     4         3         3              12
8     2         3         3              12
9     3         3         1              12
2     2         4         3               6
6     1         4         1               6
10    4         4         2               6
3     3         5         1               6
7     1         5         2               6
11    4         5         3               6


Как остановить телеграм бота? Telebot
Всем доброго времени суток!
Прошу у Вас помощи в создании телеграм бота для личного использования.
Я хочу чтобы мой телеграм бот мог останавливаться.
Ниже привел пример

print('run')
bot.polling()
print('continue')

В консоль выводит "run", а вот continue уже не выводит. То есть это строчка выполняется пока я не крашну бота насильно.
Как можно завернуть "bot.polling" так, чтобы при каком-либо условии можно было его остановить?
Хочу сделать по типу этого:

while a == 0:
    bot.polling()
    if a > 0:
        bot.stop_bot()
        break

Но это так не работает.
Призываю на помощь ветеранов. Спасибо!

попробуй
<code>
@bot.message_handler(commands=['stop'])
def stop():
    sys.exit(0)
</code>


Запись Frame в excel
Помогите пожалуйста.
При написании парсера выявил у себя ошибку, в целом запись фрэйма в excel затирается последней записью.
Весь код скидывать нет смысла, нашел место где этот косяк вылазит.
Сам код, где ошибка:

import pandas as pd

excel_file = r'F:\Python\url\excel\1.xlsx'
excel_file_1 = r'F:\Python\url\excel\2.xlsx'

wb = pd.read_excel(excel_file,'Лист1')
df = (pd.DataFrame(wb)).values.tolist()

for i in df:

    d = ''.join(i)

    dfa = {'КН':d}
    page = pd.concat([pd.DataFrame(columns = []), pd.DataFrame.from_records([dfa])], ignore_index=False)
    print(page)
with pd.ExcelWriter(excel_file_1, engine='openpyxl', mode = 'w') as writer:
    page.to_excel(writer, sheet_name='КН', index=True)

в таблице 1 имеются записи в столбце A кадастровые номера (КН), к примеру 52:01:0100051:10 и 52:01:0100051:18.
Эти 2 КН превращаем в список

df = (pd.DataFrame(wb)).values.tolist()

Далее, хочу каждый КН обработать в отдельности. Предположительно вот так (может быть и ошибаюсь)

for i in df:

    d = ''.join(i)

Переменная d подставляется в ссылку и данные по двум КН приходят через print, но запись в фрэйм затирается последней записью.
И потом хочу записать каждый КН в отдельную строку excel, в таблицу 2. Но ни чего не выходит.
Помогите пожалуйста))

Для того, чтобы записывать каждый КН в отдельную строку Excel, нужно в цикле for создавать новый фрейм и записывать его каждый раз в новый файл. В вашем случае, фрейм page создается вне цикла, что приводит к перезаписи данных.
<code>
import pandas as pd

excel_file = r'F:\Python\url\excel\1.xlsx'
excel_file_1 = r'F:\Python\url\excel\2.xlsx'

wb = pd.read_excel(excel_file,'Лист1')
df = (pd.DataFrame(wb)).values.tolist()

with pd.ExcelWriter(excel_file_1, engine='openpyxl', mode = 'w') as writer:
    for i in df:
        d = ''.join(i)
        dfa = {'КН':d}
        page = pd.concat([pd.DataFrame(columns = []), pd.DataFrame.from_records([dfa])], ignore_index=False)
        page.to_excel(writer, sheet_name='КН', index=True, startrow=writer.sheets['КН'].max_row, header=False)
</code>


Ошибка img2pdf pyhon
Есть файлы типа
1.ipg,
2.ipg,
rtrrt.jpg,
ghthh.jpg. Их нужно объединить в pdf файл.
Соединение файлов должно быть обязательно 1.ipg, 2.ipg, остальные не важно. Код ниже работает, но на некоторых выдает ошибку

import img2pdf
import glob
import os

dir = os.path.abspath(os.curdir)
print(dir)
dir_new = dir.split('\\')[-1]
print(dir_new)

with open(dir_new +".pdf", "wb") as f:
     f.write(img2pdf.convert(glob.glob("*.jpg")),  rotation=img2pdf.Rotation.ifvalid)

Текст ошибки:

Traceback (most recent call last):
  File "C:/pyserver/1.py", line 13, in <module>
    f.write(img2pdf.convert(glob.glob("*.jpg")),  rotation=img2pdf.Rotation.ifvalid)
TypeError: write() takes no keyword arguments

В коде происходит ошибка, потому что метод write() не принимает именованные аргументы, такие как rotation.
Чтобы устранить ошибку, можно преобразовать в PDF до вызова write(), вот так:
<code>
with open(dir_new +".pdf", "wb") as f:
pdf_bytes = img2pdf.convert(glob.glob("*.jpg"), rotation=img2pdf.Rotation.ifvalid)
f.write(pdf_bytes)
</code>


Python Найти уникальное число с помощью списка из 100 нулей
Здравствуйте, учусь Питону. Столкнулся с задачей:

У вас есть список от 0 до 99, в нем повторяются числа, кроме одного.
Используйте список из ста нулей, чтоб найти уникальное число.

Нужно именно так, остальные способы я сделал через
xor и перебором, нужно именно через список с нулями.

list2 = [0, 1, 3, 4, 7, 98, 3, 1, 98, 7, 16, 16, 4, 0, 42, 54, 54, 6, 6]
list3 = [0] * 100
for i in range(len(list3)):
    z = 0
    for j in range(len(list2)):
        if list3[i] == list2[j]:
            i += 1
            j += 1
            z += 1
        else:
            list3[i] != list2[j] `
            print(list2[j], z)
    break

В каком направлении думать? И если кто переделает код, укажите пожалуйста комментариями, что откуда выполняется.

for i in list2:
    list3[i] += 1

result = list3.index(1)
print(f"Уникальное число: {result}")

Вывод для вашего списка
list2:

Уникальное число: 42

Объяснение:
Присвоим каждому целому числу из диапазона 0-99 число на соответствующей позиции в списке
list3 (пока речь не идет о списке
list2). Здесь таблица:

числа:  0  1  2  3  4  5  6  ...  97  98  99
        ↓  ↓  ↓  ↓  ↓  ↓  ↓        ↓   ↓   ↓
list3:  0  0  0  0  0  0  0  ...   0   0   0             ← сначала самые нули

Теперь начинаем проходить списком
list2 - в нем находятся только числа из первой строки нашей таблицы:

for i in list2:

Для каждого числа в этом списке повысим соответствующее число в последней строке нашей таблицы:

    list3[i] += 1

Значит, когда находим (например) число 4 первый раз:

числа:  0  1  2  3 |4| 5  6  ...  97  98  99
        ↓  ↓  ↓  ↓ |↓| ↓  ↓        ↓   ↓   ↓
list3:  ?  ?  ?  ? |1| ?  ?  ...   0   0   0
                    ↑

и когда затем его встретим второй раз:

числа:  0  1  2  3 |4| 5  6  ...  97  98  99
        ↓  ↓  ↓  ↓ |↓| ↓  ↓        ↓   ↓   ↓
list3:  ?  ?  ?  ? |2| ?  ?  ...   ?   ?   ?
                    ↑

В результате мы в списке
list3 получим

0 (нули) - для чисел из диапазона 0-99, с которыми мы в списке
list2 не встретились
1 (единицу) - только одну, для уникального числа
2 - для чисел, которые мы встретили дважды
3 - для чисел, которые мы встретили трижды
... и т.д.

Значит, достаточно только обнаружить позицию (индекс) этой единицы:

result = list3.index(1)


Не могу додуматься как написать функцию которая преобразует входной список след. образом
Есть список
[1, 1, 2, 3, 3, 2, 2, 4]
На выходе надо получить
 [[1, 1], [2], [3,3], [2, 2], [4]
То есть добавлять надо список состоящий из вот таких одинаковых, последовательно идущих чисел.
Сижу уже долго, пытался рекурсией запилить, не вышло че т. Буду благодарен за наводку или псевдокод
P.S. Не судите строго:) Возможно тут полный бред написан, но у меня голова уже не работает и с рекурсией я не особо писал. Здесь я вместо выхода из рекурсии подумал обернуть все в try/except, но что то не так пошло. Данная шляпа возвращает None

result = []
def split(array: list):
    try:
        partition = []
        current_elem = array.pop(0)
        partition.append(current_elem)

        for elem in array:
            if elem == current_elem:
                partition.append(elem)
            else:
                result.append(partition)
                start_idx = array.index(elem)
                split(array[:start_idx])
    except IndexError as e:
        return result

Если необязательно рекурсией, то можно через
itertools.groupby

from itertools import groupby

lst = [1, 1, 2, 3, 3, 2, 2, 4]
out = [list(g) for _, g in groupby(lst)]
print(out)

[[1, 1], [2], [3, 3], [2, 2], [4]]


Как с помощью модуля auto-py-to-exe упаковать проект python в один файл вместе с картинками?
Нашел ответ, что для упаковки картинок нужно использовать данную функцию. Но я в упор не понимаю какое отношение эта функция имеет к интерфейсу auto-py-to-exe и как с её помощью упаковать картинки.
Упаковка без картинок и упаковка в папку работают без проблем. Вопрос именно в создании одного файла .exe с добавлением внешних изображений.
<code>
def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)
</code>

Спасибо Alex Titov за наводку на байтовые константы. В моём случае нужно было еще изменить размер картинок, так что использовал библиотеку
io в дополнение к его варианту. С её помощью после изменения размера смог получить длиннющую строку отображения новой картинки в байтовом виде. Далее эту строку сохранил в новую константу, а все остальные строки удалил. Константу уже можно использовать в
PhotoImage для присвоения виджетам.

from tkinter import PhotoImage
from io import BytesIO
from PIL import Image

icon = Image.open('icon.png', mode='r').resize((42, 42)).crop()  # 42 - требуемый размер
icon_arr = BytesIO()
icon.save(icon_arr, format='PNG')
icon_arr = icon_arr.getvalue()
print(icon_arr)  # <- скопировал результат из консоли в новую переменную byte_icon

byte_icon = b'...'  # <- тут длинная строка в байтовом виде. Весь код выше можно удалять.
                    # Кроме "from tkinter import PhotoImage", так как он еще нужен ниже
final_img = PhotoImage(data=byte_icon, format='png')

В итоге в
auto-py-to-exe не пришлось добавлять дополнительные файлы и все нормально собралось в один файл
.exe


Как собрать Python скрипт для работы на других компьютерах в exe файл [закрыт]

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

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

Закрыт 9 месяцев назад.

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

Не получается собрать exe файл. Пробовал Nuitka и PyInstaller. На компьютере где происходила сборка, всё запускается и работает в двух вариантах, а на другом, где нет Python - программа вылетает.

Вы можете использовать
pyinstaller или же
nuitka для компиляции py в exe. Почитайте документацию в интернете для этих модулей.


Получение данных через related_name в django rest framework
Имеются две модели:

class Post(models.Model):
    title = models.CharField(max_length=100)
    text = models.CharField(max_length=1000)

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='post_comments')
    comment = models.CharField(max_length=512)

Как мне в сериализаторе получить Post, но при этом, чтобы я в вывод мог добавить туда еще и комментарии.
Что-то типа так:

{
    "posts": [
        {
            "title ": "Post Title",
            "text": "Post Text",
            "comments": [
                {
                   "post": 1,
                   "comment": "Comment text"
                }
            ]
        }
    ]
}

Для этого вам нужно использовать вложенные сериализаторы. Пример из документации:

class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ['order', 'title', 'duration']

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ['album_name', 'artist', 'tracks']

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

{
    'album_name': 'The Grey Album',
    'artist': 'Danger Mouse',
    'tracks': [
        {'order': 1, 'title': 'Public Service Announcement', 'duration': 245},
        {'order': 2, 'title': 'What More Can I Say', 'duration': 264},
        {'order': 3, 'title': 'Encore', 'duration': 159},
        ...
    ],
}


Вроде бы всё правильно написано, но не меняется баннер в дискорде и выдаёт ошибку

from disnake.ext import commands
from PIL import Image, ImageDraw
import time
import disnake
import config

import os

bot = commands.Bot(command_prefix = config.prefix  ,help_command=None, intents = disnake.Intents.all())

@bot.event
async def on_ready():
    print("bot conekted")

@bot.command()
async def main( ctx: commands.Context) -> None:

    while True:

        im = Image.open('baner1.png')
        braw_text = ImageDraw.Draw(im)
        braw_text.text((200, 100), f'{ctx.guild.member_count}')

        imege = im

        await ctx.guild.edit(banner=imege)

        time.sleep(45)

bot.run(config.token)

это ошибка

Ignoring exception in command main:
Traceback (most recent call last):
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\disnake\ext\commands\core.py", line 173, in wrapped
    ret = await coro(*args, **kwargs)
  File "c:\Users\Admin\Desktop\statistiks\main.py", line 27, in main
    await ctx.guild.edit(banner=imege)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\disnake\guild.py", line 1954, in edit
    fields["banner"] = await utils._assetbytes_to_base64_data(banner)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\disnake\utils.py", line 564, in _assetbytes_to_base64_data
    data = await data.read()
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\PIL\Image.py", line 529, in __getattr__
    raise AttributeError(name)
AttributeError: read

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\disnake\ext\commands\bot_base.py", line 591, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\disnake\ext\commands\core.py", line 914, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\disnake\ext\commands\core.py", line 182, in wrapped
    raise CommandInvokeError(exc) from exc
disnake.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: read

Эта ошибка возникает, потому что в модуле disnake функция "edit" ожидает, что объект "banner" будет байтовым представлением изображения, а не объектом Image. Для того, чтобы исправить это, вам нужно преобразовать объект Image в байты следующим образом:
<code>
im.save('banner1.png')
with open('banner1.png', 'rb') as f:
    banner = f.read()
await ctx.guild.edit(banner=banner)
</code>


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

import telebot

bot = telebot.TeleBot("API-ключ")

@bot.message_handler(commands=['start', 'help'])

def send_welcome(message):
    bot.reply_to(message, '<b>Привет</b>', parse_mode='html')

    bot.polling(none_stop=True, interval=0)

Проблема в том, что после команды в терминале
python main.py бот должен начинать работать, и в самом терминале не должно ничего выводить после этой команды, а мне, в свою очередь, в ответ приходит начальная строчка спустя 1 секунду (там где путь к файлу, после которого всё пишется в терминале), и, соответственно, бот не запускается и не реагирует на команды.

Проверьте чтобы отступы были такие же как и в коде ниже, а так же крайне рекомендую добавить конструкцию
if __name__=="__main__" в Ваш код, пример тоже ниже:

import telebot

bot = telebot.TeleBot("TOKEN")

@bot.message_handler(commands=["start"])
def start(message):
    bot.reply_to(message, "Привет")

if __name__ == '__main__':
     bot.polling(none_stope=True, interval=0)

Если Вы уверны что всё сделали правильно то сделайте слудущие действия:
1. Откройте консоль
2. Введите комманду
pip3 uninstall telebot - Она удалит модуль
telebot (также не забудьте подтвердить действия удаления модуля введя
Y когда Вас об этом попросит в консоли)
3. Введите комманду
pip3 install pyTelegramBotAPI - Она установит правильный модуль(иногда возникают ошибки из за неправильной установки модуля
telebot)
4. Введите комманду
python3 -m pip3 install --upgrade pip - Она обновит пакетный менеджер
pip
После всех проделаных действий попробуйсте перезапустить свой скрипт и у Вас всё должно начать работать! В ином случаи оповистите меня об этом в комментарии под ответом и я постараюсь Вам помочь!


Как передать переменную чтобы выводилось имя, а не сам текст Telegram Bot Aiogram
Есть телеграм бот. Я начал его переводить на три языка и создал новый файл со списком сообщений. Сообщение будто-бы выводится без f-строки. Как сделать чтобы выводилось нормально:

👋 Hello Ivan Ivanov. 🎉 Welcome to our bot 🎉

А не как с переменной:

👋 Hello {message.from_user.first_name}
{message.from_user.last_name}. 🎉 Welcome to our bot 🎉

Если дописать f к строке в списке сообщений:

'hello_with_all_name_en': f'👋 Hello <b><u>{message.from_user.first_name} {message.from_user.last_name}</u></b>. 🎉 Welcome to our bot 🎉'

То выводится ошибка:
NameError: name 'message' is not defined, так что, думаю это не вариант
Вот строчка кода:

await bot.send_message(message.from_user.id, locales.hello_user[f'hello_with_all_name_{BotDB.user_language(message.from_user.id)}'], parse_mode='html', reply_markup=kb.markup_start)

А вот список сообщений с файла locales.py:

hello_user = {
   'hello_with_all_name_uk': '👋 Привіт, <b><u>{message.from_user.first_name} {message.from_user.last_name}</u></b>. 🎉 Вітаємо у нашому боті 🎉',
   'hello_with_all_name_ru': '👋 Привет, <b><u>{message.from_user.first_name} {message.from_user.last_name}</u></b>. 🎉 Поздравляем в нашем сапоге 🎉',
   'hello_with_all_name_en': '👋 Hello <b><u>{message.from_user.first_name} {message.from_user.last_name}</u></b>. 🎉 Welcome to our bot 🎉'
}

Вы можете попробывать реализовать это в формате функции:

def hello(message):
    hello_user = {
       'hello_with_all_name_uk': '👋 Привіт, <b><u>{message.from_user.first_name} {message.from_user.last_name}</u></b>. 🎉 Вітаємо у нашому боті 🎉',
       'hello_with_all_name_ru': '👋 Привет, <b><u>{message.from_user.first_name} {message.from_user.last_name}</u></b>. 🎉 Поздравляем в нашем сапоге 🎉',
       'hello_with_all_name_en': '👋 Hello <b><u>{message.from_user.first_name} {message.from_user.last_name}</u></b>. 🎉 Welcome to our bot 🎉'
    }

    return hello_user["hello_with_all_name_uk"]

В эту функцию вы просто передаёте само сообщение в обрабработчике при отправке. Вот пример:

@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    await message.reply(hello(message))

P.S. - Не забудьте изменить данные в [] в return в функции hello, на свои с БД!!!
И также не большая правочка насчёт Вашего словаря, правильние украинский язык назвать hello_with_all_name_ua, потомучто uk - это United Kingdom(Великобритания) ;)
Вы можеет попробывать использывать
.format для выполнения Вашей задачи. Пример использования:

@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    hello_user = {
       'hello_with_all_name_uk': '👋 Привіт, <b><u>{} {}</u></b>. 🎉 Вітаємо у нашому боті 🎉',
       'hello_with_all_name_ru': '👋 Привет, <b><u>{} {}</u></b>. 🎉 Поздравляем в нашем сапоге 🎉',
       'hello_with_all_name_en': '👋 Hello <b><u>{} {}</u></b>. 🎉 Welcome to our bot 🎉'
    }
    await bot.send_message(message.from_user.id, hello_user["hellow_with_all_name_uk"].format(message.from_user.first_name, message.from_user.last_name))

Если этот пример Вам больше по душе и будет коректно работать в Вашей ситуации, то не забудьте изменить словарь
hello_user на поданый в этом примере и использовать для дальнейшей локализации в подобном формате!


Работа кода завершается после его выполнения.Питон
Изначально эхо бот запускался, но после манипуляции с кодом перестал продолжать работу, и после этого я попытался запустить снова простого бота и он тоже не запускается(код выполняется и завершается сразу).
<code>
from aiogram import Bot, Dispatcher, types, executor

bot = Bot(token='')
dp = Dispatcher(bot)

@dp.message_handler()
async def echo(message: types.Message):
    await message.answer(message.text)

    if __name__=='__main__':
        executor.start_polling(dp, skip_updates=True)
</code>

У Вас лишние отступы перед if, и в итоге Ваш бот запускаеться при вызове функции echo, которая никогда не вызываеться. В итоге python просто делает все импорты, создаёт переменые и функцию и дальше ничего не видит для выполнения, поэтому и прекращает свою работу. Вот рабочий код:
<code>
from aiogram import Bot, Dispatcher, types, executor

bot = Bot(token='')
dp = Dispatcher(bot)

@dp.message_handler()
async def echo(message: types.Message):
    await message.answer(message.text)

if __name__=='__main__':
    executor.start_polling(dp, skip_updates=True)
</code>


Как создать гиперссылку (НЕ НА САЙТ) на саму ФУНКЦИЮ В КОДЕ
<code>
import telebot
import config

bot = telebot.TeleBot(config.token)

@bot.message_handler(commands=["start"])
def hello(message):
    bot.send_message(message.chat.id, '[en](........)', '[ru](........)' parse_mode='Markdown')

def en(message):
    bot.send_message(message.caht.id, "you choose en")

def ru(message):
    bot.send_message(message.caht.id, "you choose ru")

bot.infinity_polling()
</code>

Вы можете сделать функции en и ru не просто функциями, а также и коммандами для бота при помощи декоратора
@bot.message_handler(commands=["ru"]), где "ru" - это коммада для вызова функции. Вы также можете использовать несколько комманд для одной функции
@bot.message_handler(commands=["ru", "ру", "russion", "русский"]), функция ru с таким декоратором будет срабатвать на комманды /ru, /ру, /russion, /русский.
Также если я не ошибаюсь если перед каким либо словом в сообщении идёт '/', то телеграм воспринимает его как комманду, и при нажатии на этот текст на мобильных устройствах эта комманда автоматически отправиться(насчёт компьютерной версии телеграм я не уверен). Вот Ваш код с нужными декораторами:

import telebot
import config

bot = telebot.TeleBot(config.token)

@bot.message_handler(commands=["start"])
def hello(message):
    bot.send_message(message.chat.id, '/en\n/ru')

@bot.message_handler(commands=["en"])
def en(message):
    bot.send_message(message.caht.id, "you choose en")

@bot.message_handler(commands=["ru"])
def ru(message):
    bot.send_message(message.caht.id, "you choose ru")

bot.infinity_polling()


не работают команды компиляции ui в py
Скачал библиотеку pyside6, попытался скомпилировать код ui в py, не получилось "Имя pyside6 не распознано", попытался скомпилировать через pyqt5 и pyqt5-tools, обращаюсь к pyuic, тоже самое, попытался с pyqt6 и pyqt6-tools сделать тоже самое, всё равно не получается, точно так же при выполнении запроса в терминале ошибки, менял много раз версии python(3.4, 3.7, 3.10, 3.11) всё равно не получается. Посмотрел так же нормально ли всё в переменной среды, там есть ли путь к пайтон, есть, удалял и добавлял снова, всё равно не получается скомпилировать, посмотрел много видео разборов ошибок, ни одна не подошла. Много раз удалял и скачивал снова библиотеки все нужные и не нужные, всё попробовал. Как бы ни пытался, ни pyside2, ни pyside6, ни pyuic всех версий, ничего не работает, допустим если pyside6 то ошибка 'Имя "pyside6" не распознано как имя командлета, функции, файла сценария или выполняемой программы.', и так со всеми методами, ПРОШУ ПОМОГИТЕ, я создал через qt disagner калькулятор, и никак не могу прописать ему логику без компиляции в py, помогите...

Попробуйте переустановить PyQt5, если это не помогает, перейдите по пути:

\AppData\Local\Programs\Python\Python39\Lib\site-packages\PyQt5\Qt5\plugins

(3.9 это моя версия у вас может быть другая) и копируйте из этого пути папку platforms. Потом переходите к главной папке питона:

\AppData\Local\Programs\Python\Python39

и вставляйте её


Как переместить главное окно на задний план? tkinter
Как переместить главное окно на задний план? tkinter, python

tk.wm_attributes("-topmost", 1)

Также вместо
tk вы можете подставлять названия переменых которые хранят другие окна. Пример:

win = Toplevel(tk)
win.wm_attributes("-topmost", 1)


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

a = "Hello my friend!"
print(a)

Вывод получается такой
Hello my friend!
А надо вот такой вывод
Hello my fr
при этом не меняя саму переменную
a

Используйте срезы:

print(a[:8])


Как вывести из бд данные на все страницы проекта python django
По сути мне нужно метод shop встроить в класс ProductListView
Потому что вывод из метода shop выводит только на странице cart

class ProductsListView(ListView):
    model = Product
    template_name = 'shop/shop.html'

def shop(request):
    cart = Order.get_cart(request.user)
    items = cart.orderitem_set.all()
    context = {
        'cart': cart,
        'items': items,
        }
    return render(request, 'shop/shop.html', context)

urls.py

path('', views.ProductsListView.as_view(), name='shop'),
path('cart_view/', views.cart_view, name='cart_view'),
path('detail/<int:pk>/', views.ProductsDetailView.as_view(), name='shop_detail'),
path('delete_item/<int:pk>', views.CartDeleteItem.as_view(), name='cart_delete_item'),
path('add-item-to-cart/<int:pk>', views.add_item_to_cart, name='add_item_to_cart'),

Согласно документации, вы можете переопределить метод
get_context_data():
Пример из документации:

from django.utils import timezone
from django.views.generic.list import ListView

from articles.models import Article

class ArticleListView(ListView):

    model = Article
    paginate_by = 100  # if pagination is desired

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['now'] = timezone.now()
        return context

В вашем случае это может быть так:

class ProductsListView(ListView):
    model = Product
    template_name = 'shop/shop.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        cart = Order.get_cart(self.request.user)
        items = cart.orderitem_set.all()
        context.update({
            'cart': cart,
            'items': items,
        })
        return context


CV2. Numpy. Как вырезать часть изображения по маске?
Есть изображение RGBA img_1 преобразованное в массив Numpy размерностью (100, 200, 4). Где 100х200 это размер картинки, 4 - значения RGBA.
Так же имеется маска-массив mask в оттенках серого (от 0 до 255) с такой же размерностью (100, 200).
Как создать новый массив/изображение out выбирая RGBA из img_1 по координатам маски, в которой  значения не равны 0?
<code>
# img_1 оригинальное изображение RGBA сконвертированное в Numpy
img_1 = numpy.array(img_1 )
img_null = numpy.zeros_like(img_1)  # создаем массив из нулей размером (100, 200, 4)
#... здесь фрагмент кода создающий маску с помощью контуров CV2
mask = numpy.array(mask) # маска/массив размерность (100, 200) значения 0-255
out = numpy.where(mask != 0, img_1, img_null) # не работает, из-за несоответствия размерностей
</code>

Метод костыльный, но сработал.
Делаем маску в той же размерности (100, 200, 4) и сравниваем срезы.
<code>
# маску рисуем в формате RGBA
# sort_contours - массив с отсортированными контурами, индекс -1 самый большой
# контур
cv2.drawContours(mask, [sort_contours[-1]], 0, (255,255,255.0), -1)
# создаем массив для сравнения в маске
null_val = numpy.array([0, 0, 0, 0])
out = numpy.where(mask[:][:] != null_val, img_1[:][:], img_null [:][:])
</code>


Как отсортировать список и найти количество различных значений?
Мне нужно отсортировать список и найти количество различных значений.
К примеру я ввожу в переменную
n значение
5 и мне выводит список
[0, 1, 2, 0, 2] и потом выводит что там 3 дубликата, когда их здесь только два, я не понимаю этого.

import random

count = 0
n = int(input())
b = []
a = [b.append(random.randint(0, 5)) for i in range(n)]
print(b)
for i in range(len(b) - 1):
    if b.count(b[i]) > 1:
        count += 1
print(f"Количество дупликатов в списке B: {count}")
print("Количество уникальных значений")

Количество дупликатов я так просто вывожу, но и тут тоже неправильно...

Сортировка списка:

b.sort()

Количество различных значений:

len(set(b))


Как получить идентификатор имея частную ссылку на канал телеграмм, используя python3?
Как получить идентификатор канала телеграмм (выглядит он так -1001750197994) имея ссылку: (один из вариантов как может выглядить tg://join?invite=+mTSqtJfEnxk3MWUy , может и так, сути не меняет t.me/+mTSqtJfEnxk3MWUy)

Специальный бот есть. @GetIdTeleBot Отправляете ему ссылку он в ответ пришлет ID. Можно написать скрипт который будет слать боту ссылку и обратно получать id


Проверка на наличие определенной папки
Подскажите пожалуйста, как мне решить такую задачу. Задана основная папка. Нужно проверить, есть ли в этой папке подпапка с введенным названием. Если ее нет, то нужно создать и записывать туда некие файлы. Если она есть, то продолжать записывать в нее файлы. Не могу понять, где ошибка.
<code>
path = r'/home/anna/Документы/АВС/*'

if uname in path:
   print(uname, ' существует')
   f = open(uname, 'a')
   f.write(fileaudio)
   f.close()
if not uname in path:
   os.mkdir(uname)
   f = open(uname, 'a')
   f.write(fileaudio)
   f.close()введите сюда код
</code>

Если
path - основная папка, а
folder_name - подпапка с введенным названием:

import os

path = 'D:/*'
folder_name = 'my'
filename = 'my_file.txt'

try:
    folder_path = os.path.join(*path.split('/')[:-1], folder_name)
    os.mkdir(folder_path)
except FileExistsError:
    pass

with open(os.path.join(folder_path, filename), 'a') as fout:
    fout.write('Hello')

Или можно так, чтобы не писать к каждому файлу полный путь:

try:
    folder_path = os.path.join(*path.split('/')[:-1], folder_name)
    os.mkdir(folder_path)
except FileExistsError:
    pass
finally: # <---
    os.chdir(folder_path) # <---

with open(filename, 'a') as fout: # <---
    fout.write('Hello')


Как вывести значения ключа словарей которые находятся в массиве и передать в шаблон django
В интерпретаторе я делаю это так:
<code>
data = [{"red": "красный", "green": "зеленый", "blue":"синий"}, {"red": "красненький", "green": "зелененький", "blue":"синенький"}, {"red": "алый", "green": "темнозеленый", "blue":"небесный"}]
for d in data:
    red = d['red']
    green = d['green']
    blue = d['blue']
    print (red," | ",green," | ",blue)
</code>
как сделать то же самое в gjango, передать значения ключей построчно?

В джанго мы передаем в html файл значение параметра context, которое содержит как раз словарь. Ключ - то, как мы будем именовать нашу переменную в html, значение -  ее значение)
В файле views.py

def index(request):
    data = [{"red": "красный", "green": "зеленый", "blue":"синий"}, {"red": "красненький", "green": "зелененький", "blue":"синенький"}, {"red": "алый", "green": "темнозеленый", "blue":"небесный"}]
    return render(request, 'index.html', context = {'data':data})

А далее в файле index.html нужно все принять и вывести

{%for d in data%}
{{d.red}} | {{d.green}} | {{d.blue}}
{%endfor%}


python ProcessPoolExecutor
У меня есть класс, парсер, который нужно запустить в многопроцессорности.
Я использую
ProcessPoolExecutor() модуля
concurrent.futures и в цикле передаю в класс парсера категорию и запускаю парсер.
Все работает в стольких процессах, сколько я указал в
max_workers (допустим 4).
Но по истечению какого то времени, я замечаю, что работает всего 1 процесс. В диспетчере задач висят 4 процесса, но работает только 1.
Я не знаю, как отслеживать правильно, но приделал
enumerate и этот номер так же передаю в парсер, который выводит принт номер категории из парсера по завершении парсинга.
И по началу все нормально, 1, 2, 3, 4 запустились одновременно и все идет ок.
3 категория допустим спарсилась быстрее 1,2,4.
Значит должен взять 5 категорию и парсить.
И так далее. Работая в 4 процесса каждая категория.
А у меня получается так, что стартуют одновременно, грубо говоря час работают одновременно, а потом остается 1 рабочий процесс, который парсит категории по очередно.

with pool.ProcessPoolExecutor(max_workers=4) as executor:
    for num, categories in enumerate(categories_all):
        parser = Parsers(categories=categories, count_category=num)
        executor.submit(parser.run)

В парсере, который вызывается метод
executor.submit(parser.run) было написано еще многопоточность
ThreadPoolExecutor. А в документации написано, что если в вызываемом
executor объекте будет еще вызван
executor, то это приведет к взаимоблокировке.
Исправил, проблем с этим теперь нет.