news 2026/9/20 16:34:57

xlsx 转 CSV 后 LLM 仍读不了?让 Codex 走 TaoToken 通道查 pandas 导出

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
xlsx 转 CSV 后 LLM 仍读不了?让 Codex 走 TaoToken 通道查 pandas 导出

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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=console 创建 Key。创建完把 Key 复制出来,放进环境变量,不要写死在脚本里,更不要提交到仓库。

export TAOTOKEN_API_KEY="你的TaoToken Key"

然后配置 Codex 的模型通道。关键两点:Base URL 填https://taotoken.net/api,注意后面不要加/v1;Key 用 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 读到了 sheet,to_csv 之后目录里只有两个 csv,但 LLM 读第三个表时报 FileNotFoundError」。描述越像你实际看到的现象,Codex 给的定位就越准。接入方式和 Key 管理入口都在 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api-keys ,参数细节看 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc 。

2.1 只改模型通道,不改 pandas 版本

有个坑我见得太多了:为了「让模型能看懂」,顺手把 pandas 或 openpyxl 升级了,结果数模工程里其他脚本集体报错。正确顺序是先固定环境,再单独解决 CSV 的落盘问题。

python -c "import pandas, openpyxl; print(pandas.__version__, openpyxl.__version__)"

把版本号记下来,之后 Codex 给出的建议如果要求你换版本,先想清楚会不会影响别的脚本。排查阶段,环境变量里加一句PYTHONHASHSEED=0之类的东西没有意义,稳定复现比什么都重要。

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_ok=True) print("源文件存在:", os.path.exists(src), "大小:", os.path.getsize(src)) book = pd.ExcelFile(src, engine="openpyxl") print("工作表:", book.sheet_names) sheets = pd.read_excel( src, sheet_name=None, engine="openpyxl", keep_default_na=False, dtype=str, ) 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, index=False, encoding="utf-8-sig") print("写出:", target, df.shape)

这段跑起来之后,每个表都会落在C题/csv_out/下,文件名经过过滤,不会再因为 sheet 名里的斜杠跑到别的地方去。utf-8-sig保留 BOM,中文列名在编辑器里不会变成问号。keep_default_na=False配合dtype=str,可以让空单元格保持为空字符串,而不是变成NaN之后再被推断成浮点列。

3.1 交给 Codex 的检查清单提示词

把上面脚本和真实报错贴给 Codex 之后,用下面这段作为任务描述,让它按段核对,而不是泛泛地给建议:

请逐段检查这段 pandas 导出脚本,重点核对四件事: 1) os.path 定位的 "C题/附件.xlsx" 是否和实际目录一致,给出核对用的 shell 命令; 2) f-string 生成的 csv 文件名与 sheet 名是否一致,是否可能落到非预期目录; 3) encoding="utf-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", recursive=True)): with open(p, "rb") as f: head = f.read(3) try: df = pd.read_csv(p, dtype=str, keep_default_na=False) 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: True,shape 和你印象中的行列数对得上,列名是中文且没有乱码。如果某一行直接抛UnicodeDecodeError,说明那个文件不是utf-8-sig;如果BOM: False,说明写盘时编码参数没生效,模型读到的中文就可能出问题;如果 shape 的第一维是 1,多半是分隔符不对或者被当成了单列。

4.1 让 Codex 复述失败点,而不是复述你的话

验证阶段的问法也要注意。直接把上面那段扫描脚本的输出粘给 Codex,然后问「哪个文件最可能导致 LLM 读不了,依据是什么」。一个合格的回答会明确指向某个路径,并给出依据,比如「该文件 BOM 为 False,且列名出现\ufffd,与其余文件不一致」。如果它只是把你说过的话换个顺序再说一遍,那就没有给出增量信息,直接换一个更具体的问法,比如「只看 BOM 为 False 的那一个文件,给出三行修复代码」。

模型对话入口在 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=chat ,验证阶段用它做交叉确认比较顺手,不必每次都改本地配置。

5. 本篇常见错排查:路径、sheet 名、编码、空值

下面这张表按现象归类,基本能覆盖 xlsx 转 CSV 之后模型仍然读不了的大部分情况。遇到问题时先对号入座,再决定要不要动代码。

现象常见根因修法
报 FileNotFoundErrorC题是相对当前工作目录,不是脚本目录os.path.dirname(os.path.abspath(__file__))做基准
目录里只有部分 csvsheet 名含斜杠或冒号,f 字符串拼出了非法路径过滤 Windows 非法字符后再拼文件名
中文列名乱码写成utf-8而非utf-8-sigto_csv(..., encoding="utf-8-sig")
空列变成 NaN默认keep_default_na=Trueread_excel时加keep_default_na=False
数字被读成科学计数未指定dtype=str读取时dtype=str,让下游自己做类型转换
多个 sheet 互相覆盖文件名只用了简单的 name,重名时后者覆盖前者拼文件名时加序号或加 sheet 索引
第一行成了列名的一部分原表有合并表头或说明行read_excelskiprows显式跳过

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 编码与空值:让模型看到的是「空字符串」而不是 NaN

utf-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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding-plan ,适合需要连续几轮追问同一份脚本的场景。

6. 想把这条排障链路跑顺,先把 Key 和文档存下来

回到最开始那个问题:xlsx 转 CSV 后 LLM 仍读不了,别急着怀疑模型能力,先把路径、sheet 名、编码、空值这四件事在本地验一遍。验完之后,把脚本、报错、扫描输出一起交给走 TaoToken 通道的 Codex,让它点名最可疑的那一行。整个流程里,你唯一需要从 TaoToken 拿的就是 Key 和 Base URL,pandas 那边该怎么改还是得你自己确认,这样排查结果才站得住。

Key 创建和接入配置从这里开始:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api-keys 。Base URL 统一填https://taotoken.net/api,不要加/v1。参数、字段、模型名的写法都在接入文档里:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc 。

最后留一个我踩过的细节:每次改完导出脚本,先删掉旧的csv_out目录再重跑,别让上一轮的残留文件混进去。模型报错时说的那个文件名,很可能就是上一轮留下来的,而你盯着新代码怎么都看不出来问题在哪。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 16:34:01

工控现场排障神器:工业协议诊断与Windows环境净化工具

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 16:33:08

850nm脉冲激光测距硬件设计:纳秒级时序控制与热-光协同优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 16:32:38

免费做出专业 2D 动画:OpenToonz 上手指南

免费做出专业 2D 动画&#xff1a;OpenToonz 上手指南 【免费下载链接】opentoonz OpenToonz - An open-source full-featured 2D animation creation software 项目地址: https://gitcode.com/GitHub_Trending/op/opentoonz OpenToonz 是由日本 DWANGO 发布的免费开源 …

作者头像 李华
网站建设 2026/9/20 16:31:52

FANUC机器人KAREL编程入门:从TP到结构化语言核心指南

简介&#xff1a;这份入门学习文档面向工业机器人工程师及自动化学习者&#xff0c;系统讲解FANUC机器人KAREL编程的基础知识&#xff0c;帮助读者从零理解KAREL与TP程序的差异、语言基本结构及程序执行流程。文档内容涵盖PROGRAM/END框架、变量声明规则、关键字限制&#xff0…

作者头像 李华
网站建设 2026/9/20 16:30:16

GBrain Ingest 技能深度解析:路由式内容摄取管线与大脑写入契约

GBrain Ingest 技能深度解析&#xff1a;路由式内容摄取管线与大脑写入契约 【免费下载链接】gbrain Garrys Opinionated OpenClaw/Hermes Agent Brain 项目地址: https://gitcode.com/gh_mirrors/gb/gbrain 导读 本文围绕 gbrain 仓库中的 ingest 技能 展开&#xff0…

作者头像 李华