I have a shapefile with almost 50,000 features and 2 fields. I want to change all the attribute values of the second field, and I remember that in QGIS 2 there was a way to save to disk ONLY at the end of the iteration.
1st way
layer_provider = layer.dataProvider()
layer.startEditing()
for f in features:
id = f.id()
avalue = f.attributes()[0] /10
attr_value = {1:avalue}
layer_provider.changeAttributeValues({id:attr_value})
layer.commitChanges()
layer.updateFields()
2nd way
with edit(layer):
for feature in layer.getFeatures():
feature['DN'] = feature['DN10']/10
layer.updateFeature(feature)
Please, tell me which way saves just once the shapefile?
Tried also:
start_time = time.time()
print('Working..........')
with edit(layer):
for feature in layer.getFeatures():
if feature['DN10'] > 0:
feature['DN'] = feature['DN10']/10
layer.updateFeature(feature)
else:
feature['DN'] = 0
layer.updateFeature(feature)
elapsed_time = (time.time() - start_time) / 60
print('End processing in '+ str(elapsed_time) + ' min')
I remember, however, that there was a way to save to sourcefile just once, after the end of iteration. I've used it some 8 years ago in a plugin I made, but I can't find it
New try with:
start_time = time.time()
print('Working..........')
field_idx = layer.fields().indexOf('DN')
with edit(layer):
for feature in layer.getFeatures():
if feature['DN10'] > 0:
new_value = feature['DN10']/10
layer.changeAttributeValue(feature.id(), field_idx, new_value)
else:
new_value = 0
layer.changeAttributeValue(feature.id(), field_idx, new_value)
elapsed_time = (time.time() - start_time) / 60
print('End processing in '+ str(elapsed_time) + ' min')
Nothing, never finished