One way to access mesh edge data is through:
bpy.context.scene.objects[OBJECTNUM].data.edges[EDGENUM]
OBJECTNUM and EDGENUM are indexes. For example, this would give you the first edge (0) of the second object (1) in your scene:
>>> bpy.context.scene.objects[1].data.edges[0]
Moving this edge would be pretty easy, you would just find out what vertices the edge you want to move is using and then the vertices coordinate values. To extend on the above example:
>>> print( bpy.context.scene.objects[1].data.edges[0].vertices[0])
0
>>> print( bpy.context.scene.objects[1].data.edges[0].vertices[1])
1
The first edge in this example is based off of vertices 0 and 1. To see what their current local coordinates are you could use:
>>> bpy.context.scene.objects[1].data.vertices[0].co
<Vector (-2.0000, -2.0000, 0.0000)>
>>> bpy.context.scene.objects[1].data.vertices[1].co
<Vector (2.0000, -2.0000, 0.0000)>
Then you can change the coordinates using assignment:
>>> bpy.context.scene.objects[1].data.vertices[0].co[0] = -3
>>> bpy.context.scene.objects[1].data.vertices[0].co[1] = -1
>>> bpy.context.scene.objects[1].data.vertices[0].co[2] = 1
The code has the ">>> " in it because I copied it over from Blender’s Python Console. If you need a quick overview of getting around the Python Console, these are 2 videos I would recommend:
I’m not as sure about duplicating or extruding edges, I haven’t looked into that myself. I think the bmesh ops page should have some info on how to do it:
https://docs.blender.org/api/blender_python_api_2_78a_release/bmesh.ops.html
This page also has a good overview of a Blender mesh’s base level geometry, but it’s in Japanese. Here’s a google translated version.