8 votos

Python - formateo de cadenas de ruta y comprobación de la existencia de una ruta

Me gustaría utilizar el siguiente código para determinar si existe una ruta. La ruta que me gustaría comprobar 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 los parámetros es carpeta, esta ruta de la carpeta se pasa a sys.argv[2] en mi código siguiente.

{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 indicara explícitamente la ruta de la carpeta. Por ejemplo cualquiera de los tres siguientes 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 como la ruta es decir ( C:\Data\Hardwar\Folder ) se está pasando de mi parámetro a sys.argv[2] la primera letra después de \N se está escapando y con razón.
¿Cómo puedo formatear la ruta en sys.argv[2] a un formato de ruta aceptable para python?

11voto

Markus Olsson Puntos 12651

Como has descubierto, las rutas de Windows contienen una sola barra invertida, pero en Python una sola barra invertida es un carácter de escape .

Tienes varias opciones:

1) Puede utilizar un cadena bruta ( r"stringgoeshere" ), o os.path.normpath() como se detalla en esta entrada del blog .

2) Para que Python entienda que una cadena contiene una ruta es necesario utilizar doble barra invertida.

Por lo tanto, su ruta debe tener este formato:

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

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

3voto

auramo Puntos 161

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

Ejecutando este sencillo script:

import os, sys, arcpy

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

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

2voto

aditya Puntos 111

Me parece que estás complicando demasiado las cosas. ¿Por qué estás luchando para pasar el parámetro de entrada utilizando el %s ¿formateo de cadenas? Dos ejemplos de código que funcionan:

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 usted está haciendo esto como una herramienta de la caja de herramientas de ArcMap, usted debe realmente estar usando arpcy.GetParameter(AsText) .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X