将列表传递给另一个函数

时间:2014-08-04 15:54:59

标签: python function for-loop arcpy

我正在使用python模块https://gis.stackexchange.com/a/5943/16793来导出SDE数据库中的要素类列表。

 import os, csv, arcpy, arcplus
>>> fcs = arcplus.listAllFeatureClasses("Database Connections\\Connection to oracle.sde\\BASINS.ACF")

输出是一个列表:

[u'BASINS.ACF_FL_SUB', u'BASINS.ACF_CHATTAHOOCHEE_BASIN', u'BASINS.ACF_CHIPOLA_BASIN', u'BASINS.ACF_CHIPOLA_AL']

为了将此列表传递给另一个函数,我在字典中为每个元素添加了一个字符串:

mylist = ['Database Connections\\Connection to oracle.sde\{0}'.format(i) for i in fcs]

看起来像:

print mylist[0]
Database Connections\Connection to oracle.sde\BASINS.ACF_FL_SUB

我想将此列表传递给另一个函数arcpy.ListFields(dataset),它将返回每个要素类的字段:

  
    
      

fn = [f.name for f in arcpy.ListFields(mylist [0])]

    
  
>>> print fn
[u'OBJECTID', u'HUC', u'BASIN', u'NAME', u'ACRES', u'SHAPE', u'SHAPE.AREA', u'SHAPE.LEN']

我正在试图弄清楚如何将fcs中的列表传递给函数arcpy.ListFields并将结果写入csv文件,但所需的循环结构确实给我带来了麻烦。我是这方面的新手,Python文档让我转过身来。任何指针都会有所帮助。

_________________________ ETC __________________________________________________

@Tony您的解决方案非常有效。虽然我尝试在较大的地理数据库上使用listAllFeatureClasses,但我没有足够的权限来读取某些属性,这会产生IOError:数据库连接\连接到oracle.sde \ LAND.LANDS \ LAND_POINTS不存在。我正在研究如何处理这个问题,并继续列表中的下一个要素类。也许尝试/继续?

1 个答案:

答案 0 :(得分:1)

为列表中的每个项目调用arcpy.ListFields:

 fns = [[f.name for f in arcpy.ListFields( list_entry )] for list_entry in mylist]

这将为您提供一个列表列表,其中fns [0]是条目mylist的函数[0]

可能更容易使用的是字典:

 fns_dict = dict( [ (list_entry, [f.name for f in arcpy.ListFields( list_entry ) ] )
                                       for list_entry in mylist ] )

使用示例中的数据:

 fns_dict["BASINS.ACF_FL_SUB"] should be 
 [u'OBJECTID', u'HUC', u'BASIN', u'NAME', u'ACRES', u'SHAPE', u'SHAPE.AREA', u'SHAPE.LEN']