41 lines
1.8 KiB
Python
41 lines
1.8 KiB
Python
import os
|
||
from io import BytesIO
|
||
import pandas as pd
|
||
from dotenv import load_dotenv
|
||
from synology_drive_api.drive import SynologyDrive
|
||
from synology_drive_api.base import SynologyException
|
||
|
||
load_dotenv()
|
||
|
||
SYNO_HOST = os.getenv("SYNO_BASE_URL", "").strip() # без схемы! например: "nas.example.com"
|
||
SYNO_USERNAME = os.getenv("SYNO_USERNAME", "")
|
||
SYNO_PASSWORD = os.getenv("SYNO_PASSWORD", "")
|
||
SYNO_PORT = int(os.getenv("SYNO_PORT", "5001"))
|
||
|
||
def load_osheet(file_path: str, sheet: str | int = 0) -> pd.DataFrame:
|
||
"""
|
||
Скачивает Synology Office .osheet через Drive API (делает экспорт в xlsx под капотом)
|
||
и возвращает pandas.DataFrame для указанного листа.
|
||
file_path: путь вида '/GFX/…/MATCH.osheet' (шара должна быть Team Folder в Drive).
|
||
"""
|
||
|
||
drv = SynologyDrive(SYNO_USERNAME, SYNO_PASSWORD, SYNO_HOST, SYNO_PORT, https=True, dsm_version="7")
|
||
try:
|
||
# вернёт BytesIO c xlsx
|
||
bio = drv.download_synology_office_file(file_path)
|
||
df = pd.read_excel(bio, sheet_name=sheet)
|
||
return df
|
||
except SynologyException as e:
|
||
# Часто: {"code":1000,"message":"get file information failed"} — Drive не видит путь (нет Team Folder/прав)
|
||
raise RuntimeError(
|
||
"Не удалось экспортировать .osheet через Synology Drive. "
|
||
"Проверь, что шара включена в Drive Admin Console → Team Folder, "
|
||
"и у пользователя есть права. Исходная ошибка: " + str(e)
|
||
)
|
||
finally:
|
||
try:
|
||
drv.logout()
|
||
except Exception:
|
||
pass
|
||
|
||
load_osheet(file_path="/GFX/Hockey/KHL/Soft/MATCH.osheet", sheet="TEAMS") |