I find that the info object often does not have the exact key you are looking for, many different encoders use slightly different variants, or don't include it at all. My best advice is to print out the info for several of your files and look for patterns. Also there are some tools for working more directly with EXIF data, these might also be useful. Unfortunately this area is not really standard, so every solution is likely to break down sometimes.
Resolution info is optional in JPEG files (it's a part of the JFIF
standard, not JPEG itself) and even if present, it may not be
expressed in dots per inch. PIL only sets the "dpi" field if the
information is there, leaving it to your code to provide a suitable
default value (or behaviour) for your application. You can do e.g.
dpi = im.info.get("dpi", (72, 72))
If the JFIF header is present, but the resolution isn't specified as
DPI, you can check if the "jfif_unit" and "jfif_density" fields
contain information useful for your application; their contents are