[GIS] Renaming field in attribute table via PyQGIS

fields-attributespyqgis

How can I rename a field in PyQGIS?

I tried:

for field in layer.pendingFields():
    if field.name() == 'old':
        layer.startEditing()
        oldname = field.name()
        field.setName('new')
        newname = field.name()
        print(u'Old name: {}, New name: {}'.format(oldname,newname))
        layer.commitChanges()

This code print 'Old name: old, New name: new', but in attribute table is field name still 'old'.

Best Answer

In PyQGIS 3 use this one:

layer = iface.activeLayer()
for field in layer.fields():
    if field.name() == 'old_fieldname':
        with edit(layer):
            idx = layer.fields().indexFromName(field.name())
            layer.renameAttribute(idx, 'new_fieldname')

Or try this function:

def rename_dp_field(rlayer, oldname, newname):
  findex = rlayer.dataProvider().fieldNameIndex(oldname)
  if findex != -1:
    rlayer.dataProvider().renameAttributes({findex: newname})
    rlayer.updateFields()