How can I triangulate a mesh without changing the object?
You can access the UV and Texture / Image information with bmesh using the custom data layers:

import bpy
import bmesh

ob = bpy.context.object
ob.update_from_editmode()
me = ob.data
vgroups = dict(enumerate(ob.vertex_groups.keys()))
vgroups_weights = [["%s: %.3f" % (vgroups[vg.group], vg.weight) for vg in v.groups] for v in me.vertices]

bm = bmesh.new()
bm.from_mesh(me)
bmesh.ops.triangulate(bm, faces=bm.faces)


uv_layer = bm.loops.layers.uv.active
if uv_layer is None:
    raise Exception("No active UV map (uv)")

uv_tex = bm.faces.layers.tex.active
if uv_tex is None:
    raise Exception("No active UV map (tex)")

for face in bm.faces:
    print("Face %i, Image = %s" % (face.index, getattr(face[uv_tex].image, "name", "")))

    for loop, vert in zip(face.loops, face.verts):
        print(" - Loop for Vertex %i, UV = %r" % (vert.index, loop[uv_layer].uv))
    for vert in face.verts:
        print(" - %s" % ", ".join(vgroups_weights[vert.index]))

bm.free()
del bm


Verts and loops of a face should match (first vertex - first loop etc.)