Mais

Criando ferramenta na caixa de ferramentas Python para exportar lista de campos para o Excel?

Criando ferramenta na caixa de ferramentas Python para exportar lista de campos para o Excel?


Estou criando minha primeira ferramenta em uma caixa de ferramentas Python (* .pyt) para exportar uma lista de nomes de campos para o Excel. Eu tenho os seguintes bits de código:

import arcpy class Toolbox (object): def __init __ (self): self.label = "Toolbox" self.alias = "Field to Table" self.tools = [Tool] class Tool (object): def __init __ (self): self .label = "Ferramenta" self.description = "Exportar Campos para Tabela" self.canRunInBackground = Falso def getParameterInfo (self): param0 = arcpy.Parameter (displayName = "Shapefile", name = "shapefile", datatype = "DEShapefile" , parameterType = "Required", direction = "Input") param1 = arcpy.Parameter (displayName = "Field Table", name = "datafile", datatype = "DETable", parameterType = "Required", direction = "Output") params = [param0, param1] return params def isLicensed (self): return True def updateParameters (self, parameters): return def updateMessages (self, parameters): return def execute (self, parameters, messages): shapefile = params [0 ] .valueAsText fields = arcpy.ListFields (shapefile) datafile = params [1] .valueAsText spreds = open (datafile, 'w') para f nos campos: spreds.write (f.name + " n") spreds.close () Retorna

Em primeiro lugar, a parte de execução real do código funciona bem, como eu testei. Não tenho certeza do que há de errado ao converter para um arquivo .pyt.

Depois de fazer isso funcionar, há alguma maneira de criar um parâmetro dentro da ferramenta para criar um novo arquivo excel / dbf e executar o script com essas informações, em vez de ter que criar um primeiro, antes de executar o script. Espero que faça sentido.


Acredito que seu principal problema seja como os parâmetros são passados ​​para o execute. A definição de parâmetros de objeto funciona como uma função em que as declarações não são globais. Experimente:

def execute (self, params, messages): #params é sua lista de parâmetros de getParameterInfo shapefile = params [0] .valueAsText #first parameter from your list fields = arcpy.ListFields (shapefile) #capitalization maters excelfile = params [1]. valorAsTexto #segundo parâmetro da sua lista spreds = open (excelfile, 'w') para f nos campos: spreds.write (f.name + " n") spreds.close () return

Para obter mais informações: Acessando parâmetros em uma caixa de ferramentas Python

Além disso: Indente o objeto def, adicione a classe Toolbox (objeto) como mostrado neste exemplo e altere GPShapefile para DEShapefile ou GPLayer de acordo com os tipos de dados


A resposta de @jbosq aborda o problema de acesso aos parâmetros e seus erros de indentação.

No entanto, o código como está abrirá o caminho paraexcelfilecomo um arquivo de texto, não uma planilha do Excel e apenas escreva os nomes dos campos separados por uma nova linha neste arquivo de texto. Você precisa usarxlwt(para planilhas binárias .xls Excel 2003) ouopenpyxl(para planilhas .xlsx Excel 2007+ OOXML) ouarcpy.management.CreateTable/arcpy.da.InsertCursorem vez do python embutidoabrir()função.

Além disso (por comentário de @Paul), mudedireção = "entrada"paradireção = "Saída")para param1.

Finalmente, se você gravar os dados na planilha usandoxlwtouopenpyxlao invés dearcpy.management.CreateTable/arcpy.da.InsertCursorvocê precisa alterar o tipo de dados param1 deDETableparaDesfiladeiroe adicione um filtro, ou seja,param1.filter.list = ['xls'](se estiver usandoxlwt) ouparam1.filter.list = ['xlsx'](se estiver usandoopenpyxl).


Assista o vídeo: Модули Python 0: Установка pip, пилотный выпуск