Python: formatear cadenas de ruta y verificar si existe una ruta

8

Me gustaría usar el siguiente código para determinar si existe una ruta. La ruta que me gustaría verificar se pasa a mi código a través de un parámetro en un cuadro de diálogo de la herramienta ArcMap 10.0. El tipo de datos de parámetros es carpeta, esta ruta de carpeta se pasa a sys.argv [2] en mi código a continuación.

{import sys

import os

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

    pass

else:

    #Do Something Magical}

Normalmente, no tendría ningún problema con este script si declarara explícitamente la ruta de la carpeta. Por ejemplo, cualquiera de los siguientes tres funciona bien y hace lo que necesito:

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

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

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

En el código anterior, lo que estoy encontrando es que a medida que la ruta ie ( C:\Data\Hardwar\Folder) se pasa de mi parámetro a sys.argv [2] la primera letra después de \ se escapa y con razón.
¿Cómo formateo la ruta en sys.argv [2] a un formato de ruta aceptable de Python?

lemuel
fuente
2
Como nota al margen, hay un arcpy.exists()comando que puede jugar mejor con nombres de archivos y carpetas impares que os.path.exists.
dmahr
1
¿Has intentado usar en arcpy.GetParameterAsText(1)lugar de sys.argv[2]?
nmpeterson
No veo el problema que describe en 10.0. ¿Puedes publicar capturas de pantalla de los parámetros de tu herramienta y lo que viste que te llevaron a creer que la ruta no se está interpretando correctamente?
blah238

Respuestas:

11

Como ha descubierto, las rutas de Windows contienen una barra invertida única, pero en Python una barra invertida simple es un carácter de escape .

Tienes pocas opciones:

1) Puede usar una cadena sin formato ( r"stringgoeshere") o os.path.normpath(), como se detalla en esta publicación de blog .

2) Para que Python entienda que una cadena contiene una ruta, necesita usar barras diagonales inversas dobles.

Por lo tanto, su ruta debe formatearse como tal:

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

Una forma alternativa simple de lograr esto en su código sería asignar sys.argv[2]a una cadena y formatearla desde allí.

Radar
fuente
-1 porque este consejo solo se aplica a los literales de cadena de Python. Las cadenas interpretadas a partir de los argumentos de la línea de comandos (sys.argv o arpcy.GetParameter (AsText)) ya son objetos de cadena y dado que una barra diagonal inversa no es un carácter de escape en el shell de Windows, no debe escapar barras diagonales en ningún lugar excepto en el código fuente de Python (es decir literales de cadena).
blah238
3

Algo no cuadra ni con la pregunta ni con las respuestas existentes. La barra diagonal inversa es solo un carácter de escape para los literales de cadena en el código fuente de Python, no en el shell de Windows (que es lo que Python usa en Windows para analizar los argumentos de la línea de comandos).

Ejecutando este simple script:

import os, sys, arcpy

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

Desde una herramienta de script ArcGIS 10.0 con un único parámetro de entrada de tipo Carpeta, se imprime "Verdadero" para cualquier carpeta existente.

blah238
fuente
Supongo que mi mayor error puede haber sido que una vez que el parámetro del cuadro de diálogo pasó su valor a sys.argv [2], luego pasé el contenido de sys.argv [2] a una variable llamada output_location para fines de legibilidad. Al pasar la ruta de sys.argv [2] a la variable output_location, es posible que se haya producido el corte. Lamentablemente, no puedo probar esta teoría ya que actualmente no estoy en mi máquina. Gracias por toda la retroalimentación.
lemuel
Eso tampoco lo explicaría.
blah238
2

Siento que puedes estar complicando demasiado las cosas aquí. ¿Por qué estás luchando para pasar el parámetro de entrada usando el %sformato de cadena? Dos ejemplos de código de trabajo:

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

O simplemente:

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

Y @ blah238 tiene razón. Si está haciendo esto como una herramienta ArcMap Toolbox, realmente debería estar usando arpcy.GetParameter(AsText).

RyanKDalton
fuente