I am trying to combine ListDataframes, ListLayers and ListFields in one ArcPy code.
I can do it one by one (first list layers in one code, and then list fields in second code), but I am trying to do in one code. So, basically I want to list all data frames, layers, all layers with their projection and get field info on those layers (field name, field type). Code by code is not a problem, but combining two codes is.
So far, I have a piece of code, but I do not get results I want. I do get field name and type, but no layer names and dataframes. I know I also have to include Describe tool for spatial reference, but not sure where. This is my code so far. Works, but not as expected.
import arcpy
mxd = arcpy.mapping.MapDocument(r"CURRENT")
df = arcpy.mapping.ListDataFrames(mxd)[0]
lyrList = arcpy.mapping.ListLayers(mxd, "", df)
for lyr in lyrList:
if lyr.supports("dataSource"):
for field in arcpy.ListFields(lyr.dataSource):
print (field.type, field.name, field.aliasName)
for lyr in arcpy.mapping.ListLayers(mxd, df):
name = lyr.name
print name
del mxd
As I said, this is a result of piece of my code, And I get this:
00_BASE
SUBGROUP
shore_polygon
shore_polyline
sea
On this list, I would like to look like this:
00_BASE (This is layer name)
SUBGROUP (This is subgroup name)
shore_polygon (FID, Shape, ID) (ObjectID, Shape, Long)
shore_polyline (FID, Shape, ID) (ObjectID, Shape, Short)
sea (FID, Shape, Name) (ObjectID, Shape, Text)
EDIT 1: This code works for printing layer name, field name, and field type. Still can not get to print group and subgroup layer names.
import arcpy
mxd = arcpy.mapping.MapDocument(r"CURRENT")
df = arcpy.mapping.ListDataFrames(mxd, "Main Map")
lyrList = arcpy.mapping.ListLayers(mxd, "", df)
for lyr in lyrList:
if lyr.supports("dataSource"):
for field in arcpy.ListFields(lyr.dataSource):
print (lyr.name, field.name, field.type)
del mxd
And result looks like this:
(u'shore_polygon', u'FID', u'OID')
(u'shore_polygon', u'Shape', u'Geometry')
(u'shore_polygon', u'Id', u'Integer')
(u'shore_polyline', u'FID', u'OID')
Still want group and subgroup layer names, to look like this:
GROUP LAYER NAME
SUBGROUP NAME
(u'shore_polygon', u'FID', u'OID')
(u'shore_polygon', u'Shape', u'Geometry')
(u'shore_polygon', u'Id', u'Integer')
(u'shore_polyline', u'FID', u'OID')
lyr
loop, and you need to use list comprehensions to generate the field.name and field.alias lists, then you need to learn how to format stings to display those lists.