2014-01-09 35 views
1

我有一个标准格式的csv输入文件,其中包含一个凌乱的标题,然后是35列和8760行的数组。所有这些数据都是数字,除了第6列,这是文本。我曾尝试允许genfromtxt()自己弄清楚这一点,但最终该专栏转向nan s,我相信因为没有引号。在csv文件中读取一列中间的字符串

目前,我正在读这个数组如下:

WeaData = np.genfromtxt(FileIn, delimiter=",", skip_header=8) 

我试图与

WeaData = np.genfromtxt(FileIn, delimiter=",", skip_header=8, dtype=(float,float,float,float,float,str,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float)) 

WeaData = np.genfromtxt(FileIn, delimiter=",", skip_header=8, dtype=[float for n in range(5)]+['S10']+[float for n in range(29)]) 

,但没有运气手动指定列类型。我相信我的语法在第一个选项中是错误的,第二个返回空白数组。有没有简单的方法来做到这一点,最好不指定35列类型?

这里有三行我的csv文件供参考,在我不关心的标题后面。

1966,1,1,1,60,A7A7A7A7*0?0?0?0?0?0?0?0A7A7A7A7A7A7F8F8A7E7,3.9,1.7,86,102400,0,0,264,0,0,0,0,0,0,0,230,2.1,0,0,24.1,77777,0,999999999,8,0.1000,0,88,0.000,0.0,0.0 
1966,1,1,2,60,A7A7A7A7*0?0?0?0?0?0?0?0A7A7A7A7A7A7F8F8A7E7,4.4,0.0,73,102500,0,0,265,0,0,0,0,0,0,0,270,3.6,0,0,24.1,77777,0,999999999,8,0.1000,0,88,0.000,0.0,0.0 
1966,1,1,3,60,A7A7A7A7*0?0?0?0?0?0?0?0A7A7A7A7A7A7F8F8A7E7,2.8,-0.6,79,102500,0,0,258,0,0,0,0,0,0,0,310,2.1,0,0,24.1,77777,0,999999999,8,0.1000,0,88,0.000,0.0,0.0 

我正在使用Python V2.7。

+0

嗨,有很多方法来读取一个CSV应该看看这个[问题](http://stackoverflow.com/questions/20982437/how-to-parse-a-csv-with-python-当一列有多行) – ELavicount

+0

是否有你需要直接读取到一个numpy数组的原因?你可能应该看看'pandas' –

+0

使用一个只显示三行的数据文件,你的第二个例子适用于我。我将“S10”更改为“S32”以确保文本字段未被截断,并且我没有使用“skip_header”参数,因为我没有添加标题。当你像这样指定一个dtype时,该函数返回一个结构化数组(http://docs.scipy.org/doc/numpy/user/basics.rec.html)。那是你得到的吗? –

回答

1

使用numpy.loadtxt与参数usecols仅用于选择包含浮点数的列。

>>> import numpy as np 
>>> cols = range(0,5) + range(6,35) 
>>> data = np.loadtxt("data.txt", delimiter=",", usecols=cols, dtype=np.float) 
>>> data 
[[ 1.96600000e+03 1.00000000e+00 1.00000000e+00 1.00000000e+00 
    6.00000000e+01 3.90000000e+00 1.70000000e+00 8.60000000e+01 
    1.02400000e+05 0.00000000e+00 0.00000000e+00 2.64000000e+02 
    0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 
    0.00000000e+00 0.00000000e+00 0.00000000e+00 2.30000000e+02 
    2.10000000e+00 0.00000000e+00 0.00000000e+00 2.41000000e+01 
    7.77770000e+04 0.00000000e+00 9.99999999e+08 8.00000000e+00 
    1.00000000e-01 0.00000000e+00 8.80000000e+01 0.00000000e+00 
    0.00000000e+00 0.00000000e+00] 
[ 1.96600000e+03 1.00000000e+00 1.00000000e+00 2.00000000e+00 
    6.00000000e+01 4.40000000e+00 0.00000000e+00 7.30000000e+01 
    1.02500000e+05 0.00000000e+00 0.00000000e+00 2.65000000e+02 
    0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 
    0.00000000e+00 0.00000000e+00 0.00000000e+00 2.70000000e+02 
    3.60000000e+00 0.00000000e+00 0.00000000e+00 2.41000000e+01 
    7.77770000e+04 0.00000000e+00 9.99999999e+08 8.00000000e+00 
    1.00000000e-01 0.00000000e+00 8.80000000e+01 0.00000000e+00 
    0.00000000e+00 0.00000000e+00] 
[ 1.96600000e+03 1.00000000e+00 1.00000000e+00 3.00000000e+00 
    6.00000000e+01 2.80000000e+00 -6.00000000e-01 7.90000000e+01 
    1.02500000e+05 0.00000000e+00 0.00000000e+00 2.58000000e+02 
    0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 
    0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10000000e+02 
    2.10000000e+00 0.00000000e+00 0.00000000e+00 2.41000000e+01 
    7.77770000e+04 0.00000000e+00 9.99999999e+08 8.00000000e+00 
    1.00000000e-01 0.00000000e+00 8.80000000e+01 0.00000000e+00 
    0.00000000e+00 0.00000000e+00]] 

如果你想包括第6列,那么你将不得不加载矩阵作为对象,你不能混合浮动与字符串。

>>> data = np.loadtxt("data.txt", delimiter=",", dtype=np.object) 

因此,如果您需要此列,请单独加载。

+0

谢谢,这是有效的。一些新的但仍然存在的问题 - 然后我需要能够将所有的东西都写回到一个文本文件(与我阅读它的格式相同),但是我有一些列作为数字类型,一列作为字符串。 np.savetxt抱怨,因为不是所有的元素都是浮动的。将一组浮点数和字符串保存到文本文件的最佳做法是什么?有没有一种干净的直接方式,或者可能需要首先将整个事物转换为字符串? –

相关问题