仅将某些列导出到ArcGIS for Desktop中的CSV文件?


15

我已经使用arcpy编写了python脚本,该脚本将面要素类输出到File Geodatabase中。我添加了将属性导出到单独的CSV文件的功能。我正在使用在这篇文章中找到的代码,效果很好。但是,该代码将导出要素类中的每一列。我只是想导出不具有下列名称字段:OBJECTIDShape,或Shape_Length

我的CSV文件生成成功,并且正确包含OBJECTIDShape_Length字段。但是,该Shape字段写入文件。写入该字段的示例值是:

<geoprocessing describe geometry object object at 0x28CB90A0>

我添加了一行以打印遍历它们的字段名称,令人惊讶的Shape是,它没有被打印。就像ArcGIS正在隐藏它或给它起其他名字一样。

我的函数的代码如下:

def exportToTable():
    """ 
        Exports the final outputs to a CSV File.
    """

    # Create path to CSV File (note the varialbe outputPath is declared elsewhere).
    CSVFile = outputPath+'\\FinalOutput.csv'
    arcpy.AddMessage("Created CSV File: %s" %CSVFile)

    # Get all fields in FinalOutput feature class and remove unwanted fields.
    fields = arcpy.ListFields('FinalOutput')
    for field in fields:
        arcpy.AddMessage("Field.name is:"+field.name) #not printing 'Shape' field name
        if field.name in (['OBJECTID', 'Shape', 'Shape_Length']):
            fields.remove(field)

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

    # Use a search cursor to iterate through the rows of the table and write them to the CSV file.
    rows = arcpy.SearchCursor('FinalOutput')
    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()

有人知道这是怎么回事吗?


我修改了代码以遵循@sgrieve的建议,但它仍在编写该Shape字段。如果我添加一行以在遍历字段名称时打印它们,它会列出字段之外的所有Shape字段,但仍会写入CSV。它还将面的X和Y坐标添加为两个新列,并且这些列不再与列名对齐。

我修改了@sgrieve声明以下字段的行:

fields = [f.name for f in arcpy.ListFields('FinalCadastre') if f.type <> 'Geometry']

新代码可以正常工作,但我仍然不确定问题出在哪里。有人知道发生了什么吗?这个Shape领域怎么办?


您需要在这里使用Python吗?使用图层“属性”的“字段”选项卡可以很容易地隐藏不需要的字段。然后从打开的属性表中将数据导出为文本文件(CSV)格式,以获取所需的字段。
PolyGeo

是的,我希望将此添加到我的脚本中。这是客户的要求。
Fezter

其他人知道这是怎么回事吗?有谁知道为什么将Shape字段写入文件?尽管@sgrieve的代码可能会改进我的代码,但并不能解决问题。
Fezter

1
我的解决方法是使用MakeTableView,然后使用TableToTable。如果您的方法不可行,这可能是“丢失” Shape字段的另一种方法。
PolyGeo

Answers:


14

我使用了10.1中引入的da模块简化了代码并纠正了错误。它大大简化了使用游标的数据读取,并且与该with命令结合使用时,与使用旧文件访问方法相比,该代码应更稳定。

它通过列出所有字段的列表,然后从列表中删除不需要的字段来工作。这可以在列表理解中完成,但是会很混乱而且不合Python。一旦创建了所需字段的列表,它将与da模块一起使用,以将这些字段中的所有数据读入光标。然后可以使用另一个列表理解来循环连接并写入所有文件。这具有为大于0的任意数量的字段工作的好处。

import arcpy

fc = 'C:\\antenna_shp\\cables.shp'
CSVFile = 'C:\\antenna_shp\\FinalOutput.csv'

fields = [f.name for f in arcpy.ListFields(fc)]

for i,f in enumerate(fields):
    if f == 'Shape' or f == 'Shape_Length' or f == 'OBJECTID':
        del fields[i]

with open(CSVFile, 'w') as f:
    f.write(','.join(fields)+'\n') #csv headers
    with arcpy.da.SearchCursor(fc, fields) as cursor:
        for row in cursor:
            f.write(','.join([str(r) for r in row])+'\n')

谢谢@sgrieve。我复制了您发布的代码,并得到了几乎是我想要的CSV文件。但是有一些问题。1. Shape字段名称仍在写入,但Shape值未写入。2.现在,在表的开头添加了两个新列,有效地将这些列向右移动。它们的列似乎是多边形的X和Y坐标。
Fezter

3
好的,我想我已经解决了。Shape字段发生了某些情况-可能是因为它是一种几何类型。因此,我将您声明的行修改为fields以下内容:fields = [f.name for f in arcpy.ListFields('FinalCadastre') if f.type <> 'Geometry'] 达到目的。不知道为什么没有它就行不通。
Fezter

2

我认为我遇到了同样的问题,并发现了未删除“形状”字段的原因。使用此循环时:

if field.name in (['OBJECTID', 'Shape', 'Shape_Length']):
    fields.remove(field)

我发现它实际上只是删除其他所有字段。因此,它将首先循环通过,删除“ OBJECTID”,然后将“ Shape”字段移到列表中“ OBJECTID”先前保留的位置,因此将其移至下一个,即“ Shape_Length”。

因此,并不是阻止Shape几何图形被删除的具体原因,而是使用此脚本时,它将删除所有其他字段的事实。


好主意,在这种情况下,创建多个if语句(而非elifs)可以解决问题。
Sleep6

循环更改列表不是一个好主意。您会得到意想不到的结果。看到我有类似问题的这篇文章
Fezter

0

解决此问题的一个关键是确定对象ID和几何的非用户定义字段的专有名称。几何字段的类型为Double,在这种情况下无济于事。使用describe函数,可以为文件类型中的这些字段确定适当的名称(例如,shapefile v文件gdb等;减轻了很多麻烦,因为即使在同一文件类型中,oid有时也会发生变化...)。

fc = 'path to my featureclass'
desc = arcpy.Describe(fc)
fields = [f.name for f in arcpy.ListFields(fc) if f.name not in (desc.OIDFieldName, desc.areaFieldName, desc.lengthFieldName), desc.shapeFieldName)]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.