を使用してarcpy
、私の目的は、さらに処理するためにフィーチャクラスをリストにストックすることです。各行は{'field name': value}
、ジオメトリを含む の辞書になります。
このタスクを達成するための最も Pythonic な方法は、リスト内包表記を使用することです。
fc = '/path/to/fc'
fields = [f.name for f in arcpy.ListFields(fc)] # get field list
features = [[row.getValue(f) for f in fields] for row in arcpy.SearchCursor(fc)]
この方法はデータに対して機能しますが、リスト内のジオメトリはすべて同じです (fc で最後に取得されたジオメトリ)。SearchCursor のこの動作は、既に StackOverflow でコメントされています。
別のアプローチを試しました:
fc = '/path/to/fc'
shape_field = arcpy.Describe(fc).shapeFieldName
# load geometry in a list
geom = arcpy.Geometry()
feat = [{shape_field: f} for f in arcpy.CopyFeatures_management(fc, geom)] # slow
# load data in a list
fields = [f.name for f in arcpy.ListFields(fc)]
data = [dict([(f, row.getValue(f)) for f in fields if f != shape_field]) for row in arcpy.SearchCursor(fc)] # slow
# merge
merge = zip(feat, data)
merge = [dict([(k, v) for adict in line for (k, v) in adict.items()]) for line in merge] # sorry for that...
それは私のデータセットで動作しますが:
- 遅いです。
- データと偉業が同じ順序であると断言するのが安全かどうかはわかりません。
それについて何か意見はありますか?