docs(data): 补齐 io 两个函数的 Parameters 与 Raises

按 docs/02-architecture.md §4.7,每个公开函数都要写全 Parameters 与 Raises,
格式对齐参考实现 core/random.py 的 get_rng。

- docstring 由 Codex 代写(本轮用户明确授权);函数体逻辑由用户本人改
- load_table:返回注解 Any -> pd.DataFrame,与 docstring 的承诺对齐;
  写明 FileNotFoundError / ValueError / ImportError 各自在什么情况下抛
- save_table:写明 TypeError / ValueError / ImportError;
  并把 isinstance(df, pd.DataFrame) 校验挪到 mkdir 之前
- 两套环境 pytest 均 39 passed / 44 skipped,ruff All checks passed
This commit is contained in:
guzhujushi committed 2026-10-01 23:22:40 +08:00
1 parent 49fd84a2df
commit 19f4a15107
3 files changed
+55 -11

No files matched your search

+46 -4
View File
@@ -14,8 +14,7 @@ import pandas as pd
__all__ = ["load_table", "save_table"]
def load_table(path: str | Path, **kwargs: Any) -> Any:
def load_table(path: str | Path, **kwargs: Any) -> pd.DataFrame:
"""按扩展名自动选择读取方式,返回 DataFrame。
约定:
@@ -24,6 +23,27 @@ def load_table(path: str | Path, **kwargs: Any) -> Any:
* `.xlsx` / `.xls` 需要 `openpyxl`(`pip install "mcm-toolkit[excel]"`);
* `na_values` 默认包含空串、`"NA"`、`"N/A"`、`"#N/A"`、`"null"`、`"-"`。
Parameters
----------
path:
文件路径。扩展名决定用哪个读取器,大小写不敏感。
**kwargs:
原样转交给 `pandas.read_csv` / `pandas.read_excel`。
`.csv` 传了 `encoding=` 就照办,不再探测;不传则按上面的顺序逐个试。
Raises
------
FileNotFoundError
文件不存在。`.csv` 的自动探测分支会把原始路径包进中文提示里。
ValueError
后缀不在 `.csv` / `.xlsx` / `.xls` 里;
`.csv` 在候选编码下全部解码失败;
或 pandas 自身的解析错误(`pandas.errors.ParserError` 也是 `ValueError` 的子类,
报错信息原样抛出——它比转述的更有用)。
ImportError
`.xlsx` / `.xls` 但缺可选依赖(`openpyxl`,读旧 `.xls` 另需 `xlrd`),
见 docs/02-architecture.md §4.6:可选依赖的报错必须能直接看懂。
Examples
--------
>>> df = load_table("data.csv") # doctest: +SKIP
@@ -52,14 +72,36 @@ def load_table(path: str | Path, **kwargs: Any) -> Any:
def save_table(df: pd.DataFrame, path: str | Path, index: bool = False, **kwargs: Any) -> Path:
"""保存 DataFrame,返回实际写入的路径。"""
"""保存 DataFrame,返回实际写入的路径。
Parameters
----------
df:
要写出的表。必须是 `pandas.DataFrame`——`Series` 也不行,先 `.to_frame()`。
path:
目标路径。扩展名决定用哪个写入器,大小写不敏感;父目录不存在时自动创建。
index:
是否把行索引一并写进文件,默认 `False`。
**kwargs:
原样转交给 `pandas.DataFrame.to_csv` / `to_excel`。
Raises
------
TypeError
`df` 不是 `pandas.DataFrame`。
ValueError
后缀不在 `.csv` / `.xlsx` / `.xls` 里。
ImportError
写 `.xlsx` / `.xls` 但缺 `openpyxl`。
"""
path = Path(path)
path.parent.mkdir(parents=True,exist_ok=True)
suffix = path.suffix.lower()
if not isinstance(df,pd.DataFrame):
raise TypeError(f"df 必须是一个pandas DataFrame,但是你上传了{type(df)}")
path.parent.mkdir(parents=True,exist_ok=True)
if suffix == '.csv':
df.to_csv(path,index=index,**kwargs)
elif suffix in ['.xlsx','.xls']: