Dynamic, script-based animations of object creation and deletion
In that case I propose 


preprocess the file into separate files per frame ( Alternatively create a cache dict if you have plenty of RAM, that way you avoid having to deal with writing/reading extra files :) )
store each cloud of atom types and their coordinates something like   


this: 

 C x y z
 C x y z
 C x y z
 N x y z
 N x y z 



write a file reader that can take each frame's file and 


on the first frame 


check if the object in the next step exists already, skip this step if it does.
create a vertex based mesh object for each type of atom ( ie create a vertex for every atom of one type and put those in an object named something like atom_cloud_C, and do the same for all other atom types ). Meaning, if your file only has 3 C atoms, that your  atom_cloud_C only has 3 verts.
on subsequent frames you read the next frame's file and overwrite the coordinates of each atom, for all atom types.

code: 

f_v = list(itertools.chain.from_iterable(verts))
mesh.vertices.foreach_set('co', f_v)
mesh.update()



This produces clouds of atoms as different objects, which get updated every frame.
Then create the spheres that represent each atom type (only need one sphere per atom type)
Then use the dupli feature set to Verts to duplicate the various spheres that represent the atom. (this is a low memory way to display many spheres )
instead of keyframing it all, you can attach a bpy.app.handlers.frame_change_pre to perform a function on each frame change (pre or post), examples for this can be found in the documentation.