Attributtabelle sortieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

hier nochmals mein Code:

Code: Alles auswählen

import arcgisscripting          # import der Library
gp=arcgisscripting.create(9.3)  # geoprocessor zum import von funktionen
gp.workspace="C:/Temp"          # workspace

 
cur=gp.SearchCursor("Polyline0Punkte.shp", "", "", "FID, FID_DREIEC, ORIG_FID, POINT_X,POINT_Y,POINT_Z,Tri_Index")      # Durchsuchen der Datei nach den Spalten X, Y, Z


#get the first value
row = cur.next()

# Iterate through the rows in the cursor
#
liste = list()
while row:
    current_Eintrag = (row.FID, row.FID_DREIEC, row.ORIG_FID, row.POINT_X, row.POINT_Y, row.POINT_Z)
    liste.append(current_Eintrag)
    liste.append(' ')

    row = cur.next()
    
#import operator

#def sort_table(iterable, index)
    #index = 2
    #return sorted(iterable, key=operator.itemgetter(index))
import functools
def sort_with_index(iterable, index)
    return sorted(iterable, key=operator.itemgetter(index))

sort_table = functools.partial(sort_with_index, index=2)


BlackJack

Der Traceback sollte am Ende eher so aussehen:

Code: Alles auswählen

   File "<file>", line 28
     def sort_with_index(iterable, index)
                                         ^
 SyntaxError: invalid syntax
Da gibt es also auch eine Quelltextzeile. Und einen "Pfeil" (^), der auf die Stelle zeigt, an welcher der Compiler nicht mehr weiter weiss. Und nun schau doch nochmal in der Dokumentation, was genau an der Stelle bei einer Funktionsdefinition erwartet wird.

Beim nächsten Versuch wird Dir wahrscheinlich ein `NameError` begegnen. Und wenn der behoben ist, und Du die Funktion auch mal tatsächlich aufrufst ist ein ``IndexError: string index out of range`` der nächste wahrscheinliche Kandidat. Aber eins nach dem anderen…
Zuletzt geändert von BlackJack am Montag 9. August 2010, 10:55, insgesamt 1-mal geändert.
Grund: Eine Zeile zum Traceback hinzugefügt.
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

worin liegt jetzt noch der Fehler, dass das Skript nicht läuft?

Code: Alles auswählen

import arcgisscripting          # import der Library
import operator
import functools
gp=arcgisscripting.create(9.3)  # geoprocessor zum import von funktionen
gp.workspace="C:/Temp"          # workspace

 
cur=gp.SearchCursor("Polyline0Punkte.shp", "", "", "FID, FID_DREIEC, ORIG_FID, POINT_X,POINT_Y,POINT_Z,Tri_Index")      # Durchsuchen der Datei nach den Spalten X, Y, Z


#get the first value
row = cur.next()

# Iterate through the rows in the cursor
#
liste = list()
for row in iter(cur.next, none):

    def sort_table(iterable, Index)
        return sorted(iterable, key=operator.itemgetter(index))
    sorted_table = operator(sort_table, 2)
    
    current_Eintrag = (row.FID, row.FID_DREIEC, row.ORIG_FID, row.POINT_X, row.POINT_Y, row.POINT_Z)
    liste.append(current_Eintrag)
    
    liste.append(' ')

    row = cur.next()
    

#def sort_with_index(iterable, index)
    #return sorted(iterable, key=operator.itemgetter(index))

#sort_table = functools.partial(sort_with_index, index=2)


print liste
    
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Anstatt auf geratewohl Dinge zu aendern, solltest du mal die Fehlermeldung verstehen! BlackJack hat es dir doch erklaert!
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

Ich krieg gar keinen Traceback-Eintrag im Python shell, da vorher schon ein Fenster erscheint in welchem genau folgende Mitteilung steht: There's an error in your program: invalid syntax
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das ist schlecht. Ich nehme an, dass das innerhalb dieser GIS Umgebung laeuft bzw du darin programmierst? Dann solltest du den Hersteller mal darauf aufmerksam machen, dass er den kompletten Traceback rausruecken sollte, da hilfreich.

1. Hinter der Funktionsdefinition fehlt ein `:`
2. Du solltest die Definition nicht in die Schleife packen, weil sie sonst bei jedem Durchgang neu ausgewertet wird.
3. Die `sorted_table` Abkuerzung solltest du wieder berichtigen.

Und dein Problem ist dann noch Folgendes: Du baust Listeneintraege die aus einem 6-stelligen Tupel oder einem Leerzeichen-String bestehen (wozu denn?!).
Wenn du die Sortierfunktion mal aufrufen wuerdest, wuerde sie beim Leerzeichen-Eintrag auf die Nase fallen, da gibt es naemlich keinen Index 2

Code: Alles auswählen

import arcgisscripting
import operator
import functools

gp = arcgisscripting.create(9.3)
gp.workspace = "C:/Temp"
cur = gp.SearchCursor("Polyline0Punkte.shp", "", "", "FID, FID_DREIEC, ORIG_FID, POINT_X,POINT_Y,POINT_Z,Tri_Index")

liste = list()

for row in iter(cur.next, none):
   
    current_Eintrag = (row.FID, row.FID_DREIEC, row.ORIG_FID, row.POINT_X, row.POINT_Y, row.POINT_Z)
    liste.append(current_Eintrag)

def sort_with_index(iterable, index):
    return sorted(iterable, key=operator.itemgetter(index))

sort_table = functools.partial(sort_table, index=2)

print sort_table(liste)
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ich vermute mal, dass du dein Programm aus einer IDE heraus ausfuehrst. Wenn die wirklich so wenig hilfreich ist, dann fuehre das Programm halt aus dem Terminal aus! Wie starte ich Skripte?
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

@ cofi: Vielen herzlichen Dank. Jetzt hat es funktioniert. Ich sehe schon, ich bin noch etwas planlos ...
@ Rebecca: Jeder fängt mal klein an - und wenn man so ins kalte Wasser geworfen wird, dann kommt halt machnmal ein Blödsinn heraus. Aber aus Fehlern lern man am besten
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

Im Übrigen kannst du dem SearchCursor direkt sagen, nach welchen Feldern sortiert werden soll (siehe die nervige Onlinedoku).
Und falls du den Kram noch nicht kennst: das Geoprocessor Programming Model (9.3) ist recht hilfreich. Und ich würde dir raten einfach mal ein paar Sachen live in der Python-Konsole auszuprobieren.
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

@ pudeldestodes

Danke für den Tipp. Das mit dem Cursor habe ich jetzt auch an einem anderen Problem probiert und klappt. Danke!
Antworten