SearchCursor 按中文 where 查不出?TaoToken 这样让 Codex 改编码
2026/9/17 11:46:25 网站建设 项目流程

arcpy.da.SearchCursor按中文 where 查不出,是 Zion.gdb 环境数据里常见的一幕:CITY = '大同'在属性表能筛出记录,游标却静默返回空。TaoToken 这条排障路线的做法是,先去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content= 创建 Key,把代码和现象贴给走 TaoToken 的 Codex 检查 unicode 编码,SearchCursor 仍由本地 arcpy 执行。原始文章在讲 SearchCursor 的只读查询、u'' 前缀和 rank=4 / 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 与 rank=4 的过滤

原始需求很具体:查询 Zion.gdb 中的环境数据,取出 ID、CITY、RANK 三个字段,并在 where 里过滤rank=4,再进一步过滤city = 大同。SearchCursor 是只读游标,只能迭代返回的行,不能插入、更新、删除。它接受 where 条件来限制返回行,可一旦条件里混入中文,返回空列表却不报错的情况就出现了。排查第一步不是改代码,而是确认属性表里的数据真实存在:在 ArcGIS 中打开环境数据属性表,按RANK = 4筛一次,再按CITY = '大同'筛一次,看看各自出几条、合在一起出几条。如果属性表本身查不出,问题在数据或字段名,不在编码;如果属性表能查、游标查不出,才进入下面的编码检查。

同时记录字段类型:CITY 通常是 Text,RANK 可能是 Short 或 Long。字段名大小写在 where 里通常不敏感,但字段定界符和字符串常量的引号不能混。还要注意中文是不是全角空格,或者值其实是“大同市”而不是“大同”。这些信息后面都要贴给 Codex,只丢一句“查不出”很难定位。

1.2 最小化 Python 2.7 代码:把空列表固定下来

先把问题压到最小,别一上来就贴几百行脚本。下面这段代码适合在 ArcGIS Desktop 10.x 的 Python 2.7 环境里复现:

# -*- coding: utf-8 -*- import arcpy gdb = r"C:\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 3,str已经是 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 指到 TaoToken

Codex 的配置不要套ANTHROPIC_*变量,它走的是自己的config.toml。Windows 一般在C:\Users\你的用户名\.codex\config.toml,macOS/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_KEY=YOUR_API_KEY
$env:TAOTOKEN_API_KEY="YOUR_API_KEY"

YOUR_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='大同' 且 RANK=4 能查出记录。 代码文件第一行是 # -*- 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 与 AddFieldDelimiters

3.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 rank=4 和 city=大同 的 where 写法对照

先看错误写法:

where_clause = "RANK = 4 AND CITY = '大同'"

在 Python 2.7 下,这个 where 容易静默失效。修正一,直接给中文字面量加 u:

where_clause = u"RANK = 4 AND CITY = '大同'"

修正二,用 format 拼接,注意 format 的模板也加 u:

city_name = u"大同" where_clause = u"RANK = 4 AND CITY = '{}'".format(city_name)

修正三,用AddFieldDelimiters避免字段定界符问题:

city_field = arcpy.AddFieldDelimiters(fc, "CITY") where_clause = u"RANK = 4 AND {} = '大同'".format(city_field)

注意,AddFieldDelimiters处理的是字段名两侧的定界符,不会自动给字符串常量加单引号。where 里的'大同'仍要保留单引号。如果 CITY 字段是文件地理数据库里的文本字段,AddFieldDelimiters可能返回CITY"CITY",用 format 拼进去即可。

3.3 本地执行修正后的 arcpy.da.SearchCursor

把 Codex 给出的修正思路合到本地代码里,下面是一份可直接改路径运行的版本:

# -*- coding: utf-8 -*- import arcpy gdb = r"C:\gis\Zion.gdb" fc = gdb + r"\环境数据" fields = ["ID", "CITY", "RANK"] city_field = arcpy.AddFieldDelimiters(fc, "CITY") where_clause = u"RANK = 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 = r"C:\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]是 ID,row[1]是 CITY,row[2]是 RANK。原始文章的结果展示也围绕这三个字段展开。如果打印出来 CITY 正常、RANK 不是 4,说明 where 里的 RANK 条件没生效;如果 RANK 是 4 但 CITY 是空或乱码,说明中文条件或字段值仍有问题。把结果按行贴给 Codex 时,保留字段顺序,别只贴 CITY 一列。

4.3 回 TaoToken 控制台对一下这次调用

Codex 帮你改完编码思路后,回到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_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 前到底是什么,u"RANK = 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 = u"RANK = 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 执行 SearchCursor

Codex 不能直连你的 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_source=taotoken_aicg_blog_end&utm_content= 看这次 Codex 调用的记录。模型广场里的模型 ID 会变,以当时列表为准;Base URL 始终填https://taotoken.net/api,不要补/v1。这样下次中文 where 再静默返回空,你手里有一份可复现的现场、一份走 TaoToken 的 Codex 对话,以及本地 arcpy 的验证结果。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询