OSError: dlopen(opus, 0x0006): tried: 'opus' (no such file), '/usr/local/lib/opus' (no such file), '/usr/lib/opus' (no such file), '/Users/similization/Programming/python/discord_bot/opus' (no such file)
c
в строке построй список вида [c.upper(), c.lower()]
, если это буква. Если не буква, список должен содержать один элемент.[['a', 'A'], ['.'], ['b', 'B'], ['c', 'C'], ['@'], ['d', 'D']]
itertools.product(*patterns)
и итерируешься по тому, что оно вернёт. all_lessons = []
, куда будем складывать результат.for lesson in data:
можно будет перебрать уроки.[
[['6']], # индекс 0 - номер урока (почему-то в двух списках)
[], #индекс 1 - понедельник
[['Физкультура'], ['Храпов О.Е.'], ['12:05 - 12:45'], ['216']], #индекс 2 - вторник
[['Иностранный ...'], ['Севостьянова Е....'], ['12:05 - 12:45'], ['047']], #индекс 3 - среда
[['Физкультура'], ['Храпов О.Е.'], ['12:05 - 12:45'], ['216']], #индекс 4 - четверг
[], #индекс 5 - пятница
[], #индекс 6 - суббота?
[], #индекс 7 - ?
[] #индекс 8 - ?
],
lesson[0][0]
.for day_number in range(1, 7): #1 - понедельник
lesson_per_day = lesson[day_number]
[
['Технология'], #0 - что
['Бирюкова Е.Н.'], # 1 - кто
['16:15 - 16:55'], # 2 - когда
['133'], # 3 - где
['Технология'], #4 - что (альтернатива)
['Горбунова Е.П.'], # 5 - кто (альтернатива)
['16:15 - 16:55'], # 6 - когда (альтернатива)
['048'] # 7 - где (альтернатива)
]
if len(lesson_per_day) == 4: # есть одно занятие?
all_lessons.append({
'number': int(lesson[0][0]),
'day': day_number,
'subject': lesson_per_day[0],
'teacher': lesson_per_day[1],
'time': lesson_per_day[2],
'room': lesson_per_day[3],
'type': '' # занятие не над/под чертой
})
elif len(lesson_per_day) == 8: # есть два занятия?
all_lessons.append({
'number': int(lesson[0][0]),
'day': day_number,
'subject': lesson_per_day[0],
'teacher': lesson_per_day[1],
'time': lesson_per_day[2],
'room': lesson_per_day[3],
'type': 'над чертой'
})
all_lessons.append({
'number': int(lesson[0][0]),
'day': day_number,
'subject': lesson_per_day[4],
'teacher': lesson_per_day[5],
'time': lesson_per_day[6],
'room': lesson_per_day[7],
'type': 'под чертой'
})
[
{'number': 6, 'daynumber': 1, 'subject': 'Физкультура', 'teacher': 'Храпов О.Е.', 'time': '12:05 - 12:45', 'room': '216', type: ''},
{..................},
.....................
]
# -*- coding: windows-1251 -*-
#сначала реализуем механизм, который позволяет получать объект дневник для пользователя
import typing
from functools import lru_cache
# говорим, что результаты вызова функции должны кэшироваться,
# но храниться в кэше должно не более 50 экземпляров класса Dnevnik
# при появлении новых экземпляров, самые старые будут выкинуты
@lru_cache(maxsize=50)
# принимаем ID пользователя Telegram, возвращаем или объект Dnevnik, или None
def get_user_dnevnik(user_id) -> typing.Optional[Dnevnik]:
# получаешь новый курсор для своего соединения с БД
# я фз как у тебя называется глобальная переменная, хранящая соединение,
# так что назвал её db_conn. Поправишь
cursor = db_conn.cursor()
# выбираем из таблицы логинов/паролей пару, соответствующую указанному пользователю
# имена таблицы и столбцов опять таки поправь, я не помню как они у тебя называются
cursor.execute("SELECT loginD, passwordD FROM users WHERE id = ?", (user_id,))
row = cursor.fetchone()
if row is None: # нет такого пользователя, возвращаем None
return None
# в запросе порядок столбцов сначала логин, потом пароль, так что row = (логин, пароль)
return Dnevnik(login=row[0], password=row[1]) # возвращаем объект Dnevnik
from html.parser import HTMLParser
bufer = '''<p>
<div>hi!
</p>'''
class MyHTMLParser(HTMLParser):
def __init__(self):
super().__init__()
self.open_tags = []
def handle_starttag(self, tag, attrs):
print("Start tag:", tag)
self.open_tags.append((tag, self.getpos()))
def handle_endtag(self, tag):
print("End tag :", tag)
unclosed_tags = []
# ищем, когда был открыт нужный тег
for i in range(len(self.open_tags)-1, -1, -1):
if self.open_tags[i][0] != tag:
unclosed_tags.append(self.open_tags[i])
else:
break
if len(unclosed_tags) == len(self.open_tags): # тег никогда и не был открыт
print(f"Closing tag {tag} has no matching opening tag!")
elif unclosed_tags: # тег был открыт, но он не последний
print("Following tags are not closed properly:\n", '\n'.join(f' {t} at line {line} pos {col+1}' for t,(line, col) in unclosed_tags))
del self.open_tags[-len(unclosed_tags)+1:] # сбрасываем незакрытые теги
else: # тег был открыт, и он последний - всё в порядке
del self.open_tags[-1]
def close(self):
super().close()
print('Processing done')
parser = MyHTMLParser()
parser.feed(bufer)
parser.close()
for row in records:
loginD = row[2]
passwordD = row[3]
d = Dnevnik(login=loginD, password=passwordD)
Если я комментирую импорт "from handlers import enter_client", в файле админа, то всё запускается, но естественно, функция работать не будет
Если я комментирую импорт "from handlers import enter_admin", в файле клиент, то не работает, ссылаясь на ошибку (ImportError: cannot import name 'enter_client' from partially initialized module 'handlers')
Сейчас далеко не 90е, и на большинстве страниц полно JS-скриптов. Они, в том числе, могут делать фоновые (без перезагрузки страницы) запросы по ходу работы сайта. Так, например, реализуется "бесконечная лента" - по достижению низа страницы делается фоновый запрос, и новый контент подставляется вниз.
Некоторые сайты на этом вообще целиком построены - отдают основным запросом только болванку, а содержимое туда подсовывают фоновыми запросами. Как следствие, то, что ты выкачиваешь через requests, и то, что увидит пользователь в браузере - две большие разницы.
Соответственно, тут нужно:
1. Идентифицировать, какие фоновые запросы делает сайт. Инструменты разработчика в браузере в помощь.
2. Определить, какие из этих запросов подгружают нужную тебе информацию, и в каком виде она представлена. Нередко там не HTML-разметка, а формат JSON, с которым куда проще работать.
3. Определить, что нужно для выполнения этих запросов: какие URL дёргать, какие параметры подставлять, и т.д.
4. Попробовать имитировать только эти запросы.
Успех зависит от сайта, многие пытаются защищаться от такого, кто во что горазд.
Альтернативный вариант - использовать безголовый браузер. Но там своя гора проблем: это куда более ресурсоёмко, нужно дождаться полной прогрузки сайта, API для поиска там тоже своё. Так что я бы переходил к этому варианту только если имитировать запросы самому не вышло.
nun[1]+=i
possible.append(nun)
nun[1]-=i
b = []
a = [1, 2, 3]
b.append(a)
b.append(a.copy())
a.append(5)
print(b) # выведет [[1, 2, 3, 5], [1, 2, 3]]
print(b[0] is a) # выведет True, так как 0 элемент b - ссылка на a
print(b[1] is a) # выведет False, так как 1 элемент b - ссылка на отдельный список