arcpy查询不起作用

-1 投票
4 回答
929 浏览
提问于 2025-04-18 04:39

我有一个ArcPy脚本,目的是根据一个查询从属性表中选择想要的属性(包括 E-domE-subdom,下面有例子)。

myQuery = '"VM_POLY" = \'E-dom\'' or '"VM_POLY" = \'E-subdom\''
myInputShapeFile = r"D:\FieldStudy.shp"
myOutputShapefile = r"D:\Endangered.shp"

arcpy.Select_analysis(myInputShapeFile, myOutputShapefile, myQuery)

当脚本运行完毕后,查询中只选中了一个类型的属性。在 myInputShapeFile 的属性表中,既有 E-dom 也有 E-subdom 属性,但脚本只会在 myOutputShapefile 中返回 E-dom。我知道问题可能出在查询(myQuery)上,但我不太确定该怎么解决。

如果有人能提供一些指导,我将非常感激。

4 个回答

1

我会用一些特殊符号来简化你的查询。

myQuery = ' "%s" = %s or "%s" = %s ' %('VM_POLY','E-dom','VM_POLY','E-subdom')

我知道一开始看起来有点奇怪,但这是确保你的单引号和双引号放置正确的一种好方法,特别是对于那些需要特定格式的内容。最近它们对我来说变得非常重要。

注意:如果你想在字符串中插入数字,可以用 %d 来代替 %s。

1

在Python中,字符串格式化(还有SQL中的“IN”操作符)让处理复杂的引号语法变得(稍微)简单一些:

myQuery = "\"{}\" IN ('{}', '{}')".format("VM_POLY", "E-dom", "E-subdom")
1

试试这个:

myQuery = '"VM_POLY" = "E-dom" or "VM_POLY"= "E-subdom"'

之前提到过,你的 or 操作符处理得不太对,因为它没有放在引号里面。你还用了一个 转义字符 \,这可能是多余的。你是想解决 or 操作符暴露在外的问题,导致它不属于 SQL 查询,而是被 Python 解释器识别了。

2

你是不是把撇号用错了?

myQuery = '"VM_POLY" = \'E-dom\'' or '"VM_POLY" = \'E-subdom\''
#         ^             ¨      ¨^    ^             ¨         ¨^

(用^标记的撇号表示一个Python字符串;用¨标记的撇号是转义的,所以它们是字符串的一部分。)

我想你的查询应该是:

myQuery = '"VM_POLY" = \'E-dom\' or "VM_POLY" = \'E-subdom\''
#         ^             ¨      ¨                 ¨         ¨^

因为or不应该被Python当作逻辑运算符来处理(它是作用于两个字符串的),而应该作为查询文本的一部分。

撰写回答