Reading a file with Fortran formatted small floats, using numpy
Question: I am trying to read a data file written by a Fortran program, in which every
once in a while there is a very small float like `0.3299880-104`. The error
message is:

    
    
    >np.loadtxt(filename, usecols = (1,))
    
      File "/home/anaconda2/lib/python2.7/site-packages/numpy/lib/npyio.py", line 928, in loadtxt
        items = [conv(val) for (conv, val) in zip(converters, vals)]
    
      File "/home/anaconda2/lib/python2.7/site-packages/numpy/lib/npyio.py", line 659, in floatconv
        return float(x)
    
    ValueError: invalid literal for float(): 0.3299880-104
    

Can I do something to make Numpy able to read this data file anyway?


Answer: As **@agentp** mentioned in the comments, one approach would be to use the
`converters=` argument to
[`np.genfromtxt`](http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.genfromtxt.html)
to insert the `e` characters before casting to float:

    
    
    import numpy as np
    
    # some example strings
    strings = "0.3299880-104 0.3299880+104 0.3299880"
    
    # create a "dummy file" (see http://stackoverflow.com/a/11970414/1461210)
    try:
        from StringIO import StringIO     # Python2
        f = StringIO(strings)
    except ImportError:
        from io import BytesIO            # Python3
        f = BytesIO(strings.encode())
    
    c = lambda s: float(s.decode().replace('+', 'e').replace('-', 'e-'))
    
    data = np.genfromtxt(f, converters=dict(zip(range(3), [c]*3)))
    
    print(repr(data))
    # array([  3.29988000e-105,   3.29988000e+103,   3.29988000e-001])
    

