[GIS] Writing PyQGIS script to modify layer (add field and fill it) inside QGIS

pyqgisqgis-3

I have the following PyQGIS script with QGIS 3 that tries to ask for a layer, add a new field in that layer and modify the value of this field. But the code doesn't work. I get either Seems there is no valid script in the file when I use layer = QgsVectorLayer(Layer) or AttributeError: 'NoneType' object has no attribute 'isValid' when I use QgsProcessingUtils.mapLayerFromString :

##Layer=vector
context = QgsProcessingContext()
layer= QgsProcessingUtils.mapLayerFromString(Layer, context)

layer.startEditing()

if layer.dataProvider().fieldNameIndex("new_col_name") == -1:
    layer.dataProvider().addAttributes([QgsField("new_col_name", QVariant.String)])
layer.updateFields()

id_new_col= feuilles.dataProvider().fieldNameIndex("new_col_name")

for feature in layer.getFeatures():
  column_value= feature["column"]
  ... some operations ...
  layer.changeAttributeValue(feature.id(), id_new_col, new_column_value)

layer.commitChanges()

Best Answer

Not sure how to prompt for a layer, but working code below (with a shapefile) uses the currently selected layer. Note that the new field name was shortened due to name length constraints on shapefiles.

layer = iface.mapCanvas().currentLayer()
layer.startEditing()

if layer.dataProvider().fieldNameIndex("new_col_na") == -1:
    layer.dataProvider().addAttributes([QgsField("new_col_na", QVariant.String)])
    layer.updateFields()

id_new_col= layer.dataProvider().fieldNameIndex("new_col_na")

for feature in layer.getFeatures():
    layer.changeAttributeValue(feature.id(), id_new_col, "val")

layer.commitChanges()
Related Question