Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

The following is currently unsuccessful at fulfilling a table field join to a point shapefile in Qgis.
All instances of the join object will print the proper values, and no error is flagged when processing - but the target layer does not exhibit any effect.

Something missing?

    Heads = QgsVectorLayer(headCSV, 'Heads', 'ogr')
    grid = ftools_utils.getMapLayerByName(unicode('Grid'))
    joinObject = QgsVectorJoinInfo()
    joinObject.targetFieldName = str('ID')
    joinObject.joinLayerID =
    joinObject.joinFieldName = str('cellID')


The following returns 'None'. I expect this is actually supposed to return the field names to be joined? (e.g. - a clue to the mistake)

    print joinObject.joinFieldNamesSubset()


Added the following, and now the previous update command returns the accurate fields to be joined - yet the destination layer does not show 'joined' fields...

share|improve this question
Have you read Joining table to shapefile with pyQGIS already? – Germán Carrillo Feb 8 '15 at 13:13
indeed, this as well… – Katalpa Feb 8 '15 at 13:18
sould be noted that join works on layer added in the registry. Otherwise no update fields would happen. – Luigi Pirelli Mar 11 '15 at 11:49
@Luigi, Thanks for clarification! – Katalpa Mar 11 '15 at 12:32
up vote 5 down vote accepted

This has worked for me:

# Get input (csv) and target (Shapefile) layers

# Set properties for the join
joinObject = QgsVectorJoinInfo()
joinObject.joinLayerId =
joinObject.joinFieldName = csvField
joinObject.targetFieldName = shpField

The error you are facing is, believe it or not, by a typo in joinLayerId. The question is, why QGIS doesn't throw an error there?

share|improve this answer
You are exactly right. Works beautifully now. Highly appreciate the help. A mistake easily overlooked it seems without a syntax error. Thanks! – Katalpa Feb 8 '15 at 15:10
@gcarrillo "The question is, why QGIS doesn't throw an error there?" because your are creating a new python variable. Did you check if addJoin return false? – Luigi Pirelli Mar 11 '15 at 11:48
@LuigiPirelli addJoin returns True, giving no clue about any error or typo. – Germán Carrillo Mar 12 '15 at 16:25

If it's ok for you to use Processing algorithms for that, it's as simple as this (from the QGIS Python console):

import processing
res = processing.runalg("qgis:joinattributestable","/path/to/shape.shp","/path/to/table.csv","fieldShp","fieldTable","/path/to/output.shp")
layer = QgsVectorLayer(res['OUTPUT_LAYER'], "joined layer", "ogr")

You can have a look at the algorithm source code so that you decide whether you want to adapt it for your own script.

share|improve this answer
While this is a great alternative, the need is a 'virtual join', as accomplished from the properties menu of a layer. This is because the operation might be done repeatedly, and avoidance of data overhead is a must. – Katalpa Feb 8 '15 at 13:51
Well, you could still use temporary layers setting the last parameter of the algorithm to None, but I see your point. – Germán Carrillo Feb 8 '15 at 14:48

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.