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?
fuente
arcpy.exists()
comando que puede jugar mejor con nombres de archivos y carpetas impares queos.path.exists
.arcpy.GetParameterAsText(1)
lugar desys.argv[2]
?Respuestas:
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"
) oos.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:
Una forma alternativa simple de lograr esto en su código sería asignar
sys.argv[2]
a una cadena y formatearla desde allí.fuente
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:
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.
fuente
Siento que puedes estar complicando demasiado las cosas aquí. ¿Por qué estás luchando para pasar el parámetro de entrada usando el
%s
formato de cadena? Dos ejemplos de código de trabajo:O simplemente:
Y @ blah238 tiene razón. Si está haciendo esto como una herramienta ArcMap Toolbox, realmente debería estar usando
arpcy.GetParameter(AsText)
.fuente