def read_lines_in_range(f, ifrom: int, ito: int) -> list[str]:
f.seek(0)
for i in range(ifrom):
f.readline()
return [f.readline() for i in range(ito-ifrom)]
import math
z = float(input('Z = ')) # например, 10
logz = math.log(z, 2) # 10 находится между 2**3 и 2**4, так что logz будет 3 с копейками (но меньше 4)
pwr = int(logz) # отбрасываем дробную часть, получаем 3
value = 2 ** pwr # ближайшее меньшее значение - 2 ** 3
quoting: optional constant from csv module
Defaults to csv.QUOTE_MINIMAL. If you have set a float_format then floats are converted to strings and thus csv.QUOTE_NONNUMERIC will treat them as non-numeric.
import pathlib # стандартный модуль питона. Очень советую его освоить!
import sys
# путь к папке скрипта, например, C:\myscript
script_dir = pathlib.Path(sys.argv[0]).parent
# путь к файлу собирается из частей вот так
user_file = script_dir / "some_folder" / "user_file" # C:\myscript\some_folder\user_file
# обрати внимание, мы не паримся по поводу того, что
# под виндой разделитель каталогов \, а под линуксом /
# это уже забота pathlib
with user_file.open('w+') as f:
pass # делаешь что тебе нужно с файлом
# через функцию open() тоже сработает, метод open() просто для удобства
with open(user_file, 'w+') as f:
pass # делаешь что тебе нужно с файлом
GotoIfTime\((?P<from>\d+:\d+)-(?P<to>\d+:\d+),(?P<days>[a-z-]+),\*,\*\?open,s,1\)
извлечёт из строки нужные части. Их можно будет вытащить так:regexp = re.compile(r'GotoIfTime\((?P<from>\d+:\d+)-(?P<to>\d+:\d+),(?P<days>[a-z-]+),\*,\*\?open,s,1\)', re.I)
m = regexp.match('GotoIfTime(09:00-17:59,mon-fri,*,*?open,s,1)')
if m:
print(m.group('days'), m.group('from'), m.group('to'))
now = datetime.datetime.now()
weekday = now.weekday()
days = m.group('days').lower()
days_of_week = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] # datetime.datetime.weekday()
if '-' in days: # диапазон
dfrom, _, dto = days.partition('-')
dfrom, dto = days_of_week.index(dfrom), days_of_week.index(dto)
if dfrom <= dto: # обычный кейс, вроде mon-fri
day_is_good = dfrom <= weekday <= dto
else: # на случае если нужно зацикливание вида fri-tue
day_is_good = (weekday >= dfrom) or (weekday <= dto)
else: # один день, не диапазон
dow = days_of_week.index(days)
day_is_good = weekday == dow
print(day_is_good) # True или False
datetime.datetime.now().replace(hour=h, minute=m)
и получаешь указанное время в текущий день.if from <= now <= to:
async def choice_cat(message):
CATs = cur.execute(f'SELECT name FROM cathlete WHERE id = "{message.from_user.id}"').fetchall()
for fds in range(len(CATs)):
astt = ReplyKeyboardMarkup(resize_keyboard=True).add(KeyboardButton(f"CATs[{fds}]"))
kbd = ReplyKeyboardMarkup(resize_keyboard=True)
btns = cur.execute(f'SELECT name FROM cathlete WHERE id = ?', (message.from_user.id,)).fetchall()
# btns - список списков.
if not btns:
# кнопки не предусмотрены, как-то даём пользователю знать об этом
return # если это фатально, останавливаемся тут
# иначе создаём какое-то значение btns по умолчанию и продолжаем
# тут уж сам решай
# делаем клавиатуру
for btn in btns:
kbd.add(KeyboardButton(btn[0]))
# ну и отправляем её вместе с сообщением