xlsx 转 CSV 后 LLM 仍读不了?让 Codex 走 TaoToken 通道查 pandas 导出 📅 发布时间:2026/9/20 16:35:09 👁 浏览次数: 1. 数模现场xlsx 转 CSV 后 LLM 仍读不了卡点往往不在转换本身xlsx 转 CSV 后 LLM 仍读不了是数模比赛里很典型的一类排障问题脚本明明跑通了终端打印出一串 sheet 名目录里也确实多了几个 csv可你把文件交给编辑器里的模型它要么说找不到文件要么读出来一列乱码要么列名和你在 Excel 里看到的完全不是一回事。很多人第一反应是继续折腾 pandas 参数换引擎、加 dtype、改 keep_default_na结果越改越乱。真正的原因通常是四个环节里有一个对不上脚本定位的源路径、f 字符串拼出来的输出文件名、写盘时的编码、空值处理后的类型推断。这篇按排障顺序来写。先把「C题/附件.xlsx」这条链路拆开再用 Codex 走 TaoToken 通道逐段核对脚本和报错让模型告诉你到底是路径、sheet 名、编码还是空值出了问题最后给出可以整段替换的 pandas 导出代码。适合正在用 Cursor 之类工具做数模、手上有一本多 sheet 的 Excel、又不确定问题出在哪一段的人。文中所有命令和配置都可以直接抄唯一需要你自己填的是 TaoToken 的 Key。2. 前置准备让 Codex 走 TaoToken 通道不碰 pandas 逻辑这里先把边界讲清楚避免后面排查时把两件事混在一起。TaoToken 提供的是模型调用通道也就是一个 Base URL 加一个 Key它不会替 pandas 做格式转换也不会帮你读 Excel。所以「xlsx 转 CSV 失败了」这件事最终还是要落在你自己的脚本上Codex 的作用是帮你审这段脚本、读报错、指出哪一行跟你的预期不一致。先去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentconsole 创建 Key。创建完把 Key 复制出来放进环境变量不要写死在脚本里更不要提交到仓库。export TAOTOKEN_API_KEY你的TaoToken Key然后配置 Codex 的模型通道。关键两点Base URL 填https://taotoken.net/api注意后面不要加/v1Key 用 TaoToken 提供的那一个。下面是一个~/.codex/config.toml的写法示例字段含义按官方文档对齐即可具体以接入文档为准model_provider taotoken model 你的模型名 [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY配完之后先别急着把整个数模工程丢进去。正确做法是把「原文脚本 那一段报错 目录树」三样东西一起喂给 Codex问题描述写具体比如「pd.read_excel 读到了 sheetto_csv 之后目录里只有两个 csv但 LLM 读第三个表时报 FileNotFoundError」。描述越像你实际看到的现象Codex 给的定位就越准。接入方式和 Key 管理入口都在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys 参数细节看 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc 。2.1 只改模型通道不改 pandas 版本有个坑我见得太多了为了「让模型能看懂」顺手把 pandas 或 openpyxl 升级了结果数模工程里其他脚本集体报错。正确顺序是先固定环境再单独解决 CSV 的落盘问题。python -c import pandas, openpyxl; print(pandas.__version__, openpyxl.__version__)把版本号记下来之后 Codex 给出的建议如果要求你换版本先想清楚会不会影响别的脚本。排查阶段环境变量里加一句PYTHONHASHSEED0之类的东西没有意义稳定复现比什么都重要。3. 可复制配置pandas 导出脚本与 Codex 检查清单先给一版比原文更稳的导出脚本。它做了四件事用脚本自身所在目录做基准路径、显式指定 openpyxl、把输出目录固定下来而不是随手写到当前工作目录、在写盘时处理 sheet 名里的特殊字符。注意f{name}.csv这一段是原文最容易出问题的地方如果 sheet 名里带/这个 f 字符串会直接生成一个子目录路径写到一半就抛错。import os import re import pandas as pd base os.path.dirname(os.path.abspath(__file__)) src os.path.join(base, C题, 附件.xlsx) out_dir os.path.join(base, C题, csv_out) os.makedirs(out_dir, exist_okTrue) print(源文件存在:, os.path.exists(src), 大小:, os.path.getsize(src)) book pd.ExcelFile(src, engineopenpyxl) print(工作表:, book.sheet_names) sheets pd.read_excel( src, sheet_nameNone, engineopenpyxl, keep_default_naFalse, dtypestr, ) def safe_name(name: str) - str: return re.sub(r[\\/:*?|], _, str(name)).strip() or sheet for name, df in sheets.items(): target os.path.join(out_dir, safe_name(name) .csv) df.fillna().to_csv(target, indexFalse, encodingutf-8-sig) print(写出:, target, df.shape)这段跑起来之后每个表都会落在C题/csv_out/下文件名经过过滤不会再因为 sheet 名里的斜杠跑到别的地方去。utf-8-sig保留 BOM中文列名在编辑器里不会变成问号。keep_default_naFalse配合dtypestr可以让空单元格保持为空字符串而不是变成NaN之后再被推断成浮点列。3.1 交给 Codex 的检查清单提示词把上面脚本和真实报错贴给 Codex 之后用下面这段作为任务描述让它按段核对而不是泛泛地给建议请逐段检查这段 pandas 导出脚本重点核对四件事 1) os.path 定位的 C题/附件.xlsx 是否和实际目录一致给出核对用的 shell 命令 2) f-string 生成的 csv 文件名与 sheet 名是否一致是否可能落到非预期目录 3) encodingutf-8-sig 是否被正确使用中文列名是否会乱码 4) fillna() 之后空值是否仍可能被推断成 NaN 或 float。 请指出让 LLM 读取 CSV 失败的最可能一行并给出按原脚本风格改好的片段。这里刻意不让它「重写整个脚本」而是「指出最可能的一行再给改好的片段」。原因是逐段核对更容易验证真伪如果它说问题在路径你就真去ls一下如果它说问题在编码你就用十六进制看一眼文件头有没有 BOM。Codex 走 TaoToken 通道的价值在于把报错和你脚本里的具体行对应上而不是替你重写一版你读不懂的代码。4. 验证请求用命令行确认 CSV 是否真的能被读在把结论交给模型之前先用 Python 自己验一遍这一步比任何推理都可靠。下面这段会递归扫C题目录下所有 csv打印形状和前几列同时检查文件头三个字节是不是\xef\xbb\xbf。import glob, os import pandas as pd for p in sorted(glob.glob(C题/**/*.csv, recursiveTrue)): with open(p, rb) as f: head f.read(3) try: df pd.read_csv(p, dtypestr, keep_default_naFalse) print(os.path.abspath(p), BOM:, head b\xef\xbb\xbf, shape:, df.shape) print( 列名:, list(df.columns)[:6]) except Exception as e: print(os.path.abspath(p), 读取失败:, type(e).__name__, e)一个成功的输出大概长这样每行都是绝对路径BOM: Trueshape 和你印象中的行列数对得上列名是中文且没有乱码。如果某一行直接抛UnicodeDecodeError说明那个文件不是utf-8-sig如果BOM: False说明写盘时编码参数没生效模型读到的中文就可能出问题如果 shape 的第一维是 1多半是分隔符不对或者被当成了单列。4.1 让 Codex 复述失败点而不是复述你的话验证阶段的问法也要注意。直接把上面那段扫描脚本的输出粘给 Codex然后问「哪个文件最可能导致 LLM 读不了依据是什么」。一个合格的回答会明确指向某个路径并给出依据比如「该文件 BOM 为 False且列名出现\ufffd与其余文件不一致」。如果它只是把你说过的话换个顺序再说一遍那就没有给出增量信息直接换一个更具体的问法比如「只看 BOM 为 False 的那一个文件给出三行修复代码」。模型对话入口在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentchat 验证阶段用它做交叉确认比较顺手不必每次都改本地配置。5. 本篇常见错排查路径、sheet 名、编码、空值下面这张表按现象归类基本能覆盖 xlsx 转 CSV 之后模型仍然读不了的大部分情况。遇到问题时先对号入座再决定要不要动代码。现象常见根因修法报 FileNotFoundErrorC题是相对当前工作目录不是脚本目录用os.path.dirname(os.path.abspath(__file__))做基准目录里只有部分 csvsheet 名含斜杠或冒号f 字符串拼出了非法路径过滤 Windows 非法字符后再拼文件名中文列名乱码写成utf-8而非utf-8-sigto_csv(..., encodingutf-8-sig)空列变成 NaN默认keep_default_naTrueread_excel时加keep_default_naFalse数字被读成科学计数未指定dtypestr读取时dtypestr让下游自己做类型转换多个 sheet 互相覆盖文件名只用了简单的 name重名时后者覆盖前者拼文件名时加序号或加 sheet 索引第一行成了列名的一部分原表有合并表头或说明行read_excel加skiprows显式跳过5.1 路径这一类错先确认你pwd在哪数模工程通常是一个压缩包解压出来的里面还带A题、B题、C题三四个目录。你在 PyCharm 或 VS Code 里点运行工作目录是工程根目录你在终端cd C题之后再跑工作目录就变了。C题/附件.xlsx这种相对路径在这两种情况下会指向完全不同的位置。最省事的验证方式是在脚本开头就打印os.getcwd()和目标路径的绝对路径两边一对比问题立刻现形。这一步做完再去看 csv 落到了哪里通常你会发现文件被写到了另一个目录。5.2 sheet 名这一类错f 字符串不会帮你转义f{name}.csv看起来人畜无害但 sheet 名里带空格、带中文括号、带斜杠都很常见。空格和中文没问题斜杠和冒号会直接造成路径错误在部分系统上甚至会静默写到别的目录。上面给的safe_name就是干这个的。另外还有一类隐蔽情况某个 sheet 名前后带空格Excel 里肉眼看不出来拼出来的文件名就多了一个空格模型按你口头给的名字去找自然找不到。5.3 编码与空值让模型看到的是「空字符串」而不是 NaNutf-8-sig前面的sig就是 BOM作用是在文件开头写三个字节让 Excel 和部分编辑器识别出这是 UTF-8。少了它中文列名在某些读取路径下会变成乱码模型看到的就是一堆替换字符。空值这块同理fillna()之后如果又用默认的read_csv去读NaN可能被反向推断回来最后列被识别成 float模型对列语义的判断就偏了。排查时可以直接head -c 16 文件名.csv | xxd看一眼文件头BOM 在不在一秒就能确认。5.4 长期在数模工程里做这类排查可以把通道固定下来如果一整个赛季都在反复调 Excel、CSV、编码这些事每次临时配 Key 会很烦。可以把这套通道配置固定成一份长期配置用 Coding Plan 管理多轮对话和上下文避免每次都从零描述目录结构。入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan 适合需要连续几轮追问同一份脚本的场景。6. 想把这条排障链路跑顺先把 Key 和文档存下来回到最开始那个问题xlsx 转 CSV 后 LLM 仍读不了别急着怀疑模型能力先把路径、sheet 名、编码、空值这四件事在本地验一遍。验完之后把脚本、报错、扫描输出一起交给走 TaoToken 通道的 Codex让它点名最可疑的那一行。整个流程里你唯一需要从 TaoToken 拿的就是 Key 和 Base URLpandas 那边该怎么改还是得你自己确认这样排查结果才站得住。Key 创建和接入配置从这里开始https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys 。Base URL 统一填https://taotoken.net/api不要加/v1。参数、字段、模型名的写法都在接入文档里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc 。最后留一个我踩过的细节每次改完导出脚本先删掉旧的csv_out目录再重跑别让上一轮的残留文件混进去。模型报错时说的那个文件名很可能就是上一轮留下来的而你盯着新代码怎么都看不出来问题在哪。