¿Exportar tabla a archivo XYZ ASCII a través de ArcPy?


23

Estoy buscando una manera de exportar una tabla ArcGIS (creada con la herramienta Muestra ) a un archivo de texto a través de ArcPy.

Puedo hacer esto en ArcGIS a través del menú contextual haciendo clic derecho en la tabla, pero no he encontrado una manera de escribir esto.

Respuestas:


31

Puede hacerlo usando un cursor para tomar los datos de su tabla y escribir en un archivo de texto delimitado por comas.

EDITAR: estoy agregando un bloque de código más conciso para realizar la tarea usando el csvmódulo de Python

Nueva respuesta usando el cursor arcpy.da:

import arcpy,csv

table =r'c:\path\to\table'
outfile = r'c:\path\to\output\ascii\text\file'

#--first lets make a list of all of the fields in the table
fields = arcpy.ListFields(table)
field_names = [field.name for field in fields]

with open(outfile,'wb') as f:
    dw = csv.DictWriter(f,field_names)
    #--write all field names to the output file
    dw.writeheader()

    #--now we make the search cursor that will iterate through the rows of the table
    with arcpy.da.SearchCursor(table,field_names) as cursor:
        for row in cursor:
            dw.writerow(dict(zip(field_names,row)))

Nueva respuesta usando el cursor de estilo antiguo:

import arcpy,csv

table =r'c:\path\to\table'
outfile = r'c:\path\to\output\ascii\text\file'      

#--first lets make a list of all of the fields in the table
fields = arcpy.ListFields(table)
field_names = [field.name for field in fields]

with open(outfile,'wb') as f:
    w = csv.writer(f)
    #--write all field names to the output file
    w.writerow(field_names)

    #--now we make the search cursor that will iterate through the rows of the table
    for row in arcpy.SearchCursor(table):
        field_vals = [row.getValue(field.name) for field in fields]
        w.writerow(field_vals)
    del row

Vieja respuesta:

import arcpy

table =r'c:\path\to\table'
outfile = r'c:\path\to\output\ascii\text\file'


#--first lets make a list of all of the fields in the table
fields = arcpy.ListFields(table)

i = 1
f = open(outfile,'w')
for field in fields:
    #--write all field names to the output file
    if i < len(fields):
        f.write('%s,' % field.name)
        i += 1
    else:
        f.write('%s\n' % field.name)

#--now we make the search cursor that will iterate through the rows of the table
rows = arcpy.SearchCursor(table)
for row in rows:
    i = 1
    for field in fields:
        if i < len(fields):
            f.write('%s,' % row.getValue(field.name))
            i += 1
        else:
            f.write('%s\n' % row.getValue(field.name))
del rows
f.close()

Me alegro de poder ayudarte @Toni
Jason

1
@ Jason - Gracias, esto fue muy útil. Soy nuevo, así que no tengo la reputación de comentar tu respuesta aceptada. Creo que hay un pequeño error en la nueva respuesta que usa un cursor arcpy.da. with arcpy.da.SearchCursor(table) as cursor:debería serwith arcpy.da.SearchCursor(table, field_names) as cursor:

Buena captura @TylerG, he editado la respuesta para incluir la lista de campos requeridos por el cursor de acceso a datos. Gracias.
Jason

8

Es posible que desee el "Exportar atributo de característica a ASCII", ingeniosamente llamado arcpy.ExportXYv_stats

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//005p0000003v000000

import arcpy

feature = "path to feature here"
# fieldnames must be explicitly provided. Note that you will get additional fields based on the feature type (e.g., "XCoord" and "YCoord" for point features)
fieldnames = [X.name for X in arcpy.ListFields(feature)]
# delimiter options "SPACE", "COMMA", or "SEMI-COLON"
# header options "ADD_FIELD_NAMES" or "NO_FIELD_NAMES"
arcpy.ExportXYv_stats(feature, fieldnames, "SPACE", "path to outfile", "ADD_FIELD_NAMES")

¡+1 por detective! Esto funciona de forma interactiva pero no tan bien en un modelo o script, porque los nombres de campo deben especificarse.
Matt Wilkie

1

Aquí hay un fragmento de código que uso. Me ayuda a generar todos mis archivos de salida en un archivo .txt con un rango de 0,100. Espero que ayude

for x in xrange(0,100):
    if os.path.isfile(outfolder + "/" + "outputs" + str(x) +".shp" ):
       inFeatures = "selected_features" + str(x) +".shp"
       export_ASCII = "ASCII " + str(x) +".txt"
       arcpy.ExportXYv_stats(inFeatures, ["Cur1_pr2","Cur3_pl1","slp1"],"SPACE", export_ASCII,"ADD_FIELD_NAMES")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.