[Numpy-discussion] odd ascii format and genfromtxt

Warren Weckesser warren.weckesser at enthought.com
Fri Feb 26 03:29:26 EST 2010


Ralf Gommers wrote:
> Hi all,
>
> I'm trying to read in data from text files with genfromtxt, and have 
> some trouble figuring out the right combination of keywords. The 
> format is:
>
> ['0\t\t4.000000000000000e+007,0.000000000000000e+000\n',
>  '\t9.860280631554179e-001,-1.902586503306264e-002\n',
>  '\t9.860280631554179e-001,-1.902586503306264e-002']
>
> Note that there are two delimiters, tab and comma. Also, the first 
> line has an extra integer plus tab (this is a repeating pattern). The 
> files are large, there's a lot of them, and they're generated by a 
> binary I can't modify.
>
> Here are some things I've tried:
>
> In [216]: np.genfromtxt('ascii2test.raw', invalid_raise=False)
> Out[216]: array([  0.,  NaN])
>
> In [217]: np.genfromtxt('ascii2test.raw', invalid_raise=False, 
> delimiter=['\t', ','])
> TypeError: cannot perform accumulate with flexible type
>
> In [228]: np.genfromtxt('ascii2test.raw', delimiter=['\t', ','], 
> dtype=[('intvar', '<i8'), ('fltvar', '<f8'), ('fltvar2', '<f8')])
> TypeError: cannot perform accumulate with flexible type
>
>
> Any suggestions?

The 'delimiter' keyword does not accept a list of strings.  If it is a 
list, it must be a list of integers that are the field widths.  In your 
case, that won't work.

You could try fromregex:

-----
In [1]: import numpy as np

In [2]: cat sample.raw
0        4.000e+007,0.00000e+000
    9.8602806e-001,-1.9025e-002
    9.8602806e-001,-1.9025e-002
123        5.0e6,100.0
    10.1,-2.0e-3
    10.2,-2.1e-3


In [3]: a = np.fromregex('sample.raw', '(.*?)\t+(.*),(.*)', 
np.dtype([('extra', 'S8'), ('x', float), ('y', float)]))

In [4]: a
Out[4]:
array([('0', 40000000.0, 0.0), ('', 0.98602805999999998, -0.019025),
       ('', 0.98602805999999998, -0.019025), ('123', 5000000.0, 100.0),
       ('', 10.1, -0.002), ('', 10.199999999999999, 
-0.0020999999999999999)],
      dtype=[('extra', '|S8'), ('x', '<f8'), ('y', '<f8')])

In [5]: a[0]
Out[5]: ('0', 40000000.0, 0.0)

In [6]: a[1]
Out[6]: ('', 0.98602805999999998, -0.019025)

In [7]: a['extra']
Out[7]:
array(['0', '', '', '123', '', ''],
      dtype='|S8')

In [8]: a['y']
Out[8]:
array([  0.00000000e+00,  -1.90250000e-02,  -1.90250000e-02,
         1.00000000e+02,  -2.00000000e-03,  -2.10000000e-03])
-----


Note that the first field of the array is a string, not an integer.  The 
string will be empty in rows that did not have the initial integer.  I 
don't know if that will work for you.


Warren

>
> Thanks,
> Ralf
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>   




More information about the NumPy-Discussion mailing list