尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SearchCursor 按中文 where 查不出?TaoToken 这样让 Codex 改编码

SearchCursor 按中文 where 查不出?TaoToken 这样让 Codex 改编码 arcpy.da.SearchCursor按中文 where 查不出是 Zion.gdb 环境数据里常见的一幕CITY 大同在属性表能筛出记录游标却静默返回空。TaoToken 这条排障路线的做法是先去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_content 创建 Key把代码和现象贴给走 TaoToken 的 Codex 检查 unicode 编码SearchCursor 仍由本地 arcpy 执行。原始文章在讲 SearchCursor 的只读查询、u 前缀和 rank4 / city大同 的过滤这里要解决的是当RANK 4 AND CITY 大同一行都不返回时如何把字段、where、属性表查询结果整理成 Codex 能用的上下文再按修正思路回到本地验证。Codex 的 Base URL 填 https://taotoken.net/api末尾不要补 /v1它只提供模型通道不会替你连 Zion.gdb。1. 复现 Zion.gdb 中 SearchCursor 中文 where 查不出的现场1.1 环境数据、ID、CITY、RANK 与 rank4 的过滤原始需求很具体查询 Zion.gdb 中的环境数据取出 ID、CITY、RANK 三个字段并在 where 里过滤rank4再进一步过滤city 大同。SearchCursor 是只读游标只能迭代返回的行不能插入、更新、删除。它接受 where 条件来限制返回行可一旦条件里混入中文返回空列表却不报错的情况就出现了。排查第一步不是改代码而是确认属性表里的数据真实存在在 ArcGIS 中打开环境数据属性表按RANK 4筛一次再按CITY 大同筛一次看看各自出几条、合在一起出几条。如果属性表本身查不出问题在数据或字段名不在编码如果属性表能查、游标查不出才进入下面的编码检查。同时记录字段类型CITY 通常是 TextRANK 可能是 Short 或 Long。字段名大小写在 where 里通常不敏感但字段定界符和字符串常量的引号不能混。还要注意中文是不是全角空格或者值其实是“大同市”而不是“大同”。这些信息后面都要贴给 Codex只丢一句“查不出”很难定位。1.2 最小化 Python 2.7 代码把空列表固定下来先把问题压到最小别一上来就贴几百行脚本。下面这段代码适合在 ArcGIS Desktop 10.x 的 Python 2.7 环境里复现# -*- coding: utf-8 -*- import arcpy gdb rC:\gis\Zion.gdb fc gdb r\环境数据 fields [ID, CITY, RANK] where_clause RANK 4 AND CITY 大同 with arcpy.da.SearchCursor(fc, fields, where_clause) as cursor: rows list(cursor) print(len(rows)) for row in rows: print(row)这段代码在 Python 3 里未必复现同样现象但在 Python 2.7 下很典型where_clause是 str 字节串文件虽然声明了 utf-8中文进入 arcpy 的 where 解析时仍可能按系统 codepage 解释条件在匹配前就变了。结果是len(rows)为 0没有异常堆栈也没有提示。静默返回空比直接报错更难查所以一定要把“属性表查到几条、游标返回几条”一起记下来而不是只记“没结果”。1.3 属性表能查、游标查不出说明什么属性表查询由 ArcGIS 内部处理编码SearchCursor 的 where 则由 Python 字符串传入两条路径不同。中文 where 查不出时可以把现象分成三组第一组where 去掉中文只留RANK 4游标能查出记录第二组where 只留CITY 大同游标查不出第三组改成CITY LIKE %大%或CITY LIKE u%大同%可能出一部分。这个分类能帮 Codex 判断是 unicode 前缀问题、字段值脏数据还是 GDB 编码差异。把三组结果连同字段类型、Python 版本、文件编码声明一起贴过去比只贴错误代码有效得多。提示如果你用的是 ArcGIS Pro 自带的 Python 3str已经是 unicode但 arcpy 版本和 GDB 类型仍会影响 where 解析。先按上面的最小化代码复现再决定改 u 前缀还是改字符串拼接方式。2. 让 Codex 走 TaoToken 读这段 SearchCursor 报错2.1 在 TaoToken 创建 Key不要动 Base URL 的 /v1打开 TaoToken 注册并在控制台创建 API Key。文中统一用占位符YOUR_API_KEY不要把自己的真实 Key 贴进对话。模型 ID 以 模型广场 当时列表为准别自己编gpt-5或随意日期后缀。Codex 的 Base URL 填https://taotoken.net/api末尾不要补/v1。TaoToken 在这里只提供模型通道不替你执行 arcpy也不连你的 Zion.gdb。SearchCursor 的修正版仍然在本地 ArcGIS Python 环境里跑跑完把结果贴回 Codex。2.2 ~/.codex/config.toml 里把 Codex 指到 TaoTokenCodex 的配置不要套ANTHROPIC_*变量它走的是自己的config.toml。Windows 一般在C:\Users\你的用户名\.codex\config.tomlmacOS/Linux 是~/.codex/config.toml。可复制模板如下model YOUR_MODEL_ID model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY环境变量按系统设置export TAOTOKEN_API_KEYYOUR_API_KEY$env:TAOTOKEN_API_KEYYOUR_API_KEYYOUR_MODEL_ID去模型广场选env_key的名字要和你在终端里设置的环境变量一致。Base URL 只写到https://taotoken.net/api不要在后面加/v1也不要把官网落地页的 UTM 参数带进配置文件。2.3 给 Codex 的提问模板代码、字段、现象一次给全配置完成后别只发一句“SearchCursor 查不出中文”。把上下文一次给全Codex 才能围绕 unicode 编码给出修正思路。可以用下面这个模板我在 ArcGIS Desktop 10.x 的 Python 2.7 里用 arcpy.da.SearchCursor 查询 Zion.gdb 的环境数据字段是 ID、CITY、RANK。 属性表里 CITY大同 且 RANK4 能查出记录。 代码文件第一行是 # -*- coding: utf-8 -*-。 下面这段 where 返回空列表没有报错 where_clause RANK 4 AND CITY 大同 我怀疑是 unicode 编码问题。请检查 u 前缀、format 拼接、AddFieldDelimiters 的用法给出我在本地能执行的修正版 SearchCursor 代码。 不要连接我的 GDB也不要执行代码。这样提问的好处是Codex 只能读你贴的代码和现象不会尝试去连你的 Zion.gdb也不会替代 arcpy 执行。它给出的代码你复制到本地在 ArcGIS Python 窗口或 IDE 里跑再把输出贴回来继续追问。3. Codex 检查 where 编码u、format 与 AddFieldDelimiters3.1 原文里的 u 前缀为什么关键原始文章提醒u代表对字符串进行 unicode 编码英文字符在各种编码下基本能正常解析所以一般不带 u但中文必须标明所需编码否则一旦编码转换就会出现乱码建议所有编码方式采用 utf8。在 Python 2.7 下大同是 str 字节串u大同是 unicode 对象。arcpy 的 where 解析器如果拿到的是按错误编码解码的字节串条件里的中文就可能变成别的码点SQL 匹配不到任何行。修正的第一步是给中文字面量加 u 前缀并保持文件编码声明 utf-8。Python 3 默认字符串就是 unicode但 ArcGIS Pro 与 Desktop 10.x 的 arcpy 仍有版本差异统一加 u 并不亏。3.2 rank4 和 city大同 的 where 写法对照先看错误写法where_clause RANK 4 AND CITY 大同在 Python 2.7 下这个 where 容易静默失效。修正一直接给中文字面量加 uwhere_clause uRANK 4 AND CITY 大同修正二用 format 拼接注意 format 的模板也加 ucity_name u大同 where_clause uRANK 4 AND CITY {}.format(city_name)修正三用AddFieldDelimiters避免字段定界符问题city_field arcpy.AddFieldDelimiters(fc, CITY) where_clause uRANK 4 AND {} 大同.format(city_field)注意AddFieldDelimiters处理的是字段名两侧的定界符不会自动给字符串常量加单引号。where 里的大同仍要保留单引号。如果 CITY 字段是文件地理数据库里的文本字段AddFieldDelimiters可能返回CITY或CITY用 format 拼进去即可。3.3 本地执行修正后的 arcpy.da.SearchCursor把 Codex 给出的修正思路合到本地代码里下面是一份可直接改路径运行的版本# -*- coding: utf-8 -*- import arcpy gdb rC:\gis\Zion.gdb fc gdb r\环境数据 fields [ID, CITY, RANK] city_field arcpy.AddFieldDelimiters(fc, CITY) where_clause uRANK 4 AND {} 大同.format(city_field) print(where_clause) with arcpy.da.SearchCursor(fc, fields, where_clause) as cursor: for row in cursor: print(row)这段由你在本地 ArcGIS Python 环境执行。Codex 只负责对照 unicode 提示检查 where 编码不碰 GDB不执行 SearchCursor。如果本地跑出来仍是 0 行把print(where_clause)的输出、字段类型、属性表查询结果一起贴回对话让它继续缩小范围。4. 验证结果属性表、游标、控制台三方对齐4.1 用 repr 看 CITY 字段真实值如果 where 改成 u 后还查不出先别继续猜编码直接看字段值。用下面这段代码把 CITY 的原始表示打印出来# -*- coding: utf-8 -*- import arcpy fc rC:\gis\Zion.gdb\环境数据 with arcpy.da.SearchCursor(fc, [ID, CITY, RANK]) as cursor: for row in cursor: print(repr(row[0]), repr(row[1]), repr(row[2]))看 CITY 输出是u\u5927\u540c还是乱码或者带前后空格、全角空格。如果 repr 显示的是u\u5927\u540c说明字段值本身是正常的 unicode“大同”对应两个码点如果显示的是\xb4\xf3\xcd\xac之类说明读取时的编码环境有问题。把这些输出贴给 Codex它就能判断是 where 字面量编码问题还是字段值脏数据问题。4.2 结果展示ID、CITY、RANK 的顺序别错SearchCursor 返回的行顺序跟 fields 列表一致。fields [ID, CITY, RANK]时row[0]是 IDrow[1]是 CITYrow[2]是 RANK。原始文章的结果展示也围绕这三个字段展开。如果打印出来 CITY 正常、RANK 不是 4说明 where 里的 RANK 条件没生效如果 RANK 是 4 但 CITY 是空或乱码说明中文条件或字段值仍有问题。把结果按行贴给 Codex 时保留字段顺序别只贴 CITY 一列。4.3 回 TaoToken 控制台对一下这次调用Codex 帮你改完编码思路后回到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_content 看这次调用的记录和用量。模型 ID 是不是模型广场里选的那一个Base URL 有没有误填成带/v1的地址都能在这里回查。TaoToken 只记录模型通道的调用不会记录你本地 arcpy 对 Zion.gdb 的读取。如果你发现 Codex 的回答和本地执行结果对不上先把where_clause的打印结果、repr输出和属性表查询条数补齐再继续追问。5. 中文 where 仍查不出时的排障清单5.1 文件编码、Python 版本与 u 前缀第一文件头# -*- coding: utf-8 -*-要放在第一或第二行别被注释或空行挤到后面。第二Python 2.7 里所有中文 where 字面量加 u包括 format 模板本身。第三用print(repr(where_clause))看传入 arcpy 前到底是什么uRANK 4 AND CITY \u5927\u540c和RANK 4 AND CITY \xb4\xf3\xcd\xac是两种完全不同的输入。第四Python 3 里 str 已经是 unicode但 ArcGIS Pro 的 arcpy 版本不同仍建议统一 utf-8不要混用编码声明。5.2 字段类型、空格与全半角CITY 如果是 Text值可能是“大同”或“大同市”也可能带不可见空格。用属性表选中确认或者用 LIKE 先探一下where_clause uRANK 4 AND CITY LIKE u%大同%如果 LIKE 能出、等值不能出通常是值里有额外字符或编码差异。注意 LIKE 的百分号位置以及单引号里是否混入全角空格。把这些差异告诉 Codex让它判断该清洗数据还是改 where。5.3 GDB 编码与字段名大小写文件地理数据库的字符串字段通常是 Unicode但个人地理数据库或 shapefile 可能受 codepage 影响。字段名大小写不敏感但 where 里的字段名最好和字段列表一致。用arcpy.ListFields(fc)看字段名和类型把结果贴给 Codex让它对照原始文章的 unicode 提示继续分析。如果 GDB 来自其他系统导出时可能已经改变了中文编码这时不是改 where 就能救需要重新核对数据源。5.4 别让 Codex 直接连 GDB 执行 SearchCursorCodex 不能直连你的 Zion.gdb也不能替你执行 SearchCursor。它只能读你贴的代码、字段类型、where 字符串和报错给出修正版。诊断脚本、arcpy 执行、结果打印都由你在本地 ArcGIS Python 环境完成再把结果贴回对话。这一点在排障里很重要否则会把“模型通道”和“数据库连接器”混成一件事。TaoToken 提供的是模型 API 接入不是数据库连接工具也不是让 AI 代替你运行地理处理脚本。6. 下一次 SearchCursor 中文 where 的问题继续这样拆6.1 把中文条件先写成可复现的三行下次遇到CITY 大同查不出先写三行属性表能查几条、游标 where 无中文能查几条、游标 where 带中文能查几条。三行现象比一整段描述更快定位。然后打开 TaoToken 模型对话 用同一把 Key 发一条测试确认模型 ID 和 Base URL 没填错。如果要长期用 Codex 改这类脚本可以看 Coding Plan 是否够用Key 在 控制台 API Keys 创建。配置始终记住Base URL 是https://taotoken.net/api不要补/v1模型 ID 以模型广场当时列表为准。6.2 验证完再回到控制台SearchCursor 本地跑出结果后回 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_content 看这次 Codex 调用的记录。模型广场里的模型 ID 会变以当时列表为准Base URL 始终填https://taotoken.net/api不要补/v1。这样下次中文 where 再静默返回空你手里有一份可复现的现场、一份走 TaoToken 的 Codex 对话以及本地 arcpy 的验证结果。
返回列表