Python - Formatieren von Pfadzeichenfolgen und Überprüfen, ob ein Pfad vorhanden ist

8

Ich möchte den folgenden Code verwenden, um festzustellen, ob ein Pfad vorhanden ist. Der Pfad, den ich überprüfen möchte, wird über einen Parameter in einem ArcMap 10.0-Tooldialogfeld an meinen Code übergeben. Der Parameterdatentyp ist Ordner. Dieser Ordnerpfad wird in meinem Code unten an sys.argv [2] übergeben.

{import sys

import os

if os.path.exists("%s"): %(sys.argv[2])

    pass

else:

    #Do Something Magical}

Normalerweise hätte ich kein Problem mit diesem Skript, wenn ich den Ordnerpfad explizit angeben würde. Zum Beispiel funktioniert eine der folgenden drei gut und macht das, was ich brauche:

os.path.exists("C:\\Data\\Hardwar\\Folder"):

os.path.exists(r"C:\Data\Hardwar\Folder"):

os.path.exists("C:/Data/Hardwar/Folder"):

Im vorhergehenden Code stelle ich fest, dass beim C:\Data\Hardwar\FolderÜbergeben des Pfads ie ( ) von meinem Parameter an sys.argv [2] der erste Buchstabe nach \ zu Recht maskiert wird.
Wie formatiere ich den Pfad in sys.argv [2] in ein Python-akzeptables Pfadformat?

Lemuel
quelle
2
Als Randnotiz gibt es einen arcpy.exists()Befehl, der mit ungeraden Datei- und Ordnernamen besser funktioniert als os.path.exists.
dmahr
1
Haben Sie versucht, arcpy.GetParameterAsText(1)statt zu verwenden sys.argv[2]?
nmpeterson
Ich sehe das Problem, das Sie bei 10.0 beschreiben, nicht. Können Sie Screenshots Ihrer Werkzeugparameter veröffentlichen und was Sie gesehen haben, hat Sie zu der Annahme geführt, dass der Pfad nicht richtig interpretiert wird?
blah238

Antworten:

11

Wie Sie festgestellt haben, enthalten Windows-Pfade einen einzelnen Backslash, in Python ist ein einzelner Backslash ein Escape-Zeichen .

Sie haben einige Möglichkeiten:

1) Sie können einen rohen String ( r"stringgoeshere") oder os.path.normpath(), wie in diesem Blog-Beitrag beschrieben, verwenden .

2) Damit Python versteht, dass eine Zeichenfolge einen Pfad enthält, müssen Sie doppelte Backslashes verwenden.

Ihr Pfad sollte also so formatiert sein:

(C:\\Data\\Hardware\\Folder)

Eine einfache Alternative, um dies in Ihrem Code zu erreichen, besteht darin sys.argv[2], eine Zeichenfolge zuzuweisen und von dort aus zu formatieren.

Radar
quelle
-1, da dieser Rat nur für Python-String-Literale gilt. Zeichenfolgen, die aus den Befehlszeilenargumenten (sys.argv oder arpcy.GetParameter (AsText)) interpretiert werden, sind bereits Zeichenfolgenobjekte. Da ein Backslash kein Escapezeichen in der Windows-Shell ist, sollten Sie Backslashes nur im Python-Quellcode (dh) maskieren String-Literale).
blah238
3

Etwas passt weder zur Frage noch zu den vorhandenen Antworten. Der Backslash ist nur ein Escape-Zeichen für Zeichenfolgenliterale im Python-Quellcode, nicht in der Windows-Shell (was Python unter Windows zum Parsen von Befehlszeilenargumenten verwendet).

Ausführen dieses einfachen Skripts:

import os, sys, arcpy

arcpy.AddMessage(str(os.path.exists(sys.argv[1])))

In einem ArcGIS 10.0-Skriptwerkzeug mit einem einzelnen Eingabeparameter vom Typ Ordner wird "True" für jeden vorhandenen Ordner gedruckt.

blah238
quelle
Ich denke, mein größter Fehler war möglicherweise, dass ich, nachdem der Dialogfeldparameter seinen Wert an sys.argv [2] übergeben hatte, den Inhalt von sys.argv [2] aus Gründen der Lesbarkeit an eine Variable namens output_location übergeben habe. Beim Übergeben des Pfads von sys.argv [2] zur Variablen output_location hat das Slicing möglicherweise stattgefunden. Leider kann ich diese Theorie nicht testen, da ich gerade nicht an meiner Maschine bin. Vielen Dank für das Feedback.
Lemuel
Das würde es auch nicht erklären.
blah238
2

Ich habe das Gefühl, dass Sie hier die Dinge nur zu kompliziert machen. Warum kämpfen Sie darum, den Eingabeparameter mithilfe der %sZeichenfolgenformatierung zu übergeben? Zwei Beispiele für Arbeitscodes:

import sys,os

#set the input parameter as a variable
var = sys.argv[1]

if os.path.exists(var):
    print "exists"

else:
    print "fails"
    #Do Something Magical

Oder einfach:

import sys,os

#Just pass the input parameter directly to the exists function
if os.path.exists(sys.argv[1]):
    print "exists"

else:
    print "fails"
    #Do Something Magical

Und @ blah238 ist richtig. Wenn Sie dies als ArcMap Toolbox-Tool ausführen, sollten Sie es wirklich verwenden arpcy.GetParameter(AsText).

RyanKDalton
quelle