Ich habe ein paar Dutzend Feature-Classes, von denen eine das gesuchte Feld enthält. Sie werden in verschiedenen Geodatabases gespeichert.
Gibt es eine schnelle Möglichkeit, jede Feature-Class zu durchsuchen, um die mit meinem Feld zu finden? Oder muss ich die Attributtabelle jedes einzelnen im Katalog überprüfen? Einige der Dateien haben denselben Namen, werden jedoch an verschiedenen Orten gespeichert.
Ich möchte dies in einem Calculate Value
Tool in ModelBuilder tun können, damit ich das Modell jedes Mal auf einer einzelnen Datei-GDB ausführen und alle Feature-Classes in dieser GDB durchsuchen und nach dem Feld suchen kann .
Bisher habe ich einen Feature-Class-Iterator, der alle Feature-Classes in der Datei gdb rekursiv durchläuft. Im Inneren habe Calculate Value
ich folgenden Code:
findField(r"%Feature%", "%Search Field%")
def findField(fc, fi):
lst = arcpy.ListFields(fc)
for f in lst:
if f.name == fi:
return fc
else:
return "not found"
Die zurückgegebenen Werte werden Output Values
als Zeichenfolgen gesammelt . Die Ausgabe für alle Feature-Classes wurde "nicht gefunden", obwohl das Feld in mindestens 4 von ihnen vorhanden ist.
quelle
Calculate Value
Feld eingefügt , um nach dem Feld zu suchen und den Pfad der Feature-Class als Zeichenfolge zurückzugeben, wenn sie das Feld findet - siehe meine Antwort unten.Antworten:
Ich würde ein Listenverständnis anstelle von Zeichenfolgenoperationen bevorzugen (wie akzeptierte Antwort). Meiner Meinung nach ist dies lesbarer und pythonischer. Darüber hinaus könnte der Ansatz des Listenverständnisses erweitert werden, indem
str.lower()
sehr einfach weitere Funktionen hinzugefügt werden ( wie dies bei @RyanDalton der Fall war).Wenn Sie den Einzeiler bevorzugen if-else Statement:
Oder noch kürzer, aber weniger lesbar:
quelle
Schauen Sie sich diese Funktion von Björn Kuiper an, um zu testen, ob ein Feld vorhanden ist :
mit folgendem Anwendungsbeispiel:
quelle
Sie können arcpy verwenden:
Außerdem können Sie os.walk für Dateien in Ihrem Laufwerk verwenden als:
ich hoffe es hilft dir ....
quelle
Arabella, befinden sich Ihre Feature-Classes in Feature-Datasets? In diesem Fall funktioniert die Lösung von @ Aragon nicht, da Sie die Feature-Datasets durchgehen und dann die Feature-Classes überprüfen müssen.
Unter Verwendung des Codes von @ Aragon sowie des Codes von @ gotchula aus Alle Feature-Classes in GDB auflisten , einschließlich innerhalb von Feature-Datasets , habe ich den folgenden Code erstellt, der alle Feature-Datasets und Feature-Klassen in einer Geodatabase durchliest.
HINWEIS : Standardmäßig wird bei ListFields zwischen Groß- und Kleinschreibung unterschieden. Ich habe Code hinzugefügt, um sowohl den benutzerdefinierten Feldnamen als auch den ListField-Namen für Suchvorgänge ohne Berücksichtigung der Groß- und Kleinschreibung in Kleinbuchstaben umzuwandeln. Sie möchten wahrscheinlich auch die meisten Druckanweisungen deaktivieren, aber ich habe sie dort belassen, damit Sie dem Code folgen können, während er ausgeführt wird. Ich habe auch die Unterfunktion FindField innerhalb von erstellt, damit ich sie im Skript mehrmals aufrufen kann, ohne sie neu codieren zu müssen.
quelle
Calculate Value
zurückkommt - könnte ichreturn "true" if FindField(fc,myField) =="true" else "false"
?Einige haben so getanzt, wie ich das machen würde, aber ich möchte nur einen einfachen einzeiligen Weg hinzufügen, um dies zu tun:
Was ist vielleicht nützlicher (wenn Sie viele Feature-Classes durchlaufen)? Ich würde das Gegenteil von oben als Filter verwenden:
quelle
Ich habe die Antwort mit Hilfe des Codes in der Antwort auf diese Frage gefunden . Ich nahm alle Feldnamen, konvertierte sie in eine Zeichenfolge und suchte dann in der Zeichenfolge nach meinem Feld. Der Code im
Calculate Value
jetzt sieht wie folgt aus:Das
Output Values
enthält jetzt die vollständige Liste der Feature-Classes mit dem Feld, nach dem ich gesucht habe, undnot found
für den Rest.quelle