Blender python script sets correct camera, but defaults to chosen animation frames camera on render
@batFINGER got me on the right path. I was cycling through renders using different cameras to create different views of a product so hopefully this will be of use to somebody.
Firstly and importantly, you have to prepare the file manually. Click on the animation tab, go to the Dope sheet, delete all the markers you had previously and just add one marker on the first frame (0). Rename that marker &quot;F_00&quot;.
Back to the scripting tab. In the code, create a list of the camera object names, assign a starting and ending frame number, in this case &quot;0&quot;. Select the timeline marker and assign a camera to the marker using the code below. Rendering code followed and as @SergeL said in  batFINGER's comment above, the new camera just replaced the previous one and the scene rendered perfectly from all angles.
import bpy
import mathutils
import sys

# Store the current scene inside a variable, that way we can access it later on

scene = bpy.context.scene

# store collection strings

x = bpy.data.collections
y = bpy.data.scenes[&quot;CONFIGURATOR 800 x 600&quot;].view_layers[&quot;ALL&quot;]
z = bpy.context.view_layer


###############################################################
########## CYCLE THROUGH THE CAMERAS AND RENDER ###############
###############################################################

camviews = [
            &quot;FMR ISO&quot;,
            &quot;FMR PAN DOWN&quot;,            
            &quot;FMR FULL FRONT&quot;
           ]

for camname in camviews:
    
    bpy.data.scenes[&quot;CONFIGURATOR 800 x 600&quot;].frame_start = 0
    bpy.data.scenes[&quot;CONFIGURATOR 800 x 600&quot;].frame_end = 0
    

    #################################################
    ##### I PUT MY SCENE RESET CODE HERE ############
    #################################################
 
    # change camera

    bpy.context.scene.timeline_markers[&quot;F_00&quot;].select = True
    bpy.context.scene.timeline_markers[&quot;F_00&quot;].camera = bpy.context.scene.objects[camname]

    ###############################################################
    ############ CODE TO SELECT WHAT OBJECTS TO RENDER ############
    ###############################################################

    # Make the plates visible and render

    sideplates = bpy.data.collections[&quot;RACK 1 - 1 RACK FRAME&quot;].children

    for s in sideplates:
        s.hide_render=False
        n = s.name

        # render 800 x 600 and save camera name and part name to a folder on the pc

        bpy.context.scene.cycles.samples = 1
        scene.render.resolution_x = 800
        scene.render.resolution_y = 600
        scene.render.resolution_percentage = 100
        scene.render.use_border = False
        scene.render.image_settings.file_format = 'PNG'
        bpy.data.scenes[&quot;CONFIGURATOR 800 x 600&quot;].render.filepath = '/BlenderPythonTest/Single Rack/Configurator/Rack Frame/%(2)s/800x600/%(1)s 800x600.png' % {&quot;1&quot; : n, &quot;2&quot; : camname} 
        bpy.ops.render.render(write_still = 1)
                
        s.hide_render=True