Get GPS coords with Addresses from CSV
Regarding your questions:


No idea :-)
Yes, you should be more specific. The easiest way to find out what exception it could raise is to run it without the guard and give it an address you know does not exist (I'm pretty sure the address "abdjdiehdbdocoegrvdkdoc" does not exist, for example). Note that you can catch multiple exceptions at once with except (Exception1, Exception2): (the parentheses are required) or with multiple except blocks (if you need to do different things, depending on the exception type).
Yes, your current if lat == 0 and lon == 0 approach does not scale to additional lookup services. It is also currently slightly broken, since you always use Google (you use the function before the check). You could iterate through a list of lookup functions until you find one that returns valid coordinates:




LOOKUP_FUNCS = get_lat_lon, google_lat_lon

def find_coordinates(address, lookup_funcs=LOOKUP_FUNCS):
    for function in lookup_funcs:
        lat, lon = function(address)
        if (lat, lon) != (None, None):
            return lat, lon
    return None, None


Note that I assume here that the functions return None, None, instead of 0, 0, which is arguably a better value for something non-existing. Theoretically, some address could actually be at 0, 0. Note also that csv.writer translates None to "", when writing to a file (see the documentation).


A main that does as much as yours is fine, IMO, if this is the only thing this script does. But you might still want to rename it to add_lat_lon(in_file, out_file) or something like this, to be able to import the actual functionality in some other script.In your new main block (or directly under the if __name__ == '__main__': guard), you could then call that function.
It is perfectly fine to return tuples.


Some additional notes:


You should add docstrings to your functions to document what they do.
csv.writer has a writerows method that allows you to directly pass a list of rows. So you can just do writer.writerows(info).
Instead of print(addr[:len(addr)-1]) you can just do print(addr[:-1])