os.walk in Kombination mit arcpy.ListRasters

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.
Antworten
MarcNAV
User
Beiträge: 52
Registriert: Freitag 16. Mai 2014, 11:39

Da ich das Esri Forum irgendwie als sehr unübersichtlich empfinde, stelle ich die Frage mal hier:
Weiß einer warum ich wenn ich raster printe immer doppelte Einträge bekomme. Sagen wir ich habe die Raster: Karte1 und Karte2, dann printet Python mir:

Karte1
Karte1
Karte2
Karte2

Die Ordnerhierarchie eines Rasters sieht folgendermaßen aus:
F:/Projekte/2014_09/Einzelne_Module/Testarea/Karte1_rastered/Karte1

Ich mache das ganze mit os.walk da Python selbstständig die Raster finden soll.
An den ListRasters ({wild_card}, {raster_type}) Parametern hab ich schon rumgespielt, hat leider nichts geholfen. Ist irgendwie schwierig mit Raster umzugehen da diese keine Extensions haben sondern einfach nur ordner sind. Danke schonmal für die Hilfe;)

Code:

Code: Alles auswählen

import glob, arcpy, os
from arcpy import env

def main():

    workspace = 'F:/Projekte/2014_09/Einzelne_Module/Testarea'
    for path, _, filenames in os.walk(workspace):

        env.workspace = path
        rasterList = arcpy.ListRasters("*", "GRID")

        for raster in rasterList:

            print raster

if __name__ == '__main__':
    main()


Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Klingt für mich logisch!

Lass Dir mal nach der ``for``-Schleife ``path`` und ``filenames`` ausgeben ;-) Ich wette Du bekommst *zwei* Ausgaben und das hat dann natürlich Konsequenzen für das, was danach kommt. Den Gedankenschluss überlasse ich Dir erst einmal :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
MarcNAV
User
Beiträge: 52
Registriert: Freitag 16. Mai 2014, 11:39

Wenn ich path printe stimmt es. Python gibt mir für jedes Raster einen Pfad aus.
Wenn ich filenames printe printet er mir natürlich alle enthaltenen Dateien.
Aber danke, hat schonmal weitergeholfen;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du hast schon verstanden, dass Zeile 9 das Problem ist? Du willst ja nur den Pfad - ``os.walk`` läuft aber über alle *Dateien*. Ergo wird diese Zeile viel zu oft aufgerufen!

Wenn ich das richtig verstanden habe, willst Du ja lediglich die Pfade und *nicht* die Dateien. Also solltest Du Dir einfach eine Sammlung von Pfaden erstellen (eben z.B. durch ``os.walk``) und über *diese* iterieren, um dann damit Deine "arcgis" spezifischen Sachen aufrufen.

Edit: Vielleicht reicht Dir ja schon ``os.listdir``? Wenn Du keine rekursiven Verzeichnisse betrachten musst, wäre das deutlich einfacher als aus ``os.walk`` eine Liste aufzubauen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
MarcNAV
User
Beiträge: 52
Registriert: Freitag 16. Mai 2014, 11:39

Hab zufällig den hauseigenen Befehl gefunden von arcpy. Durch die Suchbegriffe iterate....von Hyperion bin ich auf die entsprechenden Seiten gestoßen. Danke nochmals. Auf diesem Wege funktionierts:

Code: Alles auswählen

import arcpy

def main():


    workspace = 'F:/Projekte/2014_09/Einzelne_Module/Testarea'
    for dirpath, workspaces, datatypes in arcpy.da.Walk(
    workspace, followlinks=True, datatype=['RasterDataset']):

        env.workspace = dirpath
        rasterList = arcpy.ListRasters("*", "GRID")
        for raster in rasterList:
            print raster


if __name__ == '__main__':
    main()

Ist eventuell doppelt gemoppelt aber funktioniert auf diese Weise auf jeden Fall. Nochmal zur Erklärung:
Das obige Programm durchsucht im angegebenen Workspace und den Unterordnern nach Raster Karten (Typ: Grid) und gibt sie aus.
Antworten