FileNotFoundError: [Errno 2] No such file or directory: '/data/tables/РасписаниеФКН_ осенний семестр 2024-2025 (2).xlsx' if i run run.py. if i run tables.py its working
tables.py:
import datetime
from os.path import split

from openpyxl.cell import MergedCell
from openpyxl.worksheet.worksheet import Worksheet
import openpyxl

from data import config



def get_sheet_rasp():
    wb = openpyxl.load_workbook(
        r"/data/tables/РасписаниеФКН_ осенний семестр 2024-2025 (2).xlsx")
    sheet = wb.worksheets[0]
    return sheet
print(get_sheet_rasp())

def get_dict():
    sheet = get_sheet_rasp()
    a = dict()
    for i in range(3, sheet.max_column):
        group = parser_merged_cell(sheet, 1, i)
        sub_group = parser_merged_cell(sheet, 2, i)
        item = parser_merged_cell(sheet, 3, i)
        profile = parser_merged_cell(sheet, 4, i) if parser_merged_cell(sheet, 4, i) not in [None,
                                                                                             ""] else "Профиля нет."

        a.setdefault(group, {}).setdefault(sub_group, {})[item] = profile

    return a


def get_schedule_by_column_week_day_of_week(column, week, day_of_week):
    sheet= get_sheet_rasp()
    day_of_week = str(day_of_week)

    # Читаем данные из первого столбца sheetRasp с учетом объединённых ячеек
    dataRasp = get_schedule()

    # Информация о группе (первые 4 строки)
    dataOfGroup = []
    for i in range(1, 5):
        time_data = str(dataRasp[i - 1]) if i - 1 < len(dataRasp) and dataRasp[i - 1] is not None else ""
        cell_value = parser_merged_cell(sheet, row=i, col=column)
        value_str = str(cell_value).replace("\n", "") if cell_value is not None else ""
        dataOfGroup.append([time_data, value_str])

    # Расписание (начиная с 5-й строки)
    dataOfShedule = []
    for i in range(5, sheet.max_row + 1):
        time_data = str(dataRasp[i - 1]) if i - 1 < len(dataRasp) and dataRasp[i - 1] is not None else ""
        cell_value = parser_merged_cell(sheet, row=i, col=column)
        if cell_value is not None:
            value_str = str(cell_value).replace("\n", "")
            dataOfShedule.append([time_data, value_str])

    # Фильтрация расписания по дню недели и четности недели
    returned = []
    for time_data, schedule_entry in dataOfShedule:
        time_parts = time_data.split()
        if len(time_parts) >= 3 and time_parts[0] == day_of_week and time_parts[2] == week:
            returned.append([time_data, schedule_entry])

    return dataOfGroup, returned


def parser_merged_cell(sheet: openpyxl.worksheet.worksheet.Worksheet, row, col):
    cell = sheet.cell(row=row, column=col)
    if isinstance(cell, MergedCell):
        for merged_range in sheet.merged_cells.ranges:
            if cell.coordinate in merged_range:
                cell = sheet.cell(row=merged_range.min_row, column=merged_range.min_col)
                break
    return cell.value


def generate_schedule_of_time():
    sheet = get_sheet_rasp()
    dataShedule = ["Курс", "Группа", "Направление", "Профиль"]
    para = 1
    chOrZn = "Числитель"
    for i in range(5, sheet.max_row):
        if not (parser_merged_cell(sheet, i, 1) is None or parser_merged_cell(sheet, i, 2) is None):
            dataShedule.append(
                f"{parser_merged_cell(sheet, i, 1)} {para} {chOrZn} {parser_merged_cell(sheet, i, 2).replace(' ', '')}")
            if chOrZn == "Знаменатель":
                para += 1
                chOrZn = "Числитель"
            else:
                chOrZn = "Знаменатель"

        else:
            para = 1
            chOrZn = "Числитель"
            dataShedule.append("0")

    with open("../data/schedule", "w", encoding="utf-8") as f:
        f.write("\n".join(dataShedule))


def get_schedule():
    return list(i.replace("\n", "") for i in open("../data/schedule", "r", encoding="utf-8").readlines())


def get_column_by_course_group_subgroup(course, group, subgroup):
    sheet = get_sheet_rasp()
    data = []
    for col in range(1, sheet.max_column + 1):
        # Получаем значения ячеек с учётом объединения
        cell_course = parser_merged_cell(sheet, 1, col)
        cell_group = parser_merged_cell(sheet, 2, col)

        # Проверяем соответствие курса и группы
        if cell_course == course and cell_group == group:
            data.append(col)

    # Возвращаем колонку в зависимости от подгруппы
    if subgroup == "1 подгруппа":
        return data[0] if data else None
    elif subgroup == "2 подгруппа":
        return data[1] if len(data) > 1 else None
    else:
        return None

main.py:

import asyncio
import sys
from os import getenv

import logging
from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.types import Message
from dotenv import load_dotenv
from app.handlers import router

load_dotenv()
TOKEN = getenv("BOT_TOKEN")

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


async def main():
    dp.include_router(router)
    await dp.start_polling(bot)


if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)
    asyncio.run(main())