1 votos

¿Utilizar carpetas de Windows como parámetros de ArcPy?

Estoy teniendo problemas al intentar realizar operaciones sencillas de gestión de carpetas en una caja de herramientas de ArcGIS python. En primer lugar aquí hay algunos fragmentos de código (he dejado fuera todo lo que no pertenece a este problema):

import os

def getParameterInfo(self):
    #define the parameters for the toolbox

    param = arcpy.Parameter(displayName="Destination Folder",
        name="in_destination",
        datatype="DEFolder",
        direction="Input")

    params = [param]
    return params

def execute(self, parameters, messages):

    #get the destination root folder parameter
    #I have also tried using .valueAsText but it does not solve the problem
    dest_root = parameters[0].value

    #if the folder does not exist create it
    if not os.path.exists(dest_root):
        os.makedirs(dest_root)

    #join path to store shapefiles to the root folder
    curr_path = os.path.join(dest_root,"/Shapefiles")

    #create folder to store shapefiles
    if not os.path.exists(curr_path):
        os.makedirs(curr_path)

    #start doing a bunch of stuff to create shapefiles

El problema que estoy teniendo es que el parámetro de la carpeta que crea ArcGIS es una cadena de caracteres sin esconder, por lo que si quisiera utilizar el C:\Temp como mi raíz de destino la variable dest_root en la función de ejecución tendría un valor de 'c: \temp '. Esto está causando problemas para todas las llamadas a los métodos os porque (creo) están escapando los caracteres que vienen después de la barra invertida.

He intentado sustituir el carácter de la barra invertida por una barra inclinada haciendo esto:

dest_root = dest_root.replace("\\","/")

pero esto no resuelve el problema porque la organización en la que trabajo utiliza los números de identificación de los empleados para los nombres de usuario del perfil de Windows. Así que si quiero utilizar la carpeta Documentos para un destino los escapes están siendo tratados como códigos hexadecimales:

dest_root = "C:\Users\678910\Documents"
dest_root = dest_root.replace("\\","/")
#dest_root is now equal to "C:/Users78910/Documents"

¿Me he perdido algo básico aquí? Esto me ha estado volviendo loco toda la mañana.

0 votos

Esto no es realmente una pregunta GIS por sí mismo Así que probablemente sea más adecuado para StackOverflow .

0 votos

Creo que esta pregunta encaja en esta comunidad. Ya que este problema es con el procesamiento de parámetros de ArcGIS. Considera las rutas como cadenas y no las escapa.

1 votos

La razón por la que lo he publicado como una pregunta GIS es que creo que el problema está relacionado con el entorno python de ArcGIS.

3voto

Farid Cher Puntos 5306

Para solucionar este mal comportamiento del procesamiento de los parámetros de la carpeta de arcgis, es necesario escapar de la cadena que viene del parámetro de la herramienta. Para ello, basta con añadir esta línea:

dest_root = parameters[0].value
#ouputs C:\Users\678910\Documents
dest_root = unicode(dest_root).encode('unicode-escape')
#outputs C:\\Users\\678910\\Documents

Y un problema con tu código es que no necesitas usar la barra con el método os.path.join.

curr_path = os.path.join(dest_root,"/Shapefiles")

se convierte en

curr_path = os.path.join(dest_root,"Shapefiles")

Caja de herramientas independiente de python para probar:

import os
import arcpy

'''Do not change the name of this class. It will break the toolbox.'''
class Toolbox(object):
    def __init__(self):
        '''Define toolbox properties (the toolbox anme is the .pyt filename).'''
        self.label = "Toolbox"
        self.alias = ""

        # List of tool classes associated with this toolbox
        self.tools = [Tool]

class Tool(object):
    def __init__(self):
        '''Define the tool (tool name is the class name).'''
        self.label = "Tool"
        self.description = ""
        self.canRunInBackground = False

    def getParameterInfo(self):
        #define the parameters for the toolbox

        param = arcpy.Parameter(displayName="Destination Folder",
            name="in_destination",
            datatype="DEFolder",
            direction="Input")
        #param.value = 'C:\12345'
        params = [param]
        return params

    def execute(self, parameters, messages):

        #get the destination root folder parameter
        #I have also tried using .valueAsText but it does not solve the problem
        dest_root = parameters[0].value
        dest_root = unicode(dest_root).encode('unicode-escape')
        #print dest_root
        arcpy.AddMessage(dest_root)
        #if the folder does not exist create it
        if not os.path.exists(dest_root):
            os.makedirs(dest_root)

        #join path to store shapefiles to the root folder
        curr_path = os.path.join(dest_root,"Shapefiles")

        arcpy.AddMessage(curr_path)
        #create folder to store shapefiles
        if not os.path.exists(curr_path):
            os.makedirs(curr_path)

Copie y pegue este código en un archivo .pyt y luego ejecute la herramienta.

0 votos

Le site \U se sigue interpretando como unicode, incluso durante encode('string_escape'). Esto tampoco funcionará.

0 votos

¡Así que hazlo unicode! Actualizada la respuesta

0 votos

¿Intentaste siquiera ejecutarlo? unicode(" C:\Users\678910\Documents ").encode('unicode-escape') -> ' C:\\\\Users78910\\\\Documents '

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