PyQGIS – Retrieving Layer Name Through Partial Name Match

layer-namelayerspyqgis

I'm trying to edit various layers through a plugin. Since I (and others) will be using it for multiple projects with similar structures, I need to be able to retrieve the layer's name considering it will have an extra code added to it which will change based on project.

PointLayer ABC1, PointLayerLayer DEF2, etc.
LineLayer ABC1, LineLayer DEF2, etc.

Using QgsProject.instance().mapLayersByName('layer name') I need the exact name only.

Best Answer

Here is how you could do this:

# get all layernames of project
names = [layer.name() for layer in QgsProject.instance().mapLayers().values()]
print(names)

# filter the list of layernames
filterednames = list(filter(lambda k: 'line' in k, names))
print(filterednames)

# iterate over this filtered list and get the layer
for layername in filterednames:
    currentlayer = QgsProject.instance().mapLayersByName(layername)
    # do something...
    print(layername)

Simply replace 'line' with your keyword to search for. This example will iterate over all layers having the letter sequence line in it.


Some more examples how to apply a filter more than once:

  1. basic
# get all layernames of project
layernames = [layer.name() for layer in QgsProject.instance().mapLayers().values()]

# filter the list of layernames; apply it as often as you want
linelayers = list(filter(lambda k: 'line' in k, layernames))
pointlayers = list(filter(lambda k: 'point' in k, layernames))
abclayers = list(filter(lambda k: 'abc' in k, layernames))
deflayers = list(filter(lambda k: 'def' in k, layernames))
#...
xyzlayers = list(filter(lambda k: 'xyz' in k, layernames))

# iterate over this filtered list and get the layer
for linelayer in linelayers:
    currentlinelayer = QgsProject.instance().mapLayersByName(linelayer)
    # do something...
for pointlayer in pointlayers:
    currentpointlayer = QgsProject.instance().mapLayersByName(pointlayer)
    # do something...
#...
  1. a little more advanced
# get all layernames of project
layernames = [layer.name() for layer in QgsProject.instance().mapLayers().values()]

# Define a list of filters
filternames = ['line','point','abc','def','xyz']

# Iterate over the filterlist
for currentfilter in filternames:
    # Apply the current filter
    filteredLayerlist = list(filter(lambda k: currentfilter in k, layernames))
    # Iterate over the current filtered layerlist
    for layer in filteredLayerlist:
        currentlayer = QgsProject.instance().mapLayersByName(layer)
        # do something general... or:
        if currentfilter == 'line':
            print('handle line layer')
            currentLinelayer = QgsProject.instance().mapLayersByName(layer)
        elif currentfilter == 'point':
            print('handle point layer')
            currentPointlayer = QgsProject.instance().mapLayersByName(layer)
        elif currentfilter in ('abc','def'):
            print('handle abc and def layers')
            currentAbcDefLayer = QgsProject.instance().mapLayersByName(layer)
        else:
            print('handle all other layers')
            currentOtherlayer = QgsProject.instance().mapLayersByName(layer)