Tuesday, 14 June 2016

python - How to get field names in pyqgis 2.0


I am trying to change an plugin from QGIS 1.8 to 2.0. In the 1.8 version I create a table of the field names like this:


layer = vlayer
provider = layer.dataProvider()
feat = QGSFeatrue()
allAttrs = provider.attributeIndexes()
provider.select(allAttrs)

fieldNames = []

while provider.nextFeature(feat)
fields = layer.pendingFields()
for (k, field) in fields.iteritems():
fieldNames.append(field.name())

I tried this for the 2.0 version with


layer = vlayer
fieldNames = []


for feature in layer.getFeatures():
fields = layer.pendingFields()
for (k, field) in fields.iteritems():
fieldNames.append(field.name())

But pendingFields() does not work for me. Is there now a new method to get the names of the fields?



Answer



It is simpler than with version 1.8:


layer = qgis.utils.iface.activeLayer()  

fields = layer.pendingFields()
field_names = [field.name() for field in fields]

or in one line


field_names = [field.name() for field in layer.pendingFields() ]

an after


for elem in layer.getFeatures():  
print dict(zip(field_names, elem.attributes()))
{u'adip': 17, u'dipdir': 130, u'tdip': 29}

{u'adip': 55, u'dipdir': 325, u'tdip': 75}
.....

Generally to explore a new function, I use the dir() or the see module to examine what's inside:


dir(fields)
['FieldOrigin', 'OriginEdit', 'OriginJoin', 'OriginProvider', 'OriginUnknown', '__class__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__len__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'append', 'at', 'clear', 'count', 'extend', 'field', 'fieldOrigin', 'fieldOriginIndex', 'indexFromName', 'isEmpty', 'remove', 'size', 'toList']

or


see(fields)
[] hash() help() len()

repr() str() .FieldOrigin() .OriginEdit
.OriginJoin .OriginProvider .OriginUnknown .append()
.at() .clear() .count() .extend()
.field() .fieldOrigin() .fieldOriginIndex()
.indexFromName() .isEmpty() .remove() .size()
.toList()

And you can see that there is a field() function so


print fields.field(0)
qgis.core.QgsField object at 0x163E39C0


and a field has a name, a type, a precision,...:


see(fields.field(0))
< <= == != >
>= hash() help() repr()
str() .comment() .displayString() .length()
.name() .precision() .setComment() .setLength()
.setName() .setPrecision() .setType() .setTypeName()
.type() .typeName()


so:


fields.field(0).name()
u'adip'
fields.field(0).type()
2
fields.field(0).typeName()
u'Integer'
fields.field(0).precision()
0
....





It is .field()


....
prov = layer.dataProvider()
prov.fields().field(0).name()
u'adip'
prov.fields().field(0).typeName()
u'Integer'


and


field_names = [field.name() for field in prov.fields()]

No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...