Не работают любые команды discord.py
Пытаюсь отвечать на команды игрока через
@bot.command, но абсолютно ничего не работает. Вроде все верно делаю по вики, но не выходит
(в functions находится только
text_line())

import asyncio
import discord
from discord.ext import commands
from functions import *

# Vars
client = discord.Client()
bot = commands.Bot(command_prefix="!")

# Functions
@client.event
async def on_ready():
    text_line("Discord bot")
    print("[!] Auth as {0.user}".format(client))
    print("[!] Latency: {0.latency}".format(client))
    print("[!] Activity: {0.activity}".format(client))
    print("[!] Nitro status: {0.user.premium_type}".format(client))

@bot.command(pass_context=True)
async def say(ctx):
    await ctx.send("hello")

# All messages
@client.event
async def on_message(message):
    if message.author == client.user:
        # Log bot messages
        print("[+] Bot send message in {0.channel}: {0.content}".format(message))
        return

    # Log player messages
    print("[+] New message from {0.author} in {0.channel}: {0.content}".format(message))

# Run
client.run(ur_token)

Проблема заключалась в том, что я забыл сменить
client.run на
bot.run


Как убрать первые символы из строки?
Да, я знаю, что этот вопрос уже много раз и везде задавался. Но мне НЕ НУЖНО убрать определенные символы. Мне нужно убрать первые.
Допустим есть строка "Helo world!!!1" в переменной mystr, и мне нужно убрать 5 первых символов чтобы получить "world!!!1". Как это сделать?

s = 'Helo world!!!1'

s = s[5:] # world!!!1


Как реализовать проверку на админа беседы?
Я беру от сервера это (код) как мне реализовать проверку на админа? брать id и сравнивать его если 'is_admin': True то выполнять код дальше а если нет показывать ошибку? Собственно проблема в том что я не могу понять как это сделать. (да немного тупой что поделать)
<code>
member_id = vk.messages.getConversationMembers(peer_id=peer_id)["items"][0]["member_id"]
is_admin = vk.messages.getConversationMembers(peer_id=peer_id)["items"][0]["is_admin"]
</code>

member_id = ...
is_admin = ...

assert is_admin == True, "Не админ: is_admin = {}".format(is_admin) # вывод ошибки и прерывание кода

# код дальше


Python3 проблема с threading и asyncio
Очень не хочу лезть в потоково-асинхронную кашу, но я уже в ней.
Написал скрипт, который делает бэкапы сервера и отправляет отчеты о них.
Помимо этого, он отчитывается о статусе сервера и статусе бэкапов в телеграм боте через библиотеку
aiogram.
То-есть, разделите мой код на 2 части:

Бекапер
Бот

Проблема:
Я пытаюсь запустить процесс создания бэкапов в отдельном потоке.
Из этого же потока я хочу отправлять сообщения от имени бота подписчикам.
Создание потока под бэкапы

Thread(target=BackUp().start).start()

Функция рассылки подписчикам

async def notify_staff(msg: str, kind='Info', notification=True) -> None:
    staff = [x for x in Session().query(Staff)]
    message = '*\\[{kind}\\]*\n{msg}'.format(kind=markdown_decoration.quote(kind),
                                           msg=markdown_decoration.quote(msg))
    for obj in staff:
        await bot.send_message(chat_id=obj.chat_id, text=message, parse_mode='MarkdownV2',
                               disable_notification=not notification)
        sleep(0.4)

И суть проблемы в том, что вызов

class BackUp:
    def start(self):
        loop = asyncio.new_event_loop()
        while True:
            ...
            asyncio.run_coroutine_threadsafe(notify_staff(msg='Backup done\nStored paths:\n{paths}'.format(
                        paths='\n'.join([x['path'] for x in stored])
                    ), notification=False), loop)
            ...

выполняется бесконечно. (Дебаг помог)
Точнее, он, похоже, просто бесконечно ничего не делает.
Была попытка отправить в другой поток непосредственно бота и все заработало... за исключением бота, который уже не откликался на команды.
Не понимаю почему не отрабатывает
run_coroutine_threadsafe()

Проблема в том что ты мешаешь код в разных тредах. Тред бакупа не должен знать ничего о телеграмме и тем более не должен создавать новый луп. Используй concurrent.futures.ThreadPoolExecutor

executor = concurrent.futures.ThreadPoolExecutor()
backup_future = loop.run_in_executor(executor, BackUp().start)
wait_complete_task = loop.create_task(on_backup_done(backup_future))

где в on_backup_done описывается взаимодействеие с телеграмом, запущенном в основном лупе и выполняется оно в основном треде.

async def on_backup_done(backup_future):
    result = await backup_future
    await notify_staff(msg='Backup done....)


Живой поиск kivy. Приложение сильно тупит, зависает во время живого поиска по базе данных
Сделал живой поиск по базе данных в двух вариантах.

Одноразовый. После выбора и добавления в строку, если искать второй раз не перегружая программу, происходит вылет. Меню создает родительский виджет в SL2, который не выгружается после удаления меню, и к нему нельзя добавить меню второй раз.
Способ, который в отрывке кода ниже, реализован без выборки среза, и начинает искать с первой буквы. Он стал грузить приложение сразу с запуска(белый экран до минуты). после выбора долго нельзя нажать на кнопку ввода - зависает. Функция, вызов которой тормозит программу, ниже. Что изменить чтобы приложение перестало зависать или вылетать(widgetExcepshion уже есть родитель - причина вылета).

def insertText(self, *args):  # Забираем ввод первых трех символов ввода (#2 вариант)
    self.menu.clear_widgets()  # Очищаем меню чтобы не было повторов
    self.con = sqlite3.connect('tikers.db')
    self.cursorObj = self.con.cursor()
    dat = []
    tC1 = self.textCompany.text
    self.cursorObj.execute(f"SELECT * FROM tiks WHERE company LIKE '%{tC1}%'")
    rows = self.cursorObj.fetchall()
    for row in rows:
        dat.append(row)
        self.menu_items = []
    for id, name in dat:  # Создаем меню
        self.menu_items.append({
            "text": f"{name}", 'height': "20dp",
            "top_pad": "2dp", "bot_pad": "2dp"})
        self.menu = MDDropdownMenu(
            caller=self.textCompany,
            items=self.menu_items,
            position="center",
            width_mult=0)
    self.con.commit()
    self.con.close()
    self.menu.bind(on_release=self.setItem)

def setItem(self, instance_menu, instance_menu_item):
    def setItem(interval):
        self.textCompany.text = instance_menu_item.text
        instance_menu.dismiss()
        self.menu.clear_widgets()  # Очищаем список меню чтобы не было повторов
    Clock.schedule_once(setItem, 0.2)  # Вставляет текст в строку

часть kv

MDTextField:
    id: textF_1
    size_hint: 0.5, None
    hint_text: "*Компания"
    height: "30sp"
    multiline: False
    pos_hint: {'center_x': .3, 'center_y': 0.8}
    on_text: root.ids.listDialog.insertText() #on_focus
    on_text: root.ids.listDialog.menu.open()  #on_focus

Нашел решение. Нужно вставить конструкцию, которая предотвращает запуск on_text пока в него не начнут вводить текст. Тогда он не срабатывает с запуском приложения и не грузит его.
<code>
on_text: if self.text: root.ids.listDialog.insertText()
on_text: if self.text: root.ids.listDialog.menu.open()
</code>


Не работает комбинация str.maketrans и translate
Пытаюсь поменять буквы в строке на соответствующие им номера в алфавите.
Не понимаю почему не работает translate.
Плюс ко всему прочему
maketrans выдаёт очень странную таблицу для перевода
tr, в ней совершенно не фигурируют буквы.
Что я делаю не так?

import string

eg = ['test', 'abc', 'xyz', 'whyunotwork']
new = []
dic = dict(zip(string.ascii_lowercase, map(str, range(1, 27))))
tr = str.maketrans(dic)

for word in eg:
    word1 = word.translate(dic)
    new.append(word1)

print(new)

Так вы не используете
tr, используйте его:

word1 = word.translate(tr) # tr, а не dic

Вывод:

['2051920', '123', '242526', '238252114152023151811']


Как определить вхождение номера из списка в значение словаря?

book = [
 {'type': 'classic', 'number': '1', 'name': 'Руслан и Людмила'},
 {'type': 'classic', 'number': '4', 'name': 'Петербургский ростовщик'},
 {'type': 'roman', 'number': '3', 'name': 'Преступление и наказание'}
]

shelf = {
 '1': ['3'],
 '2': ['4', '1'],
}

Нужно определить в каких ячейках находятся книги с определенными номерами. На печать вывести всю информацию по книге и номер ячейки.
Думаю, что сначала нужно пройти циклом по строкам book 'rating', полученные значения проверить на вхождение словаря shelf. Пока не пойму как сделать.
Сделал функцию, которая введенное значение проверяет на наличие в словаре shelf, но в ней номер нужно ввести руками.

# def get_shelf(document_number):
#     for key in directories:
#         if document_number in directories[key]:
#             return key
#     return "Документ не найден в базе"
#
# document_number = input("Введите номер документа: ")
# print(get_shelf(document_number))

Список книг превратить в словарь, где ключом будет номер книги, остальное будет просто.
Пример:
<code>
book = [
    {'type': 'classic', 'number': '1', 'name': 'Руслан и Людмила'},
    {'type': 'classic', 'number': '4', 'name': 'Петербургский ростовщик'},
    {'type': 'roman', 'number': '3', 'name': 'Преступление и наказание'}
]
num_by_book = {book['number']: book for book in book}

shelf = {
    '1': ['3'],
    '2': ['4', '1'],
}

for num, book_nums in shelf.items():
    print(num)

    for book_num in book_nums:
        book = num_by_book[book_num]
        print(f'    {book["name"]}')

# 1
#     Преступление и наказание
# 2
#     Петербургский ростовщик
#     Руслан и Людмила
</code>


Как установить горячие клавиши в python?
Я хочу установить горячие клавиши
Для этого я установил pynput и использую этот код
<code>
from pynput.keyboard import Key, KeyCode, Listener
import sys
import pyscreenshot as ImageGrab

# закончить код
def end_fun():
    print('end_fun')
    sys.exit()

def start_mouse():
    print('sssss')
    #input('input:')

def save_image():
    print('ffff')
    im = ImageGrab.grab()

# Код для горячих клавищ
combination_to_function = {
    frozenset([KeyCode(vk=49)]): end_fun, #1
    frozenset([KeyCode(vk=50)]): start_mouse,#2
    frozenset([KeyCode(vk=51)]): save_image,#3
}

# The currently pressed keys (initially empty)
pressed_vks = set()

def get_vk(key):
    return key.vk if hasattr(key, 'vk') else key.value.vk

def is_combination_pressed(combination):
    return all([get_vk(key) in pressed_vks for key in combination])

def on_press(key):
    vk = get_vk(key)  # Get the key's vk
    print(':vk =', vk, ':key =', key)
    pressed_vks.add(vk)  # Add it to the set of currently pressed keys
    for combination in combination_to_function:  # Loop through each combination
        if is_combination_pressed(combination):  # Check if all keys in the combination are pressed
            combination_to_function[combination]()  # If so, execute the function

def on_release(key):
    vk = get_vk(key)  # Get the key's vk
    pressed_vks.remove(vk)  # Remove it from the set of currently pressed keys

with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

</code>
Но проблема в том что когда я подключасторонниеие модули то почему то функция начинает воспроизводится вне зависимости от того какую клавишу я нажимаю
также код слетает когда я использую команду input. или сложную комбинацию букв
Как мне это исправить?

Ошибки в вашем коде возникают, когда в коде сторонней библиотеке появляется
time.sleep(...) или подлагивания при работе основного потока. Модуль pynput продолжает собирать очередь событий, даже если основной поток с Listener'ом занят какой-то другой задачей. Обойти эти ошибки можно, если создать свой цикл обработки, который будет напрямую обращаться к внутренней очереди pynput, а не занимать основной поток Listener'ом. Например pynput предлагает ещё один способ обработки событий - Events. Это - прямой доступ к очереди. Пример:

from pynput import keyboard

def on_down(key) # Колбек зажатой кнопки
    print("Pressed {}".format(key))
    input("input:") # input не вылетает и не зависает

def on_up(key) # Колбек отжатой кнопки
    print("Released {}".format(key))

while True: # Цикл вне блока with для постоянного обновления очереди
    with keyboard.Events() as events:
        event = events.get(1) # Ждём событие клавиши 1 секунду
        if event == None: # Если события не было, обновляем очередь
            continue
        elif isinstance(event, keyboard.Events.Press): # Кнопка зажата
            on_down(event.key)
        else: # Кнопка отжата
            on_up(event.key)


Tortoise-ORM: поля связанных объектов в __str__
Я разрабатываю сервис АПИ используя AIOHTTP, пытаюсь прикрутить какую-нибудь асинхронную ORM, выбор пал на Tortoise-ORM (следующий кандидат Gino). На данный момент возник такой вопрос.
В Django проекте у меня есть много связанных моделей с методами
__str__, выглядит это примерно так:

from tortoise.models import Model
from tortoise import fields

class Department(Model):
    id = fields.IntField(pk=True)
    title = fields.TextField()
    upper = fields.ForeignKeyField('models.Department', related_name='children')

    def __str__(self):
        if self.upper is not None:
            return f'{self.id} Department {self.title} of {self.upper.title}'
        else:
            return f'{self.id} Department {self.title}, head'

class Employee(Model):
    id = fields.IntField(pk=True)
    name = fields.TextField()
    dep = fields.ForeignKeyField('models.Department', related_name='employees')

    def __str__(self):
        return f'{self.id}. Employee {self.name} of {self.dep.title}'

Так что каждый объект ссылается на многие другие и показывает их в своём описании. Но Tortoise при этом выдаёт ошибку:

AttributeError: 'QuerySet' object has no attribute 'title'

Кажется, сделать await внутри метода
__str__ не получится. Можно ли вообще использовать поля связанных моделей для построения такого описания объекта в Tortoise-ORM?

Tortoise-ORM не позволяет автоматически извлекать связанные объекты из БД, пока не будет явно выполнен запрос. Обращения к связанным полям возвращают лишь объект
QuerySet без взаимодействия с БД.
Чтобы получить связанные объекты надо использовать методы
prefetch_related() или
fetch_related() перед работой с объектами, после чего соответствующие поля будут возвращать конкретный объект, а не
QuerySet. Документация.
Примеры:

emp_one = await Employee.filter(name="Emp_1").prefetch_related("dep").first()
print(emp_one)

emp_two = await Employee.filter(name="Emp_2").first()
await emp_two.fetch_related("dep")
print(emp_two)

Перевод этого ответа.


Правильно ли добавляю ключ в словарь? Как вывести на печать ключи в строку?
Есть словарь:

directories = {
 '1': ['1000'],
 '2': ['145'],
 '3': [555],
 '4': []

}

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

def ads_shelf(directories):
    input_number = input("Введите номер полки: ")
    if input_number not in directories:
        directories[input_number] = []
        print(f'Ключ успешно добавлен. Текущий перечень ключей:')
    else:
        print(f'Такой ключ существует. Текущий перечень ключей:')

Правильно ли делаю и как вывести ключи в строку принта?

if input_number not in directories:
    directories[input_number] = []

-- такие штуки обычно делаются через
collections.defaultdict(list). С defaultdict новые "полки" добавлять не нужно - они будут создаваться автоматически при записи.
Вывести все ключи просто

print(",".join(directories.keys()))


Ошибка TypeError: '<' not supported between instances of 'NoneType' and 'int'

from random import randint

class Die:
    def __init__(self, sides):
        self.sides = sides

    def roll_die(self):
        print(f'Кубик брошен! \nВыпало: {randint(1, self.sides)}')

my_die = Die(20)
x = my_die.roll_die()
if x < 20:
    my_die.roll_die()
else:
    print('Победа!')

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

Traceback (most recent call last):
File "c:/Users/Computer/Desktop/Учеба/python_work/9_14v2.py", line 12, in
  <module>
  if x < 20:
TypeError: '<' not supported between instances of 'NoneType' and 'int'

Как это можно исправить, и в чем я был не прав?

У вас по коду ожидается, что функция
roll_die() возвращает
int, а фактически она ничего не возвращает (о чем Python вам в ошибке и говорит) - в ней даже нет
return-а.. Т.е. должно быть:

def roll_die(self):
    result = randint(1, self.sides)
    print(f'Кубик брошен! \nВыпало: {result}')
    return result


RayCast in python + pygame
У меня появились некоторые вопросы по работе технологии raycast. Создавая свой проект pygame, я попытался сделать raycast и вот его версия:

def raycast(self):
    x1=hero.rect.x-self.rect.x
    y1=hero.rect.y-self.rect.y
    vh1=math.sqrt(x1**2+y1**2)
    for p in wolls:
        x=p.rect.x-self.rect.x
        y=p.rect.y-self.rect.y
        vh=math.sqrt(x**2+y**2)
        if vh<=vh1:
            self.see_hero=True
        else:
            self.see_hero=False

В начале функции я вычисляю положение игрока и npc, потом получаю расстояние от игрока до npc в пикселях(вроде).
Во второй части
for p in wolls: я вычисляю расстояние от стены до npс. После вычисления расстояния от стены до npc я сравниваю результаты вычисленных расстояний:
Запуская свой проект, всё работает не так, как надо. Не могли бы вы помочь мне с этой проблемой?

Попробуйте создать переменную, включающую диапазон всех координатных точек стены (или только точек на её границе). При прохождении луча от NPC до Вас нужно будет рассчитать, проходит ли луч через координатные точки стены, если нет — то NPC идет за вами, иначе же он останавливается.


Django: роль атрибута в модуле
<code>
from django.db import models

class Pages(models.Model):
       ...
</code>
Какую роль играет атрибут models.Module при создании модуля? Он наследует какие-то нужные методы (если да, то какой например)?

Модели реализуются как подклассы django.db.models.Model.
В данном случае
models.Model указывает что это модель, а не просто какой то класс.


Проблемма в кол-во попытках для нейросети, а также в запоминание веса
Проблема заключается  в том что когда я запускаю нейронную сеть ей приходиться попробовать 200млн попыток чтобы найти ответ а  я бы хотел чтобы он запоминал прикаких рехультатах ответ выводится правильный. Я начинающий так что бейте если не оптимизированно или что-то плохо буду всем блягодарен.
<code>
import numpy as np

def sigmoid(x):
    return 1/(1 + np.exp(-x))

training_inputs = np.array([[0,0,1],
                            [1,1,1],
                            [1,0,1],
                            [0,1,1]])

training_outputs = np.array([[0,1,1,0]]).T

np.random.seed(1)

synaptic_weights = 2 * np.random.random((3,1)) - 1

for i in range(20000000):
    input_layer = training_inputs
    outputs = sigmoid( np.dot(input_layer, synaptic_weights) )

    err = training_outputs - outputs
    adjustments = np.dot( input_layer.T, err * (outputs * (1 - outputs)) )

    synaptic_weights+= adjustments

print( "Веса после обучения:" )
print(synaptic_weights)

print( "Результат после обучения:" )
print(outputs)

# ТЕСТ
new_inputs = np.array([0,1,0])
output = sigmoid( np.dot( new_inputs, synaptic_weights ) )

print("Новая ситуация")
print(output)
</code>

Что-то вопрос либо слишком тривиальный, либо за гранью понимания. Давайте уточним. Вы пишете, что провели обучение, нашли веса своей нейросетки.
Впрочем, процесса обучения я как-то не заметил. Процесс подбора параметра - да присутствует. Но процесс обучения нейросети - это поступление на вход МНОЖЕСТВА примеров. Пусть 2000000 - но примеров. А не 2000000 итераций на одном входном примере.
Это что касается вашей программы.
Теперь собственно вопрос.
Если предположить, что вы таки обучили нейростеть, нашли ее параметры и желаете их сохранить для использования в дальнейшем, то сделать это можно единственным способом - записав их в файл, а потом, при необходимости - читая их из этого файла.


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

Его длина минимум 6 символов
Содержит строчную и заглавную букву
Содержит цифру

Допустимые символы - буквенно-цифровые (Не
\,
$ и т.д.)
Мой код:

regex=r"^[a-zA-Z0-9]{6,}$"
Проблема моего кода:
По условию задачи, правильный пароль должен содержать и строчную, и заглавную буквы! Пример неправильного пароля:
ghdfj32 (Неправильный, потому что нет заглавной буквы). Еще неправильный:
DSJKHD23 (Нет строчной буквы). Мой код возвращает
True (т.к. в данных ранее паролях есть символы, которые указаны в квадратных скобках).
Мне нужно сделать так, чтобы регулярное выражение возвращало
True только в том случае, если в проверяемом тексте есть как минимум по 1-му символу, данному в квадратных скобках (
[a-zA-Z0-9])

Используйте блоки предварительного просмотра:

^(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])[a-zA-Z0-9]{6,}$

Допустимые, но менее эффективные альтернативы:

^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{6,}$
^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])[a-zA-Z0-9]{6,}$

Пример работы выражения №1 (обратите внимание на то, что в отрицающие символьные классы добавлен шаблон перехода на новую строку, так как в тесте используется многострочный текст, а не несколько отдельных строк) и пример работы выражений №2.
Подробности

^ - начало строки

(?=[^a-z]*[a-z]) - положительный блок предварительного просмотра вперёд, который требует наличия 0 и более символов, отличных от строчных букв из набора ASCII (см.
[^a-z]*), а затем одной такой буквы (
[a-z]) сразу после текущей позиции в строке (выполняет требование "минимум одна строчная буква в строке")

(?=[^A-Z]*[A-Z]) - минимум одна прописная буква в строке

(?=[^0-9]*[0-9]) - минимум одна цифра в строке

[a-zA-Z0-9]{6,} - шесть и более (см. ограничиващий квантификатор
{6,}) повторов букв или цифр из набора ASCII

$ - конец строки.


Pygame, update() для группы спрайтов работает некорректно
Занимаюсь по книге 'Эрика Матиза Изучаем python'
Задания:
13-3. Капли: найдите изображение дождевой капли и создайте сетку из капель. Капли должны постепенно опускаться вниз и исчезать у нижнего края экрана.
13-4. Дождь: измените свой код в упражнении 13-3, чтобы при исчезновении ряда капель у нижнего края экрана новый ряд появлялся у верхнего края и начинал падение.
С первым я справился, однако вызов переопределенного update(stars) для класса капли (в коде Star) не совпадает с ожидаемым, т.е. аргументом я передаю группу спрайтов в update(), и ожидаю что вся эта сетка капель изменит свое положение в соответствии с кодом в update (он обновляет положение для каждого спрайта в группе stars = Group() )
Но по итогу пропадают все ряды капель кроме первого ряда с !Отрисовки на экране (выводил в консоль количество созданных рядов и столбцов, с вызовом и без update, всегда одни и те же количества). Ну соответственно оставшийся ряд начинает движение вниз как и было задумано.
game.py

import sys
import time
import pygame
from pygame.sprite import Group

from settings import Settings
import game_functions as gf

def run_game():
        # Иницилизирует игру и создает объект экрана.
        pygame.init()
        ai_settings = Settings()
        screen = pygame.display.set_mode((ai_settings.scr_width, ai_settings.scr_height))
        pygame.display.set_caption("Alien Invasion")

        #Создание группы для звезд
        stars = Group()
        gf.create_fleet(ai_settings, screen, stars)
        # Запуск основного цикла игры.
        while True:
            gf.check_events()
            gf.update_stars(stars)
            gf.update_screen(ai_settings, screen, stars)

run_game()

game_functions.py

import sys
import pygame
from star import Star

def check_events():
    #Обрабатывает нажатия клавиш и события мыши
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

def update_screen(ai_settings, screen, stars):
    #При каждом проходе перерисовывается экран
    screen.fill(ai_settings.bg_color)
    stars.draw(screen)
    # Отображение последнего прорисованного экрана
    pygame.display.flip()

#--------------------------------------------------------------
def get_number_stars_x(ai_settings, star_width):
    #Вычисление количества звезд в ряду
    number_stars_x = int(ai_settings.scr_width / star_width)
    return number_stars_x

def get_number_rows(ai_settings, star_height):
    #Вычисление количества рядов звезд
    number_rows = int(ai_settings.scr_height / star_height)
    return number_rows

def create_star(ai_settings, screen, stars, star_number, row_number):
    #Создание пришельца
    star = Star(ai_settings, screen)
    star.rect.x = star.rect.width * star_number
    star.rect.y = star.rect.height * row_number
    stars.add(star)

def create_fleet(ai_settings, screen, stars):
    #Создает флот пришельцев
    star = Star(ai_settings, screen)
    number_stars_x = get_number_stars_x(ai_settings, star.rect.width)
    number_rows = get_number_rows(ai_settings, star.rect.height)
    print(number_stars_x, number_rows, star.rect.width, star.rect.height)
    for row_number in range(number_rows):
        for star_number in range(number_stars_x):
            create_star(ai_settings, screen, stars, star_number, row_number)

def update_stars(stars):
    stars.update()

star.py

import pygame

from pygame.sprite import Sprite

class Star(Sprite):
    #Класс предстовляющий одну звезду
    def __init__(self, ai_settings, screen):
        super(Star, self).__init__()
        self.screen = screen
        self.ai_settings = ai_settings

        #Загрузка изображения звезды
        self.image = pygame.image.load('images/water.jpg')
        self.rect = self.image.get_rect()

        #Каждая новая звезда появляется в левом верхнем углу
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height

        #Сохранение позиции
        self.x = float(self.rect.x)
        self.y = float(self.rect.y)

    def check_edges(stars, screen):
        scr_rect = screen.get_rect()
        if stars.rect.top >= scr_rect.y:
            return True

    def update(self):
        self.y += self.ai_settings.img_speed_factor
        self.rect.y = self.y

    def blitme(self):
        #Выводит звезду на экран
        self.screen.blit(self.image, self.rect)

А зачем вы инициализируете свойства класса
self.rect.x и
self.rect.y вне конструктора класса?

star = Star(ai_settings, screen)
star.rect.x = star.rect.width * star_number
star.rect.y = star.rect.height * row_number

Вы ведь внутри конструктора класса
Star уже инициализируете их, но другими значениями, которые и сохраняете в свойства
star.x и
star.y:

#Каждая новая звезда появляется в левом верхнем углу
self.rect.x = self.rect.width
self.rect.y = self.rect.height

#Сохранение позиции
self.x = float(self.rect.x)
self.y = float(self.rect.y)

И потом вы именно этим значением
self.y, одинаковым для всех экземпляров объекта
Star пользуетесь для вычисления поля
self.rect.y:

def update(self):
    self.y += self.ai_settings.img_speed_factor
    self.rect.y = self.y

В результате после вызова
update у вас становится одинаковым и поле
self.rect.y у всех звёзд.
В общем, мои вам рекомендации:

Никогда не меняйте свойства класса "вручную" снаружи класса, делайте все изменения состояния объекта исключительно с помощью методов класса
Создавайте сразу полностью настроенный объект в конструкторе класса, не "донастраивайте" объекты после инициализации класса (даже с помощью методов класса)
Не множьте сущности без необходимости. У вас свойства
self.x и
self.y - вообще лишние, они вас только путают, оставьте только
self.rect.x и
self.rect.y, делайте все вычисления непосредственно с ними, ну и инициализируйте эти свойства в конструкторе класса, конечно, а не где-то снаружи.


Как избавиться от рекурсии в магическом методе абстрактного класса?
На сколько я понимаю в абстрактном классе можно хранить какое-то общее поведение для дочерних классов.
Подскажите, пожалуйста, как определить магический метод
__str__ в абстрактном классе, чтобы при печати экземпляров дочерних классов выводилась строчка:
данный метод сейчас вызывается в экземпляре (имя экземпляра) У меня сейчас получается ошибка рекурсии, на сколько я понимаю, из-за того, что при печати
{self} он как раз не находя метода ищет его Base, находит и так далее...,

from abc import ABC

class Base(ABC):
    def __str__(self):
        return f' Данный метод сейчас вызывается в экземпляре {self}'

class A(Base):
    pass

class B(Base):
    pass

a, b = A(), B()
print(a, b)

Ошибка рекурсии у вас выходит потому, что в этом фрагменте кода:

def __str__(self):
    return f' Данный метод сейчас вызывается в экземпляре {self}'
                                                          ^^^^^^

для печати
{self} питон получает строковое представление объекта
self, для чего он опять вызывает
__str__(self) и так по кругу.
Кроме того, экземпляры объектов в
Python не имеют имён, хотя вы можете сами задать объекту имя при создании, запомнить его в
__init__ и потом печатать его.
Пример кода, который работает без ошибки и выводит
id объекта:

class Base(ABC):
    def __str__(self):
        return f' Данный метод сейчас вызывается в экземпляре {id(self)}'

Вывод (у вас будут другие цифры, конечно):

Данный метод сейчас вызывается в экземпляре 140550787401712  Данный метод сейчас вызывается в экземпляре 140550787401656


Функция print() без создания новой строки с заменой предыдущего значения
Подобные вопросы по ссылкам, но решений я не нашел
Обновляющаяся строка
Перебор цифр без создания новой строки
Есть цикл:

for ......
    ......
    print(..%)
    ......

который выводит:

1%
4%
8%
...
95%
100%

Вопрос: как сделать сделать чтобы проценты менялись, а не дописывались?
т.е. чтобы сначала вывел

1%

затем заменил 1% на 4%

4%

и так менял цифры до 100%.

import time
for p in range(101):
    print(f"\r{p}%...", end="", flush=True)
    time.sleep(0.05)
print("done")


Почему не работает from
Пытаюсь понять Intra-package References
Дерево проекта:

project/
       __init__.py
       main.py
       folder/
              __init__.py
              module_1.py
              module_2.py

В "module_2.py пишу:

def one():
    return 1

В "module_1.py пишу:

from . import module_2
print(module_2.one())

остальные файлы пустые
ошибка

При запуске скрипта интерпретатор не знает родительский пакет, и потому относительный импорт не работает.
Если скрипт не верхнего уровня (а данном случае это так), то можно запустить скрипт как модуль:
python -m folder.module_1, тогда питон будет знать родительский пакет.
Еще вариант явно провисать в модуле родительский пакет до относительного импорта:

if __name__ == "__main__" and __package__ is None:
    __package__ = 'folder'

В таком случае даже
python folder/module_1.py будет работать при условии, что директория верхнего уровня указана в
PYTHONPATH.
Подробности описаны тут


Нужно сделать демона на хостинге ubuntu 18 [закрыт]

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

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

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

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

Написал телеграмм бота на python,залил на сервер ubuntu.
Установил все нужное, запускаю скрипт вручную все работает.
Не получается сделать нормального демона что бы скрипт работал без меня на удаленном доступе.
Пожалуйста, без ссылок где описано как, у меня не получается, все время что то с ошибкой или что то другое...
Версия дестрибутива Ubuntu: Ubuntu 18.04.5 LTS

nohup .../path/to/main.py > out.log &

А найти процесс можно так:

ps ax | grep main.py


PyQt5, как узнать какая кнопка активировала метод?
Есть окно с кнопками, которые создаются динамически, их количество невозможно предсказать.
При нажатии каждая из них, активирует функцию
foo.
Как внутри функции
foo узнать какая кнопка её активировала? Желательно узнать надпись на кнопке.

import sys

from PyQt5.QtWidgets import QVBoxLayout, QPushButton, QWidget, QApplication

def foo():
    print('button name')

prg = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout()
names = ['one','two','three']
for i in names:
    btn = QPushButton(i)
    btn.clicked.connect(foo)
    layout.addWidget(QPushButton(i))
window.setLayout(layout)
window.show()

sys.exit(prg.exec())

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

import sys
from PyQt5.QtWidgets import QVBoxLayout, QPushButton, QWidget, QApplication

def foo():
    button = QApplication.instance().sender()
    print(button.text())

app = QApplication(sys.argv)

window = QWidget()
layout = QVBoxLayout()
names = ['one', 'two', 'three']

for i in names:
    btn = QPushButton(i)
    btn.clicked.connect(foo)
    layout.addWidget(btn)

window.setLayout(layout)
window.show()

app.exec()

Но нужно помнить, что если при коннекте специально указать тип подключения DirectConnection, то этот метод может не сработать:

Warning: As mentioned above, the return value of this function is not
valid when the slot is called via a Qt::DirectConnection from a thread
different from this object's thread. Do not use this function in this
type of scenario.

Или используйте QButtonGroup, чтобы сгруппировать логически кнопки и иметь возможность ловить в сигнале какая кнопка была кликнута:

import sys
from PyQt5.QtWidgets import QVBoxLayout, QPushButton, QWidget, QApplication, QButtonGroup

def foo(button):
    print(button.text())

app = QApplication(sys.argv)

window = QWidget()
layout = QVBoxLayout()
names = ['one', 'two', 'three']

button_group = QButtonGroup()
button_group.buttonClicked.connect(foo)

for i in names:
    btn = QPushButton(i)
    button_group.addButton(btn)
    layout.addWidget(btn)

window.setLayout(layout)
window.show()

app.exec()


Откуда импортируется модуль django?
Начал изучать django, и в туториалах по нему люди пишут такое:
<code>
from django.http import HttpResponse
</code>
Не могу понять откуда взялся модуль django, ведь в папке django-проекта файла "django.py" нет?

Во время импорта модуля Python сначала ищет его в папке "около себя", т.е. в той же, где запускается скрипт, здесь Вы правы.
А вот если рядом модуля нет, происходит следующее: Python начинает искать модуль в специальном списке папок с модулями. Получить данный список можно так:

import sys
print(sys.path)

Он проходит по каждой папке в поисках нужного модуля.
При установке через pip, как уже отметили в комментарии, нужная папка автоматически добавляется в этот список. Также изначально, сразу после установки Python, в этом списке хранятся папки, содержащие стандартные модули, наподобие
os,
sys и
time.


Как предотвратить закачку дубликата в БД после проверки данных?
Я осуществляю проверку данных с помощью написания запроса к БД MS SQL через Python:
<code>
params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};SERVER=сервер;DATABASE=БД;UID=логин;PWD=пароль")
qry = """SELECT * FROM [таблица] WHERE [столбец] = ?"""
params = [pd.to_datetime("2020-07-20")]
df = pd.read_sql(qry, conn, params=params)
</code>
Здесь если я вижу, что данные возвращаются, то они уже есть в БД, а если нет, то продолжаю закачку.
Сейчас делаю полное веб приложение с графическим интерфейсом для коллег не IT.
Надо чтобы программа сама смотрела, если что-то выходит, то выводить предупреждение, что данные уже есть и возвращатся на первоначальную стадию закачки.
Как осуществить в коде данное условие?

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

if df.empty:
    ...

или

if len(df) == 0:
    ...


Как получить индексы последнего элемента вложенного массива?
Есть вложенный массив, глубина вложенности зарание неизвестна. Например, пусть будет:
<code>
a=array([[[36, 30, 94],
    [76, 37, 72],
    [83, 74, 52]],

   [[49, 19, 34],
    [66, 52, 43],
    [42, 28, 86]],

   [[95,  5, 54],
    [27,  8, 81],
    [92, 36, 38]]])
</code>
Как можно получить индексы последнего элемента самого последнего вложенного массива?
В данном примере этот элемент – 38.

Чтобы получить последний элемент матрицы любой размерности (число столбцов и число осей/размерностей заранее неизвестно):
<code>
last = a.ravel()[-1]
</code>


Не выбрасывается исключение IndexError
Нет вывода по
IndexError:

coffee = ["Café Latte", "Caffe Americano", "Espresso", "Cappuccino", "Macchiato"]
choice = int(input())
try:
    for i in range(len(coffee)):
        if i == choice:
            print(coffee[i])
except IndexError:
    print('invalid number')
finally:
    print('Have a good day')

В вашем коде блок except не будет вызван, т.к. Вы сначала получаете длину списка, а потом сравниваете со значением. Для получения сообщения Вам нужно получить ошибку:
<code>
coffee = ["Café Latte", "Caffe Americano", "Espresso", "Cappuccino", "Macchiato"]
choice = int(input())

try:
    print(coffee[choice])
except IndexError:
    print('invalid number')
finally:
    print('Have a good day')
</code>


vim python-mode ошибки запуска
При первом открытии любого python-файла показываются следующие ошибки:

Обнаружена ошибка при обработке function pymode#init:
строка    2:
E121: Неопределённая переменная: import
строка    3:
E121: Неопределённая переменная: sys
строка    4:
E121: Неопределённая переменная: sys
Обнаружена ошибка при обработке /home/dmitriy/.vim/bundle/python-mode/autoload/pymode/virtualenv.vim:
строка    3:
E121: Неопределённая переменная: from
Обнаружена ошибка при обработке function pymode#breakpoint#init:
строка    9:
E15: Недопустимое выражение: << EOF
строка   11:
E492: Это не команда редактора: from importlib.util import find_spec
строка   13:
E121: Неопределённая переменная: sys
строка   16:
E488: Лишние символы на хвосте: else:
строка   23:
E170: Отсутствует команда :endfor

часть .vimrc с настройками python-mode:

" отключаем автокомплит по коду (у нас вместо него используется jedi-vim)
let g:pymode_rope = 0
let g:pymode_rope_completion = 0
let g:pymode_rope_complete_on_dot = 0

" документация
let g:pymode_doc = 0
let g:pymode_doc_key = 'K'

" проверка кода
let g:pymode_lint = 1
let g:pymode_lint_checker = "pyflakes,pep8"
let g:pymode_lint_ignore="E501,W601,C0110"

" провека кода после сохранения
let g:pymode_lint_write = 1

" поддержка virtualenv
let g:pymode_virtualenv = 1

" установка breakpoints
let g:pymode_breakpoint = 1
let g:pymode_breakpoint_key = '<leader>b'

" подстветка синтаксиса
let g:pymode_syntax = 1
let g:pymode_syntax_all = 1
let g:pymode_syntax_indent_errors = g:pymode_syntax_all
let g:pymode_syntax_space_errors = g:pymode_syntax_all

" отключить autofold по коду
let g:pymode_folding = 0

" возможность запускать код
let g:pymode_run = 0

" Disable choose first function/method at autocomplete
let g:jedi#popup_select_first = 0

Как всегда ответ приходит именно тогда, когда перепробовал все варианты от других пользователей (да, уже гуглил ошибки и на ру, и на англ сайтах) и уже задал свой вопрос тут...
Если вкратце, то в начале файла .vimrc (выше нет его) была такая строчка:

let g:pymode_python = 'python'

И проблема была в том, что плагин не видел сам питон и нужно было добавить
3 в конце (так):

let g:pymode_python = 'python3'

Вопрос решен, теперь все работает. Ошибок нет, функционал весь от python-mode получил. Извиняюсь за создание лишнего вопроса на сайте. Но зато это может кому-то помочь, у кого возникнет схожая проблема.


как получить name в discord py
Пишу бота и мне нужно узнать каналы, которые есть в категории.
при

category = discord.utils.get(guild.categories, id=751053894238470244)
print(category.channels)

выдает

[<VoiceChannel id=751085283776266272 name='z' position=8 bitrate=64000 user_limit=0 category_id=751053894238470244>, <VoiceChannel id=751085807388983379 name='z' position=9 bitrate=64000 user_limit=0 category_id=751053894238470244>, <VoiceChannel id=751086149317165066 name='z1' position=10 bitrate=64000 user_limit=0 category_id=751053894238470244>]
И как вернуть name?

Вот код (ответ к коментарию). На выходе получим массив с именами.
<code>
names = [channel.name for channel in category.channels]
</code>


Как получить ник пользователя через его id в telegram?
Я Использую следующую функцию для получения сообщений из чатов (это библиотека telethon)

async def dump_all_messages(channel) -> list:
    '''функция для сбора сообщений с канала'''
    offset_msg = 0    # номер записи, с которой начинается считывание
    limit_msg = 100   # максимальное число записей, передаваемых за один раз

    all_messages = []   # список всех сообщений
    total_messages = 0
    total_count_limit = 0

    while True:
        history = await telethon_client(GetHistoryRequest(
            peer=channel,
            offset_id=offset_msg,
            offset_date=None, add_offset=0,
            limit=limit_msg, max_id=0, min_id=0,
            hash=0))
        if not history.messages:
            break
        messages = history.messages
        for message in messages:
            message = message.to_dict()
            all_messages.append({message['from_id']: message['message'].replace('\n', ' ').replace(r'\u', ' ')}):
        offset_msg = messages[len(messages) - 1].id
        total_messages = len(all_messages)
        if total_count_limit != 0 and total_messages >= total_count_limit:
            break
    return all_messages

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

filter_user = ChannelParticipantsSearch('')

    while True:
        participants = await telethon_client(GetParticipantsRequest(channel,
                                                                    filter_user, offset_user, limit_user, hash=0))

где в качестве фильтра берётся строка т.е. не id а ник. Так же я пробовал метод библиотеки pyrogram

with Client('user', api, 'hash') as app:
            user = app.get_users('username')
            name = user.username
            return name

Но она тоже требует ник а не id. Как мне получить ник человека в телеграме по его id?

Воспользуйтесь методом get_entity(), ему на вход можно передать почти что угодно:

user = await client.get_entity(1234567)


Почему пространство имён для eval() так работает?
Функция
grid выдаёт ошибку
name 'row' is not defined, так как функция
eval вызывается внутри вызова
grid. Однако, в функции
place такой проблемы нет, хотя команды те же. Почему
eval внутри вызова функции меняет свое пространство имён?

import tkinter as tk

def _parametrize(widget, method, kvs):
  s = "widget.%s(" % method
  r = []
  for u, v in kvs:
    if v != None:
      r += ["%s = %s" % (u, v)]
  s += ", ".join(r) + ")"
  exec(s)

def place(widget, x = None, y = None, width = None, height = None):
  kvs = []
  for s in ("x", "y", "width", "height"):
    kvs += [(s, eval(s))]
  _parametrize(widget, "place", kvs)

def grid(widget, row = None, column = None, rowspan = None, columnspan = None):
  _parametrize(widget, "grid", [(s, eval(s)) for s in ("row", "column", "rowspan", "columnspan")])

r = tk.Tk()

b = Button(r, text = "Button")
place(b, 20, 20, 100, 50)
grid(b)

r.mainloop()

В качестве области видимости
eval использует либо глобальную область видимости (если запущен вне функции), либо локальную область видимости (если запущен внутри функции).
У вас как раз случай с локальной областью видимости.
Однако, следует учитывать, что list comprehension создаёт новую локальную область видимости.
В этом легко убедиться:

def foo():

    a = 1

    print(locals())
    # Выведет: {'a': 1}

    [print(locals()) for x in range(1)]
    # Выведет: {'x': 0, '.0': <range_iterator object at 0x7fb02c9288a0>}

foo()

Как видите, в первом случае в локальной области видимости есть переменная
a. А во втором - её нет, но есть переменная
x.
Чтобы ваш код работал, ему можно явно передать области видимости:

def grid(widget, row = None, column = None, rowspan = None, columnspan = None):
    globs = globals()
    locs = locals()
    _parametrize(widget, "grid", [(s, eval(s, globs, locs))
                                  for s in ("row", "column", "rowspan", "columnspan")])

Но, как уже правильно сказал insolor, не надо использовать
exec и
eval без очень серьёзной на то причины. А в вашем случае легко можно обойтись без них.


Как переписать данный код в бинарном режиме?
Мне нужно построчно записать в файл .txt рандомные числа в таком количестве, что б файл весил не меньше 1 Гб, вот данный код, помогите переписать в бинарном режиме
<code>
import random

size = 0
with open("input.txt", "w") as file:
    while True:
        s = str(random.randrange(-100,100))
        if size + len(s) + 2 < 1024 * 1024 * 1024:
            print(s, file=file)
            size += len(s) + 2
        else:
            print(' '*(1024 * 1024 * 1024 - size), file=file, end = '')
            break
</code>
в бинарном режиме, то есть запись вместо "w" будет выглядить "wb", но поскольку у меня тип данных str, оно выдает ошибку:

TypeError: a bytes-like object cannot be str.

file.write((s + os.linesep).encode('utf-8'))

и

file.write(b' '*(1024 * 1024 * 1024 - size))


Область видимости у декоратора
Есть такой код:
<code>
def logger(f):
    def inner(*args, **kwargs):
        a = 6
        return f(*args, **kwargs)
    return inner
@logger
def nothing():
    print(a)
</code>
Выходит ошибка, что переменная a неопределенна, не совсем понимаю по какому принципу он ищет ее в области видимости. Можете объяснить?

у "декоратора" такая же область видимости что и у любого другого метода. в данном случае переменная
a объявлена в методе
inner и видна только в нем.
если вынести объявление переменной
a из
inner в
logger, то
a будет видна и в
logger и в
inner. поэтому слово декоратор я взял в ковычки, потому что декоратор это паттерн, а вопрос об области видимости вложенных методов. однако в методе
nothing переменная
a не будет доступна никогда, потому что он выполняется в своей области видимости.

def logger(f):
    a = ""
    print("logger:", locals())

    def inner(*args, **kwargs):
        nonlocal a
        b = ""
        print("logger.inner:", locals())
        return f(*args, **kwargs)
    return inner

@logger
def nothing():
    c = ""
    print("nothing:", locals())

nothing()

logger: {'a': '', 'f': <function nothing at 0x7f981115f4d0>}
logger.inner: {'args': (), 'kwargs': {}, 'b': '', 'a': '', 'f': <function nothing at 0x7f981115f4d0>}
nothing: {'c': ''}

для вложенной функции
inner переменные объявленные в функции
logger доступны в режиме read-only. ключевое слово
nonlocal в данном случае позволяет изменять переменную объявленнию на скоуп выше.
интересно, что без
nonlocal переменная
a не видна в
locals() если она не упоминается в коде
inner.

def logger(f):
    a = ""
    print("logger:", locals())

    def inner(*args, **kwargs):
        b = ""
        print("logger.inner:", locals())
        print(a)
        return f(*args, **kwargs)
    return inner

@logger
def nothing():
    c = ""
    print("nothing:", locals())

nothing()

logger: {'a': '', 'f': <function nothing at 0x7faa790214d0>}
logger.inner: {'args': (), 'kwargs': {}, 'b': '', 'a': '', 'f': <function nothing at 0x7faa790214d0>}

nothing: {'c': ''}

def logger(f):
    a = ""
    print("logger:", locals())

    def inner(*args, **kwargs):
        b = ""
        print("logger.inner:", locals())
        return f(*args, **kwargs)
    return inner

@logger
def nothing():
    c = ""
    print("nothing:", locals())

nothing()

logger: {'a': '', 'f': <function nothing at 0x7f20117c44d0>}
logger.inner: {'args': (), 'kwargs': {}, 'b': '', 'f': <function nothing at 0x7f20117c44d0>}
nothing: {'c': ''}

а вот метод
nothing никакого отношения к
logger и
inner не имеет.


Как мне сгенерировать файл .txt, заполненный произвольными числами, при этом он должен весить ровно 1 гигабайт?
<code>
from random import randrange

with open("input.txt", "w") as file:
    print(randrange(-100,100), file=file)
</code>
Написал пока только это, оно записывает только 1 значение

Один из способов - вывод строк, сформатированных до заданной длины. В текстовых файлах Windows конец строки занимает два байта, поэтому я сделал ширину 6.

with open("f:\input.txt", "w") as file:
    for i in range(1024 // 8):
        print("{0:>6}".format(randrange(-100,100)), file=file)

А чтобы не было пустого места, можно суммировать длины сгенерированных строк, пока не дойдёт до нужной длины, и в конце докинуть строку пробелов нужной длины.

size = 0
with open("f:\input.txt", "w") as file:
    while True:
        s = str(randrange(-100,100))
        if size + len(s) + 2 < 1024:
            print(s, file=file)
            size += len(s) + 2
        else:
            print(' '*(1024 - size), file=file, end = '')
            break


Как преобразовать list comprehension на развернутую запись цикла for в Python?
Нужно транспонировать матрицу 2х3 только через цикл for (не используя готовые библиотеки). Имеется такая короткая запись:
<code>
print([[arr4[j][i] for j in range(len(arr4))] for i in range(len(arr4[0]))])
</code>
Как можно это правильно развернуть?

Нужно только записать циклы из генератора списков, начиная с конца, и добавить явный объект списка:
<code>
arr4 = [[0,1],[2,3],[4,5]]
arrt = []
for i in range(len(arr4[0])):
    arrt.append([])
    for j in range(len(arr4)):
        arrt[-1].append(arr4[j][i])
print(arrt)
</code>


python3 elif syntax error [закрыт]

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

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

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

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

Ошибка:

     File "main.py", line 56
    elif datetime.datetime.todaye().isoweekday() == 2:
       ^
SyntaxError: invalid syntax

Код:

@bot.message_handler(commands=['today'])
def send_welcome(message):
    if datetime.datetime.today().isoweekday() == 1:
        bot.reply_to(message, open_file('msg/1.txt')
    elif datetime.datetime.todaye().isoweekday() == 2:
        bot.reply_to(message, open_file('msg/2.txt')
    elif datetime.datetime.todaye().isoweekday() == 3:
        bot.reply_to(message, open_file('msg/3.txt')
    elif datetime.datetime.todaye().isoweekday() == 4:
        bot.reply_to(message, open_file('msg/4.txt')
    elif datetime.datetime.todaye().isoweekday() == 5:
        bot.reply_to(message, open_file('msg/5.txt')

Что я делаю не так?

<code>
bot.reply_to(message, open_file('msg/1.txt')
</code>
Здесь нет закрывающей скобки


Как правильно указать 'default' для ForeignKey?

class vedModel(models.Model):

    # прикрепит к базовому объекту профиля
    base_id = models.ForeignKey('account.profileModel', on_delete = models.SET_DEFAULT, default = 'account.profileModel.objects.get(login="123")')

Выдаёт ошибку:

Operations to perform:
  Apply all migrations: ved
Running migrations:
  Applying ved.0003_auto_20200902_1939...Traceback (most recent call last):
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\db\models\fields\__init__.py", line 1774, in get_prep_value
    return int(value)
ValueError: invalid literal for int() with base 10: 'account.profileModel.objects.get(login="123")'

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

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\core\management\__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\core\management\base.py", line 330, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\core\management\base.py", line 371, in execute
    output = self.handle(*args, **options)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\core\management\base.py", line 85, in wrapped
    res = handle_func(*args, **kwargs)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\core\management\commands\migrate.py", line 245, in handle
    fake_initial=fake_initial,
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\db\migrations\executor.py", line 117, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\db\migrations\executor.py", line 147, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\db\migrations\executor.py", line 227, in apply_migration
    state = migration.apply(state, schema_editor)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\db\migrations\migration.py", line 124, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\db\migrations\operations\fields.py", line 106, in database_forwards
    field,
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\db\backends\sqlite3\schema.py", line 328, in add_field
    self._remake_table(model, create_field=field)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\db\backends\sqlite3\schema.py", line 189, in _remake_table
    self.effective_default(create_field)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\db\backends\base\schema.py", line 303, in effective_default
    return field.get_db_prep_save(self._effective_default(field), self.connection)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\db\models\fields\related.py", line 971, in get_db_prep_save
    return self.target_field.get_db_prep_save(value, connection=connection)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\db\models\fields\__init__.py", line 823, in get_db_prep_save
    return self.get_db_prep_value(value, connection=connection, prepared=False)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\db\models\fields\__init__.py", line 2388, in get_db_prep_value
    value = self.get_prep_value(value)
  File "C:\Users\ledo\wwwkaba\lib\site-packages\django\db\models\fields\__init__.py", line 1778, in get_prep_value
    ) from e
ValueError: Field 'id' expected a number but got 'account.profileModel.objects.get(login="123")'.

так работает
<code>
base_id = models.ForeignKey('account.profileModel', default = profileModel.objects.get(login='admin').id, on_delete = models.SET_DEFAULT)
</code>


Преобразование строки байтов в объект байты
Я получаю байты из json которые записаны как строка

s = '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'

Как перевести строку в тип байты, чтобы было так

s = b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'

Пробовал использовать encode но оно выдает не тот результат

s = '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'

print(s)

print(s.encode())

Через получение числового кода каждого символа, потом преобразования набора этих кодов в байты:

s = '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
b = bytes(map(ord, s))  # или b = bytes(ord(x) for x in s)
print(b)  # b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'

Также работает такой вариант:

b = s.encode('latin1')


ubuntu импорт файла из той же директории
<code>
david@david-ThinkPad-E480:~/Desktop/postgresql$ ll
total 16
drwxrwxr-x 2 david david 4096 сен  2 12:43 ./
drwxr-xr-x 7 david david 4096 сен  2 12:23 ../
-rw-rw-r-- 1 david david    0 сен  2 12:30 __init__.py
-rw-rw-r-- 1 david david   42 сен  2 12:43 p1
-rw-rw-r-- 1 david david   56 сен  2 12:43 p2
david@david-ThinkPad-E480:~/Desktop/postgresql$ cat p1
import random
import p2

input(p2.foo())
david@david-ThinkPad-E480:~/Desktop/postgresql$ cat p2
def foo():
    input(3)
    return random.randint(1, 5)
david@david-ThinkPad-E480:~/Desktop/postgresql$ python3 p1
Traceback (most recent call last):
  File "p1", line 2, in <module>
    import p2
ModuleNotFoundError: No module named 'p2'
david@david-ThinkPad-E480:~/Desktop/postgresql$
</code>
Даже добавить нечего

А разве у файлов
p1 и
p2 не должно быть расширений
.py?
Запустить, передав файл прямо интерпретатору питона, вы можете файл с любым расширением или без него, а вот импортировать файл без расширения
.py вы не сможете, питон его просто не найдёт.
Так что переименуйте файлы в
p1.py и
p2.py.


Почему в конце каждой строки появляется None?
Дано задание построить пирамиду, задавая число.
Например, если заданное число 3, то на выходе должно получиться:

1
12
123

Если 5, то:

1
12
123
1234
12345

Я осуществил решение таким образом:

n = int(input())

def pyr(n):
    for j in range(1, n+1):
        print(j, end='')

for i in range(1, n+1):
    print(pyr(i))

И на выходе получил:

1None
12None
123None
1234None
12345None

Помогите пожалуйста понять, откуда там None?

def pyr(n):
    for j in range(1, n+1):
        print(j, end='')
    print("")

n = int(input())

for i in range(1, n+1):
    pyr(i)

Не пытайтесь печатать непечатные выражения :) типа
pyr(i) - они же ничего не возвращают...


Объединить 2 датафрейма в один
У меня имеется два датафрейма:

df1
Day Study
1     1
3     2
4     1
5     4
6     1
7     1
8     2
9     1
10    1
11    1
12    1
13    1
14    1
15    1
16    1
17    1
18    1
19    1
20    1
21    1
22    1

df2
Day
0     1
1     2
2     3
3     4
4     5
5     6
6     7
.......
30   31

df - это какого числа сколько исследований было сделано. df2 - числа месяца. В данном случае их 31. Как теперь объединить их, чтобы количество исследований встало на нужные даты, а в те дни, когда исследование не проводилось, ставился 0?
Пример

Day Amount

1    1
2    0  (т.к. 2 числа исслед.не было)
3    2
и т.д.

Зачем их объединять, если вы все можете сделать с одним датафреймом?

df1["Day"] = df1["Day"].astype("int")
df1.set_index("Day").reindex(range(1, 32)).fillna(0)

     Study
Day
1      1.0
2      0.0
3      2.0
4      1.0
5      4.0
6      1.0
7      1.0
8      2.0
9      1.0
10     1.0
11     1.0
12     1.0
13     1.0
14     1.0
15     1.0
16     1.0
...


Pandas подсчитать количество одинаковых записей в столбце
Имеется DataFrame

   First name Last name Study Status  Day  Month  Year    DayWeek
   0        Ivan    Ivanov   ihc   done    1      8  2020   Saturday
   1        Ivan    Ivanov  hist  doing    8      8  2020   Saturday
   2        Ivan    Ivanov   ihc  to_do    3      8  2020     Monday
   3        Ivan    Ivanov   ihc   done    4      8  2020    Tuesday
   4        Ivan    Ivanov  hist  doing    5      8  2020  Wednesday
   5        Ivan    Ivanov   ihc  to_do    6      8  2020   Thursday
   6        Ivan    Ivanov   ihc   done    7      8  2020     Friday
   7        Ivan    Ivanov  hist  doing    8      8  2020   Saturday
   8        Ivan    Ivanov   ihc  to_do    9      8  2020     Sunday
   9        Ivan    Ivanov   ihc   done   10      8  2020     Monday
   10       Ivan    Ivanov  hist  doing   11      8  2020    Tuesday
   11       Ivan    Ivanov   ihc   done   12      8  2020  Wednesday
   12       Ivan    Ivanov  hist  doing   13      8  2020   Thursday
   13       Ivan    Ivanov   ihc  to_do   14      8  2020     Friday
   14       Ivan    Ivanov   ihc   done   15      8  2020   Saturday
   15       Ivan    Ivanov  hist  doing   16      8  2020     Sunday
   16       Ivan    Ivanov   ihc  to_do   17      8  2020     Monday
   17       Ivan    Ivanov   ihc   done   18      8  2020    Tuesday
   18       Ivan    Ivanov  hist  doing   19      8  2020  Wednesday
   19       Ivan    Ivanov   ihc  to_do   20      8  2020   Thursday
   20       Ivan    Ivanov   ihc   done   21      8  2020     Friday
   21       Ivan    Ivanov  hist  doing   22      8  2020   Saturday
   22       Ivan    Ivanov   ihc   done    5      8  2020  Wednesday
   23       Ivan    Ivanov  hist  doing    5      8  2020  Wednesday
   24       Ivan    Ivanov   ihc  to_do    3      8  2020     Monday
   25       Ivan    Ivanov   ihc   done    5      8  2020  Wednesday

Здесь показаны какие мед.исследования (Study) были сделаны пациенту и какого числа (Day,Month).
Как видно, несколько исследований были сделаны в один день (5 августа были сделаны 4 исследования).
Исходя из этого, мне нужно сделать новый датафрейм, где:

колонка1-число месяца  колонка2-количество исследований в день

Пример:

Day    Amount
1       1
2       0
3       2
4       1
5       4

и.тд.
Как это сделать, подскажите,плз

Ещё можно использовать функцию
value_counts, если требуется посчитать число иссделований в рамках месяца:

    df = df['Day'].value_counts().rename_axis('Day').reset_index(name='Amount')

А в общем случае с
groupBy будет что-то подобное:

    df = DataFrame({'count' : df1.groupby( ["Day", "Month", "Year"] ).size()}).reset_index()


Как сохранить картинку, полученную по ссылке, в модель?
Как сохранить картинку, полученную по ссылке, в модель?

def ajax_link_download_imgDef(request):

    if request.method == 'GET':

        # получит ссылку на изображение
        img_url = request.GET['link']

        img = requests.get(img_url, stream = True)
        img_file = open('img.png', 'wb')
        img_file.write(img.content)

        # сохранит (создав модель)
        obj = pattern_save_imgModel.objects.create(field_img = img_file, )

        # получить название сохранённой картинки
        # img_name = str(obj.field_img)

        # удалит файл с изображением
        img_file.close()

        return HttpResponse(MEDIA_URL + 'АВА_spocg9R.jpg')

в данном случае выдает ошибку

AttributeError: '_io.BufferedWriter' object has no attribute '_committed'
[01/Sep/2020 14:59:44] "GET /ved/post/ajax!menu_link_download_img/?link=https%3A%2F%2Fis3-ssl.mzstatic.com%2Fimage%2Fthumb%2FPurple113%2Fv4%2F41%2Ff8%2F9e%2F41f89e30-c098-fc38-b2d5-45a792b7c1fb%2FAppIcon-1x_U007emarketing-0-7-0-0-85-220.png%2F1200x630wa.png&_=1598961569926 HTTP/1.1" 500 17069

FieldFile.saveМетод должен быть вызван с экземпляром django.core.files.File, а не встроенный в ручку питон файла. Измените вызов сохранения на:
<code>
from django.core.files import File

imagead.full_photo.save("NowHiring.jpg", File(open("C:\\NowHiring.jpg", "rb")))
</code>
За ответ благодарю  Victor VosMottor


Как работает этот фрагмент (?!word\b)?

\b(?!word\b)\S{4,16}\b

Не понял, как работает это выражение в этом месте:
(?!word\b)\S.

Это negative lookahead. В данном случае означает, что не может быть отдельно стоящего слова
word.

\b ― граница слова (
(^\w|\w$|\W\w|\w\W))

(?!word\b) ― отсутствие сочетания
word + граница слова

\S{4,16}\b ― непробельные 4-16 символов + граница слова

Например:

word ― не найдёт

word hello ― не найдёт
word, но найдёт
hello

word123456789ABC ― найдёт

word123456789ABCD ― не найдёт


Деплой телеграм бота на сервер
Как правильно развернуть бота на сервере? Ос сервера Ubuntu. Бот полностью написан на Python. Интересует, что использовать для автоматического включения бота в случае падения серверов телеграмма. Почитал про systemd, supervisor, веб-хуки. Что из этого более правильный выбор?

systemd самое рациональное решение, supervisor считается устаревшим


Дата в pandas превращается в миллисекунды
Создаю df из CSV.
Вид df:

      <TICKER> <PER>    D      <TIME>   OPEN  <HIGH>  <LOW>  CLOSE    <VOL>
0    SPFB.BR     D  20100114       0  79.27   79.46  78.00  78.40    51012
1    SPFB.BR     D  20100121       0  76.42   76.79  74.29  74.50    56156
2    SPFB.BR     D  20100128       0  72.30   73.06  71.53  72.32    63514

Хочу создать новую колонку с номером недели.

dat = pd.to_datetime(df['D'])
week= dat.dt.week

Получаю:
0     1970-01-01 00:00:00.020100114
1     1970-01-01 00:00:00.020100121
2     1970-01-01 00:00:00.020100128

Получаю вот такой формат даты, и соответственно везде первую неделю. Почему дата превращается в миллисекунды?

Укажите формат даты в явном виде:
<code>
dat = pd.to_datetime(df['D'].astype(str), format='%Y%m%d')
</code>
Иначе да, оно думает, что это число и переводит его в наносекунды.
Возможно, надо ещё будет превратить данные сначала в строковый формат, надо проверять, я на всякий случай добавил это преобразование в код.


Запуск swagger_server через uWSGI
Мой сгенерированный swagger_server отлично работает при запуске с:

python3 -m swagger_server

#!/usr/bin/env python3

import connexion

from swagger_server import encoder

def main():
    app = connexion.App(__name__, specification_dir='./swagger/')
    app.app.json_encoder = encoder.JSONEncoder
    app.add_api('swagger.yaml', arguments={'title': 'API'}, pythonic_params=True)
    app.run(port=8080)

if __name__ == '__main__':
    main()

Проблема в том, что я не могу найти синтаксис для вызова wsgi.py сервера swagger_server, поскольку он был построен как модуль.
Возникла такая проблема, помогите пожалуйста написать
wsgi.py
P.S. если вам нужна еще какая-то дополнительная информация для решения этой проблемы, напишите я предоставлю.
UPD.
Решение:
Поменял
__main__.py на:

#!/usr/bin/env python3

import connexion

from swagger_server import encoder

app = connexion.App(__name__, specification_dir='./swagger/')
app.app.json_encoder = encoder.JSONEncoder
app.add_api('swagger.yaml', arguments={'title': 'API'}, pythonic_params=True)
application = app.app

и добавил
wsgi.py в корневую папку:

from swagger_server.__main__ import application

if __name__ == '__main__':
    application.run()

Запустил через команду
uwsgi --http-socket 127.0.0.1:3031 --wsgi-file wsgi.py --callable application --processes 4 --threads 2

connexion.App не имеет интерфейса wsgi.
Можно вытащить aiohttp( или flask) приложение по ссылке
<code>
aioapp = app.app
</code>
А дальше оборачивать это в wsgi


Как получить текущую цену активы используя ibapi Python [закрыт]

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

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

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

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

Мне нужно получить текущую цену актива, как я понял есть цена last и trade, мне нужна trade, я почитал документацию и нашел только как получать last цену. У меня аккаунт с платной подпиской на interactivebrokers

Так и непонятно какую именно цену вы хотите получить, потому как есть две текущих цены
ask и
bid
Вот список доступных значений Available Tick Types
Вам похоже нужно одно из этих значений:

Tick Name        Tick Id    Description Delivery                        Method

Last RTH Trade     57       Last Regular Trading Hours traded price.    IBApi.EWrapper.tickPrice
Mark Price         37       theoretical calculated value.               EWrapper.tickPrice


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

class Preparer(TransformerMixin, BaseEstimator):

def fit(self, X, y=None, random_state=None):
    if random_state:
        np.random.seed(random_state)

    X_d = X.shape[1]
    Z = np.random.normal(size=(X_d, X_d))

    self.Z = Z
    self.X = X
    return self

def transform(self, X, y=None):
    return X.dot(self.Z)

X_new = Preparer().fit_transform(X, random_state=12345)

Хочу добавить внутри класса проверку этой матрицы на обратимость, сначала попробовал вот так:

class Preparer(TransformerMixin, BaseEstimator):

def fit(self, X, y=None, random_state=None):
    if random_state:
        np.random.seed(random_state)

    X_d = X.shape[1]
    Z = np.random.normal(size=(X_d, X_d))

    self.Z = Z
    self.X = X
    return self

def check(self):
    ch = self.Z
    Z_rev = np.linalg.inv(ch)
    if np.allclose(np.dot(ch, Z_rev), np.eye(ch.shape[0])) is True:
        ans = "Correct, it's alive"
    else:
        ans = "Incorrect"
    return ans

def transform(self, X, y=None):
    return X.dot(self.Z)

X_new = Preparer().fit_transform(X, random_state=12345)
print(Preparer().check())

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-49-970f16a02444> in <module>
      1 X_new = Preparer().fit_transform(X, random_state=12345)
----> 2 check_m = Preparer().check()
      3 print(Preparer().check())
      4 display(X.shape, X_new.shape)

<ipython-input-48-325b53b325ec> in check(self, y)
     15
     16     def check(self, y=None):
---> 17         ch = self.Z
     18         Z_rev = np.linalg.inv(ch)
     19         if np.allclose(np.dot(ch, Z_rev), np.eye(ch.shape[0])) is True:

AttributeError: 'Preparer' object has no attribute 'Z'

Затем попробовал через конструктор определить переменные:

class Preparer(TransformerMixin, BaseEstimator):

    def __init__(self, Z, X):
        self.Z = Z
        self.X = X

    def fit(self, X, y=None, random_state=None):
        if random_state:
            np.random.seed(random_state)

        X_d = X.shape[1]
        self.Z = np.random.normal(size=(X_d, X_d))

        return self

    def check(self):
        Z_rev = np.linalg.inv(Z)
        if np.allclose(np.dot(self.Z, Z_rev), np.eye(self.Z.shape[0])) is True:
            ans = "Correct, it's alive"
        else:
            ans = "Incorrect"
        return ans

    def transform(self, X, y=None):
        return X.dot(self.Z)

В итоге ловлю вот такую ошибку:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-ceee7b2c8018> in <module>
----> 1 X_new = Preparer().fit_transform(X, random_state=12345)
      2 #print(Preparer().check())
      3 display(X.shape, X_new.shape)

TypeError: __init__() missing 2 required positional arguments: 'Z' and 'X'

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

Создавайте экземпляр класса и работайте с ним. В
sklearn насколько я помню все трансформеры именно так работают.

preparer = Preparer() # если есть параметры инициализации, передайте их тут
X_new = preparer.fit_transform(X, random_state=12345)
print(preparer.check())

Вы же просто создаёте в каждой строке новый экземпляр класса, вызывая его конструктор:
Preparer(). Новый экземпляр класса ничего не знает о переменных предыдущего экземпляра (но знает статические переменные, что в общем-то не выход в данном случае). И в реализации класса вы путаете статические переменные и переменные экземпляра класса
self., разберитесь, где у вас чего, и всё заработает. Лучше без особой надобности не делать статических переменных, обычно это плохой стиль, так же как и использовать глобальные переменные.


Завершение и сохранение данных в потоках
Есть 3 потока, которые выполняют некую функцию. В функции изменяются списки. Стоит задача, по команде останавливать все потоки, а изменения в этих списках сохранять.
Код

t1 = threading.Thread(target=final, args=(block1, block_out1,))
t2 = threading.Thread(target=final, args=(block2, block_out2,))
t3 = threading.Thread(target=final, args=(block3, block_out3,))
t1.start()
t2.start()
t3.start()

Как я понимаю, мне нужен 4 поток, который будет отслеживать
input команды остановки. Как завершить потоки и сохранить данные? Была идея завершать процесс
python через
os, но это выглядит, как не очень элегантное решение.

<code>
def final(b_in, b_out, ev) :
    for a in b_in:
        if ev.is_set():
            break # или raise Exception('canceled')
        # Работа

event = threading.Event()

t1 = threading.Thread(target=final, args=(block1, block_out1, event))
t1.start()

if input() == 'stop' :
    event.set()

t1.join()

# вывод
</code>
Както так
Пс. пишу с телефона..
В асинхронных заданиях asincio.Task можно вызывать исключение в любом месте из основного потока - но это другое


Кто нибудь знает как сделать отсчет времени в Python? Посоветуйте какой-нибудь модуль или команду [закрыт]

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

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

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

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

Кто нибудь знает как сделать отсчет времени в Python? Посоветуйте какой-нибудь модуль или команду, Python3

Скорее всего вам подойдёт модуль time


Почему один и тот же запрос к базе sqlite3 дает разный результат?
Во время ыполнения программы запрос к бд выдает ошибку

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

    cursor.execute("""update users set userorder={uord} where id={idd}""".format(idd=uid, uord="`{}:{}`".format(
                                                                                str(country),
                                                                                str(ipv))
                                                                                )
               )

вот запрос в теле функции

cursor.execute('update users set userorder="us:6" where id="1290609049"')

вот запрос выполняю в консоли питона, просто подставив данные из функции
В консоли запрос выполняется без ошибок, а во время выполнения программ вылазит во такая ошибка

sqlite3.OperationalError: no such column: us:6

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

Используйте параметризированные запросы:
<code>
parms = (f"{country}:{ipv}", uid)
cursor.execute('update users set userorder=? where id=?', parms)
</code>

во-первых это автоматически разрешит ваши проблемы с кавычками (если тип переменных будет соответствовать типу данных в таблице)
во-вторых это обезопасит вас от SQL injections
в-третьих это скорее всего будет выполняться быстрее, т.к. не надо будет повторно парсить и оптимизировать запрос для разных значений


Как объединить несколько регулярных выражений в одно?
Необходимо было добавить пробелов между  математическими знаками
/*+- в строке
eq = 'a+b-c/d*30' и я не придумал, к сожалению ничего лучшего кроме как:

eq_new = re.sub(r'[-]', ' - ', eq)
eq_new = re.sub(r'[+]', ' + ', eq_new)
eq_new = re.sub(r'[/]', ' / ', eq_new)
eq_new = re.sub(r'[*]', ' * ', eq_new)

Но это явно противоречит DRY. Подскажите, пожалуйста, можно ли как-то сделать из 4х этих выражений одно?
Спасибо!

Используйте

re.sub(r'[-+/*]', r' \g<0> ', text)

См. пример работы регулярного выражения.
[-+/*] находит
-,
+,
/ или
*, а
\g<0> подставляет текст целого совпадения.
Если пробелы уже существуют в некоторых местах, то можно использовать

re.sub(r'\s*([-+/*])\s*', r' \1 ', text)

Подробности

\s* - 0 и более пробельных символов

([-+/*]) - Захватывающая подмаска №1 (
\1 подставляет текст, захваченный этой подмаской, в шаблоне замены):
-,
+,
/ или
*

\s* - 0 и более пробельных символов


Какие функции или методы есть для отслеживания касания экрана мобильного телефона?
Вы не могли бы подсказать как можно сделать, чтобы я мог нажать на две (условные) кнопки одновременно и чтобы эти кнопки выполняли сразу два действия?
Я делаю мобильную игру на python с использованием pygame и мне нужно узнать может ли pygame "увидеть", что я нажал двумя пальцами на разные кнопки одновременно.

Говорят, что Pygame напрямую не поддерживает мультитач и по существу ставит в очередь мультитач-взаимодействия как отдельные события мыши. Однако вы можете обойти систему событий мыши pygame и использовать библиотеку touchpy для обработки/перехвата сенсорного и мультитач-ввода. Здесь можно увидеть серию руководств по решению именно этой проблемы (Части 1, 2, 3, 4).


Как сделать PIVOT таблицы с тремя столбцами
Есть таблица в Pandas:

  Название  Значение    дата
0        А        25     5
1        А        15     6
2        А        14     8
3        Б        36     5
4        Б        47     6
5        Б        67     8
6        В        16     6
7        В        95     7

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

    data   А   Б   В
0     5    25  36  Na
1     6    15  47  95
2     7    Na  Na  47
3     8    14  67  Na

res = (df
       .pivot(index="дата", columns="Название", values="Значение")
       .rename_axis(None, axis=1)
       .reset_index())

результат:

In [10]: res
Out[10]:
   дата     А     Б     В
0     5  25.0  36.0   NaN
1     6  15.0  47.0  16.0
2     7   NaN   NaN  95.0
3     8  14.0  67.0   NaN


Не понимаю почему код работает именно так и как исправить это
Вот мой код:
<code>
a = input()
print(-15 > a <= 12)
</code>
Я хочу чтобы переменная которая больше -15
и меньше 12 при выводе выводилось True, но работает все наоборот

-15 > a <= 12 значит, что должны быть одновременно исполнены 2 условия, именно

-15 > a (т. е.
-15 более чем
а, что то же самое как
а меньше чем
-15), и

a <= 12 (т.е.
а меньше или равно
12).

Вы вероятно хотели в первом условии (
-15 > a) применить обратный знак неравенства:

-15 < a.
Значит, вашу вторую команду нужно исправить на

print(-15 < a <= 12)


RunTimeError, Tkinter и мультипоточность
Создаю чат-сервер на socket и threading + tkinter
Использую TCP/IP, server <-> client
Как я понял ошибка из-за особеностей ткинтера, но всё решения что я нашел в сети были индивидуальними.
Сама ошибка:

Exception in thread SendThread:
Traceback (most recent call last):
  File "C:\Users\*******\AppData\Local\Programs\Python\Python38-32\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Users\Davyd\AppData\Local\Programs\Python\Python38-32\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "D:\restico_project\Python\chat_app\client.py", line 21, in send
    data = entry.get()
  File "C:\Users\******\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 3038, in get
    return self.tk.call(self._w, 'get')
RuntimeError: main thread is not in main loop

Код сервера:

import time
import socket
import tkinter as tk
import threading as th

root = tk.Tk()
root.config(bg='#ffcA70')
root.title('SERVER')
root.geometry('500x500+550+200')
root.resizable(False, False)

def get():
    while True:
        data = con.recv(1024).decode('utf-8')
        if data != ' ':
            label_text = display_text.get() + '\n'
            text['text'] = label_text + data

def send():
    data = entry.get()
    if data != ' ':
        send_data = time.strftime('[%x %X] :: ') + data
        con.send((send_data).encode('utf-8'))
        label_text = display_text.get()
        text = label_text + '\n[ YOU ] ' + send_data

send_thread = th.Thread(target=send, name='SendThread', daemon=True)
get_thread = th.Thread(target=get, name='GetThread', daemon=True)

display_text = tk.StringVar()
text = tk.Label(root, width=35, height=16, bg='#ffe5b3', font="Arial 14",
               justify='left', anchor='sw', textvariable=display_text)
text.pack(side='top', pady=10)

wrap = tk.LabelFrame(root, text='Enter text...', bg='#ffcA70')
entry = tk.Entry(wrap, width=48, bg='#f1eee9')
send_but = tk.Button(wrap, width=19, height=2, text='Send', bg='#e7a54f', command=send)

wrap.pack(side='top', padx=5, pady=1, ipadx=2)
entry.pack(side='left')
send_but.pack(side='left')

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostbyname(socket.gethostname()), 2020))
s.listen(1)

con, addr = s.accept()

send_thread.start()
get_thread.start()

send_thread.join()
get_thread.join()

root.mainloop()

Код клиента:

import time
import socket
import tkinter as tk
import threading as th

root = tk.Tk()
root.config(bg='#ffe5b3')
root.title('CLIENT')
root.geometry('500x500+550+200')
root.resizable(False, False)

def get():
    while True:
        data = s.recv(1024).decode('utf-8')
        if data != ' ':
            label_text = display_text.get() +'\n'
            text['text'] = label_text + data

def send():
    data = entry.get()
    if data != ' ':
        send_data = time.strftime('[%x %X] :: ') + data
        s.send((send_data).encode('utf-8'))
        label_text = display_text.get()
        text = label_text + '\n[ YOU ] ' + send_data

send_thread = th.Thread(target=send, name='SendThread', daemon=True)
get_thread = th.Thread(target=get, name='GetThread', daemon=True)

display_text = tk.StringVar()
text = tk.Label(root, width=35, height=16, bg='#f1eee9', font="Arial 14",
               justify='left', anchor='sw', textvariable=display_text)
text.pack(side='top', pady=10)

wrap = tk.LabelFrame(root, text='Enter text...', bg='#ffe5b3')
entry = tk.Entry(wrap, width=48, bg='#f1eee9')
send_but = tk.Button(wrap, width=19, height=2, text='Send', bg='#e7a54f' , command=send)
wrap.pack(side='top', padx=5, pady=1, ipadx=2)
entry.pack(side='left')
send_but.pack(side='left')

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.0.103', 2020))

send_thread.start()
get_thread.start()

send_thread.join()
get_thread.join()

root.mainloop()

@CrazyElf:
Не помню как в Питоне, но обычно нигде нельзя работать с GUI не из основного потока.
Варианты решения этой проблемы для
tkinter можно посмотреть здесь


Поиск нескольких строк текста в файле
Имеется:
Текстовый файл test.txt:

   1
   2
   3
   5 - НЕ ТА СТРОКА
   4
   D
   6
   5 - НУЖНАЯ СТРОКА
   6
   7
   5

Код:

word = str(raw_input("Введите букву:\n"))
num = str(raw_input("Введите цифру:\n"))
with open('test.txt', 'r') as file:
     data = file.readlines()
     for line in data:
          if word in line:
               print(line)
               for line in data:
               # понимаю, что эта строка некорректная,
               # так как цикл проходит с самого начала файла.
               # Целью было как-то продолжить поиск по файлу,
               # если совпадение найдено.
                    if num in line:
                         print(line)
                         break

Цель:
Задаем с клавиатуры значение переменной
word = D,
num = 5.
Нужно, чтобы скрипт нашел строку, содержащую букву "D". Если такая строка найдена, нужно найти строку с цифрой "5", которая идет ПОСЛЕ "D" и закончить поиск после первого нахождения.
Цифра "5" только в конкретном примере может находиться через строчку от буквы "D". В реальности подобных файлов много и цифра может быть в любой строке.
Вопрос:
Чем можно заменить некорректную строку в коде и какими способами выполнить необходимый поиск?

t = \
'''1
2
3
5
4
D
6
5
6
7
5
'''

w = 'D'
n = '5'

def search(d, n, w):
    return d.index(n, d.index(w)) + 1

data = tuple(map(str.rstrip, open('test.txt').readlines()))

try:
    print(('Номер искомой строки: {}').format(search(data, n, w)))
    #-> Номер искомой строки: 8
    print(('Номер искомой строки: {}').format(search(t.split(), n, w)))
    #-> Номер искомой строки: 8
except ValueError:
    print('Не найдено!')  # или своя логика обработки


Выполнить асинхронную функцию синхронно
Входные данные:
Я пишу скрипт на python. Метод экземпляра класса из этого скрипта экспортируются в другой файл и помещается внутрь event loop, но этот event loop создаётся не мной, а фреймворком, поэтому я не могу в него впихнуть свою функцию. Код в примере максимально упрощён, а все функции заменены на выдуманные для того, чтобы было легче понять
Сам скрипт:
<code>
""" Импорт функции из одной библиотеки. Эта функция асинхронна и требует await перед собой
Мне необходимо выполнить эту функцию в своём скрипте """
from library import some_function

""" Импорт класса из фреймворка (никак не связано с библиотекой,
отткуда импортируется функция выше).
При запуске всей системы экземпляр этого класса импортируется в другой файл,
который я так же не могу изменять. В этом файле происходит создание и запуск event loop """
from framework import SomeClass

""" Создание экземпляра класса """
someclass = SomeClass()

""" Далее идёт изменение свойств класса и прочий код """
# ...
# ...
# ...

""" Здесь мне нужно выполнить функцию, которая была импортирована из библиотеки ранее НО: """
some_function() # - Ошибка! Функция не имеет await перед собой

await some_function() # - Ошибка! Нельзя использовать await вне функции

import asyncio
asyncio.run(some_function()) # - Ошибка! Вы пытаетесь создать event loop внутри другого event loop
</code>
Как быть?

Видимо, уже нашли решение. Вот для тех, кто ищет:
Используйте
asyncio.get_event_loop() чтобы получить уже существующий event loop:

loop = asyncio.get_event_loop()
loop.run_until_complete(some_function()) # Будет ждать, пока some_function не закончит выполнение.

Согласно документации,
run_until_complete выполняет async функцию, при этом блокируя исполнение программы в месте вызова. Другими словами, выполняет асинхронную функцию синхронно.


Код не удаляет строку из файла, когда в файле одна строка
Пользователь вводит строку, которую хочет удалить из файла. Код перезаписывает в файл все строки кроме нужной. Когда остается одна строчка, она не удаляется. Нужно сделать так, чтобы удалялась последняя строка и файл становился чистым.
<code>
def zadachs():
    ask='Введите желаемый номер пункта (1 - просмотр текущих задач, 2 - запись новых задач, 3 - удаление существующей задачи, 4 - выход из программы): '
    vopros1='Напишите здесь Вашу новую задачу: '
    vopros2='Введите задачу, которую вы хотите удалить: '
    while True:
        b=input(ask)
        try:
            b=int(b)
        except ValueError:
            print("Введите номер пункта")
            continue
        if b==4:
            break
        if b==1:
            with open(r'C:\Users\username\test\zadachi.txt', 'r') as f:
                zd=f.read()
                print(zd)
                if len(zd)==0:
                    print("На текущий момент задач нет")
        elif b==2:
            zadacha = input (vopros1)
            with open(r'C:\Users\username\test\zadachi.txt', 'a') as f:
                f.write('\n' + zadacha)
        elif b==3:
            dell = input (vopros2)
            f=open(r'C:\Users\username\test\zadachi.txt', 'r')
            lines=f.readlines()
            f.close()
            f=open(r'C:\Users\username\test\zadachi.txt', 'w')
            f.truncate()
            for line in lines:
                if line != dell + '\n':
                    f.write(line)
            f.close()
        else:
            print('Такого пункта нет')

zadachs()
</code>

Когда у вас в файле остается одна строка, которую нужно удалить, ваш код ничего не записывает в файл, поэтому исходное его содержимое не удаляется (если записать что-то в файл открытый в режиме
'w', то файл будет очищен автоматически, но если ничего не записать, то очистка не произойдет). Можно принудительно очищать файл перед записью в него с помощью метода
truncate(). Также, у последней строки в файле не будет символа
'\n' в конце, поэтому нужно наоборот обрезать символ переноса строки (
.rstrip('\n')) и сравнивать строки без него:

f=open(r'C:\Users\username\test\zadachi.txt', 'w')
f.truncate()  # Обрезать все содержимое файла, идущее после текущей позиции
for line in lines:
    if line.rstrip('\n') != dell:
        f.write(line)
f.close()


Как конвертировать строку в словарь?
У меня есть функция которая обращается к Outline VPN серверу и возвращает кол-во байтов трафика использованного каждым ключом.

def get_traf(api_url):
    headers = {'Content-Type': "application/json"}
    url = api_url + "metrics/transfer"
    numofbytes = requests.get(url, headers=headers, verify=False)
    return numofbytes

Пример вывода у функции:

{"bytesTransferredByUserId":{"0":8438180}}

Когда я попытался вывести в консоль этим методом:

traf = get_traf(api_url).text
print(traf.get("bytesTransferredByUserId")

Оказалось что это не словарь, а обычная строка и я получил эту ошибку:

AttributeError: 'str' object has no attribute 'get'

Есть ли в Python способы конвертации строки в словарь?

Сервис в данном случае возвращает json-строку. Для декодирования json в объект Python у результата запроса есть метод
json():

response = requests.get(url, headers=headers, verify=False)
numofbytes = response.json()

Это аналогично декодированию текста результата запроса с помощью
json.loads:

import json

response = requests.get(url, headers=headers, verify=False)
numofbytes = json.loads(response.text)

В документации также советуют перед вызовом
.json() проверять код статус ответа (например, по условию
response.status == 200 или выбрасыванием исключения
response.raise_for_status()), т.к. успешное выполнение метода
json() не гарантирует, что пришел ответ с правильным статусом.


Пустой вывод Django
Учусь работать с отношениями в Django.
Добавил данные в БД, но при запросе ничего не выводит
Template:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test</title>
</head>
<body>
<ul class="list-group">
    {% for i in employee_list.positions.all %}
        {{ i.fullname }}
    {% endfor %}
</ul>
</body>
</html>

Модель:

from django.db import models

# Create your models here.

class Position(models.Model):
    title = models.CharField(max_length=60)

class Employee(models.Model):
    fullname = models.CharField(max_length=60)
    position = models.ManyToManyField(Position, related_name='positions')
    wage_rate = models.SmallIntegerField(max_length=30)
    start_date = models.DateTimeField(auto_now=True)
    chief = models.ManyToManyField('self', related_name='children', null=True, blank=True)

    def __str__(self):
        return self.fullname

    class Meta:
        verbose_name = 'Работник'
        verbose_name_plural = 'Работники'

views

from django.shortcuts import render

# Create your views here.
from django.views.generic import DetailView, ListView
from .models import Employee, Position

class EmployeeView(ListView):
    model = Employee

class PositionView(ListView):
    model = Position

Как это решить и почему так происходит?

views:

from django.shortcuts import render
# Create your views here.
from django.views.generic import DetailView, ListView
from .models import Employee, Position

def employee_view(request):
    all = Employee.objects.all()
    context = { "all": all }
return render(request, 'path_to_template/template' , context)

template :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test</title>
</head>
<body>
<ul class="list-group">
    {% for i in all %}
        {{ i.fullname }}
        {{ i.position}}
    {% endfor %}
</ul>
</body>
</html>

Должно сработать, но я не проверял


Насколько безопасно использовать постоянное соединение с PostgreSQL?
Пишу web-приложение на python. Использую асинхронный PostgreSQL -
asyncpg.
Приложение и база данных находятся на одном сервере. Вопрос: насколько безопасно использовать постоянное соединения с БД? Может ли оно отвалится каким-то образом? Может ли PostgreSQL закрыть его по какой-либо причине? Просто если соединение отваливается, то всё приложение перестаёт работать

Отвалиться может, СУБД закрыть его может, но держать соединение всё равно стоит. Если вы используете пул соединений, то библиотека сама позаботится о доступности соединения.


Не понимаю, каким образом проводится сортировка по ключу key=lambda x: a[x]
Нашел в интернете решение задания с codewars и адаптировал под свой код. Сидел разбирался и никак не могу понять, как работает сортировка в предпоследней строке, можете объяснить, пожалуйста?)
<code>
def howmany(x, i):
    return sum(map(lambda x: 1 if i in x else 0, x))

def mix(s1, s2):
    a={}
    for i in "abcdefghijklmnopqrstuvwxyz":
        s11 = howmany(s1, i)
        s22 = howmany(s2, i)
        if s11 > s22:
            if s11>1:
                a[i] = -s11,("1:"+i*s11)
        elif s11 < s22:
            if s22>1:
                a[i] = -s22,("2:"+i*s22)
        elif s11 == s22:
            if s11>1:
                a[i] = -s11,("=:"+i*s11)
    return "/".join(a[i][1] for i in sorted(a, key=lambda x: a[x]))

print(mix("Are they here", "yes, they are here"))
</code>
На выходе получается : "2:eeeee/2:yy/=:hh/=:rr"

sorted(a, key=lambda x: a[x])

a - это словарь, значит,
sorted() возвращает упорядоченный список его ключей.
Но он будет упорядоченный не для ключей (переменная
x в функции
lambda x: a[x]), а для значений этих ключей (
а[x] в функции
lambda x: a[x]).


Фоновые синхронные задачи
Почему фоновые таски не асинхронные? Пример
<code>
from fastapi import BackgroundTasks, FastAPI

app = FastAPI()

def write_notification(email: str, message=""):
    with open("log.txt", mode="w") as email_file:
        content = f"notification for {email}: {message}"
        email_file.write(content)

@app.post("/send-notification/{email}")
async def send_notification(email: str, background_tasks: BackgroundTasks):
    background_tasks.add_task(write_notification, email, message="some notification")
    return {"message": "Notification sent in the background"}
</code>
В примере выше есть задача, которая является синхронной функцией. Как фоновая задача может быть синхронной?

В исходниках видно, что fastapi, в зависимости от того: синхронная функция или нет, -- решает делать над ней декоратор или не делать его.
<code>
import asyncio
import typing

from starlette.concurrency import run_in_threadpool

class BackgroundTask:
    def __init__(
        self, func: typing.Callable, *args: typing.Any, **kwargs: typing.Any
    ) -> None:
        self.func = func
        self.args = args
        self.kwargs = kwargs
        self.is_async = asyncio.iscoroutinefunction(func)

    async def __call__(self) -> None:
        if self.is_async:
            await self.func(*self.args, **self.kwargs)
        else:
            await run_in_threadpool(self.func, *self.args, **self.kwargs)

class BackgroundTasks(BackgroundTask):
    def __init__(self, tasks: typing.Sequence[BackgroundTask] = []):
        self.tasks = list(tasks)

    def add_task(
        self, func: typing.Callable, *args: typing.Any, **kwargs: typing.Any
    ) -> None:
        task = BackgroundTask(func, *args, **kwargs)
        self.tasks.append(task)

    async def __call__(self) -> None:
        for task in self.tasks:
            await task()
</code>


Доступ к связанным моделям в django
Имеется три модели

набор типовых мероприятий
фото к мероприятию в наборе
мероприятия

class EventsStack(models.Model):
    """Набор мероприятий(заготовок)"""
    name = models.CharField("Название мероприятия", max_length=255)
    description = models.TextField("Описание мероприятия")

class EventsPhoto(models.Model):
    title = models.CharField("Заголовок", max_length=120)
    description = models.TextField("Описание")
    image = models.ImageField("Изображение", upload_to="events_photo/")
    event = models.ForeignKey(EventsStack, related_name='images', verbose_name="Мероприятие", on_delete=models.CASCADE)

class Events(models.Model):
    """События/мероприятия"""
    type = models.ForeignKey(EventsStack, on_delete=models.SET_NULL, verbose_name="event_type_id", null=True)
    date = models.DateTimeField("Дата и время")

В
views.py выделяю мероприятия так:
events = Events.objects.filter(date__gte = date.today())[0:12]
Как мне в шаблонизаторе вставить соответсвующие картинки?
Мне видится, что надо идти по логике
Events->EventsStack->EventsPhoto
Шаблонизатор:

{% for event in events %}
                <div class="event-block">
                        <div class="event-header">
                            <p class="event-title">
                                {{ event.type.name }}
                            </p>
                        </div>
                    <div class="event-image-block">
                        {% for photo in ?????? %}
                            <img src="{{ photo.image.url }}" alt="{{ photo.title }}" class="event-image">
                        {% endfor %}
                    </div>
                </div>
                {% endfor %}

Вы можете обратиться к
EventsPhoto через
related_name.
Пример:

{% for photo in event.type.images.all %}


Как решить проблему MemoryError при считывании больших Excel файлов?
При считывании методом
read_excel() появляется ошибка:

MemoryError: unable to allocate 32.1 mib for an array with shape (10081, 834) and data type object

Работаю с очень большими файлами Excel формата. Есть несколько листов, в каждом по 8к строк и около 1к столбцов. Нужно все конвертировать в один CSV файл. Изначально планировал считывать каждый лист в отдельный DataFrame, а после - соединить их все в один и записать его в CSV файл, но столкнулся с ошибкой выше.

NOTE: судя по тому, что вы хотите писасть несколько листов Excel файла в единственный CSV файл, в решении я буду исходить из того, что во всех листах совпадают имена столбцов.
Пример функции, которая читает по кускам (размер куска управляется параметром
chunksize) все листы Excel файла и сохраняет результат в CSV файл:

import pandas as pd

def excel_to_csv(excel_fn, csv_fn, chunksize=1000, **to_csv_kw):
    ef = pd.ExcelFile(excel_fn)
    cols = ef.parse(nrows=10).columns
    # write to CSV column names ONLY (we do it once!)
    pd.DataFrame([], columns=cols).to_csv(csv_fn, index=False, **to_csv_kw)
    for sheet in ef.sheet_names:
        rows_read = 0
        while True:
            df = ef.parse(
                    sheet_name=sheet,
                    skiprows=1+rows_read,
                    nrows=chunksize,
                    header=None,
                    names=cols)
            df.to_csv(csv_fn, index=False, header=None,
                      mode="a", **to_csv_kw)
            rows_read += len(df)
            if len(df) < chunksize:
                break

Примеры вызова:

excel_to_csv(r"c:\download\file.xlsx", r"c:\temp\out.csv", chunksize=2000, sep=";")


Разложить число на байты, для передачи по smbus
Есть число, например 1234. Мне его необходимо разбить на два байта и передать их на другое устройство.
Я пытаюсь разложить так:
<code>
number = 1234
bus.write_byte(address, (number >> 8))
bus.write_byte(address, (number & 0xff))
</code>
Что я делаю не так? Подобный код, но на языке С, работает корректно.

С виду всё работает правильно.

number = 1234
print(hex(number), hex(number >> 8), hex(number & 0xff))

Вывод:

0x4d2 0x4 0xd2