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:
1 parent
49fd84a2df
commit
19f4a15107
3 files changed
+55
-11
No files matched your search
@@ -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']:
|
||||
|
||||
Reference in new issue
Block a user