2 votos

Exportar clases de entidades en geodatabase a CSVs

Estoy tratando de exportar clases de entidades dentro de una geodatabase al formato CSV usando "Exportar atributo de entidad a ASCII" en ArCGIS. Estoy recibiendo el siguiente error

Traceback (most recent call last):
  File "c:\program files (x86)\arcgis\desktop10.2\ArcToolbox\Scripts\ExportXYV.py", line 159, in 
    export = setupXYV()
  File "c:\program files (x86)\arcgis\desktop10.2\ArcToolbox\Scripts\ExportXYV.py", line 49, in setupXYV
    outFieldNames = outFieldNames)
  File "c:\program files (x86)\arcgis\desktop10.2\ArcToolbox\Scripts\ExportXYV.py", line 129, in exportXYV
    formatValue = LOCALE.format(localeDict[field], value)
  File "C:\Python27\ArcGIS10.2\lib\locale.py", line 196, in format
    return _format(percent, value, grouping, monetary, *additional)
  File "C:\Python27\ArcGIS10.2\lib\locale.py", line 202, in _format
    formatted = percent % value
TypeError: not all arguments converted during string formatting

Aquí está el script de Python que estoy usando

import arcpy
from arcpy import env
import os, sys
arcpy.CheckOutExtension("spatial")    
arcpy.env.overwriteOutput = True

#Configurar entorno
workspace = r'L:\Simulation\Output\PoolVariables.gdb'

# Establecer variables locales
outWorkspace = r'L:\Simulation\Output\CreateCSV'

feature_classes = []
for dirpath, dirnames, filenames in arcpy.da.Walk(workspace, datatype = "FeatureClass", type = "Point"):
    for filename in filenames:
        feature_classes.append(os.path.join(dirpath, filename))

#print feature_classes

# Recorrer la lista de feature_classes

try:
    for fc in feature_classes:
        field_names =[f.name for f in arcpy.ListFields(fc)]
        print field_names
        #arcpy.ExportXYV_stats(fc, field_names, "COMMA",  )
        name = os.path.basename(fc)

    # Extraer solo el nombre base de la FC
        arcpy.ExportXYv_stats(fc, field_names,"COMMA",name, "ADD_FIELD_NAMES")

except:
    print arcpy.GetMessages()

¿Alguien podría explicar qué está sucediendo aquí?

3voto

Flinkman Puntos 4821

Veo el problema... independientemente del formato que se elija se escribe un .dbf. Bueno, eso ciertamente ha cambiado desde la última vez que usé esas herramientas. Dado que estás en python tal vez una pequeña rutina podría ayudar aquí:

def WriteCsv(InFC,OutTab):
    print("Exportando %s a %s" % (InFC,OutTab))
    with open(OutTab,'w') as OutFile:
        FieldNames = [x.name for x in arcpy.ListFields(InFC)] # convertir campos a nombres..

        # omitir el campo de forma, de todos modos no se imprimiría bien
        desc = arcpy.Describe(InFC)
        if (desc.datasetType == 'FeatureClass'):
            try:
                FieldNames.remove(desc.shapeFieldName)
            except:
                arcpy.AddWarning("No se puede omitir el campo de forma, quizás no exista")

        # imprimir la fila de encabezado en el archivo de texto
        OutFile.write(','.join(FieldNames)) # formato de coma para los nombres de campo
        OutFile.write('\n')                 # nueva línea

        with arcpy.da.SearchCursor(InFC,FieldNames) as Scur:
            for row in Scur:
                OutFile.write(','.join(map(str,row))) # formato de coma para la fila
                OutFile.write('\n')                   # nueva línea

Lo cual interactuaría con tu programa de esta forma:

import os, sys, arcpy
# from arcpy import env                 # no es necesario - especificado implícitamente en este guion
# arcpy.CheckOutExtension("spatial")    # no es necesario - no se usan herramientas de arcpy.sa

arcpy.env.overwriteOutput = True

def WriteCsv(InFC,OutTab):
    with open(OutTab,'w') as OutFile:
        FieldNames = [x.name for x in arcpy.ListFields(InFC)] # convertir campos a nombres..
        desc = arcpy.Describe(InFC)
        if (desc.datasetType == 'FeatureClass'):
            try:
                FieldNames.remove(desc.shapeFieldName)
            except:
                arcpy.AddWarning("No se puede omitir el campo de forma, quizás no exista")
        OutFile.write(','.join(FieldNames)) # formato de coma para los nombres de campo
        OutFile.write('\n')                 # nueva línea
        with arcpy.da.SearchCursor(InFC,FieldNames) as Scur:
            for row in Scur:
                OutFile.write(','.join(map(str,row))) # formato de coma para la fila
                OutFile.write('\n')                   # nueva línea

#Establecer la configuración del entorno
workspace = r'L:\Simulation\Output\PoolVariables.gdb'

# Establecer variables locales
outWorkspace = r'L:\Simulation\Output\CreateCSV'

feature_classes = []
for dirpath, dirnames, filenames in arcpy.da.Walk(workspace, datatype = "FeatureClass", type = "Point"):
    for filename in filenames:
        feature_classes.append(os.path.join(dirpath, filename))

# Recorrer la lista de feature_classes
try:
    for fc in feature_classes:
        name = os.path.join(outWorkspace, os.path.basename(fc) + ".csv") 
        WriteCsv(fc,name)

except:
    print arcpy.GetMessages()

Algunos consejos:

  • El uso de '.'.join(map(str,row)) proviene de un post de stack overflow (gracias Mark Biek), el map es importante si la fila contiene algún número (como FID) para hacer toda la lista una lista de cadenas.
  • El uso de '\n' como separador de línea es soportado por este post de stack overflow (gracias sorin), aparentemente no hay necesidad de os.linesep ya que python entenderá lo que estás intentando hacer e insertará el carácter correcto de todos modos... No uso Mac o Linux así que no puedo confirmar.

3voto

Patkos Csaba Puntos 21

Estoy usando algo como esto con gran éxito.

import arcpy, os, csv 
inTables = r"rutaAlEspacioDeTrabajo"
    for dirpath, dirnames, filenames in arcpy.da.Walk(inTables, datatype="Tabla", type="TODO"):
        for tableName in filenames:
            print "Agregando tablas de " + tableName + " a " + newTable
            arcpy.Append_management(os.path.join(dirpath, tableName), newTable, "NO_PRUEBA")

            CSVFile = r"rutaAlCSVdeSalida.csv"
            fields = arcpy.ListFields(newTable)
            fieldNames = [field.name for field in fields]

            with open(CSVFile, 'w') as f:
                dw = csv.DictWriter(f,fieldNames)
                dw.writeheader()

            with arcpy.da.SearchCursor(newTable,fieldNames) as cursor:
                for row in cursor:
                    dw.writerow(dict(zip(fieldNames,Utf8EncodeArray(row))))
                print "¡convertido " +  masterTable + " a un archivo CSV!"
            del row, cursor

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