62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
|
|
"""
|
|||
|
|
CSV 数据连接器
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import pandas as pd
|
|||
|
|
from pathlib import Path
|
|||
|
|
from ppt_station.connectors.base import BaseConnector, ConnectorFactory
|
|||
|
|
from ppt_station.models.job import DataSource
|
|||
|
|
from ppt_station.config import settings
|
|||
|
|
|
|||
|
|
|
|||
|
|
class CsvConnector(BaseConnector):
|
|||
|
|
"""CSV 文件连接器"""
|
|||
|
|
|
|||
|
|
def load(self, spec: DataSource) -> pd.DataFrame:
|
|||
|
|
"""从 CSV 文件加载数据"""
|
|||
|
|
if not spec.path:
|
|||
|
|
raise ValueError("CSV connector requires 'path' parameter")
|
|||
|
|
|
|||
|
|
# 支持相对路径和绝对路径(相对路径优先 CWD,回退 data_dir)
|
|||
|
|
file_path = Path(spec.path)
|
|||
|
|
if not file_path.is_absolute():
|
|||
|
|
cwd_path = Path.cwd() / file_path
|
|||
|
|
if cwd_path.exists():
|
|||
|
|
file_path = cwd_path
|
|||
|
|
else:
|
|||
|
|
file_path = settings.data_dir / file_path
|
|||
|
|
|
|||
|
|
if not file_path.exists():
|
|||
|
|
raise FileNotFoundError(f"CSV file not found: {file_path}")
|
|||
|
|
|
|||
|
|
return pd.read_csv(file_path, encoding=spec.encoding or "utf-8")
|
|||
|
|
|
|||
|
|
|
|||
|
|
class XlsxConnector(BaseConnector):
|
|||
|
|
"""Excel 文件连接器"""
|
|||
|
|
|
|||
|
|
def load(self, spec: DataSource) -> pd.DataFrame:
|
|||
|
|
"""从 Excel 文件加载数据"""
|
|||
|
|
if not spec.path:
|
|||
|
|
raise ValueError("XLSX connector requires 'path' parameter")
|
|||
|
|
|
|||
|
|
# 相对路径优先 CWD,回退 data_dir
|
|||
|
|
file_path = Path(spec.path)
|
|||
|
|
if not file_path.is_absolute():
|
|||
|
|
cwd_path = Path.cwd() / file_path
|
|||
|
|
if cwd_path.exists():
|
|||
|
|
file_path = cwd_path
|
|||
|
|
else:
|
|||
|
|
file_path = settings.data_dir / file_path
|
|||
|
|
|
|||
|
|
if not file_path.exists():
|
|||
|
|
raise FileNotFoundError(f"Excel file not found: {file_path}")
|
|||
|
|
|
|||
|
|
return pd.read_excel(file_path, sheet_name=spec.sheet_name or 0)
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 注册连接器
|
|||
|
|
ConnectorFactory.register("csv", CsvConnector)
|
|||
|
|
ConnectorFactory.register("xlsx", XlsxConnector)
|
|||
|
|
|