2014-01-07 30 views
1

我想将.csv文件加载到数组中。 但是,该文件看起来像这样。在读入数组时忽略字符串

"myfilename",0.034353453,-1.234556,-3,45671234 
,1.43567896, -1.45322124, 9.543422 
................................. 
................................. 

我想跳过前导字符串。直到现在,我一直在排除第一排。

a = np.genfromtxt(file,delimiter=',',skiprows=1) 

但我想知道是否有办法读取数组忽略字符串在开始处理。

+0

为什么不直接使用'csv'模块? –

+0

文件中只有一个字符串?还是有随机分散的字符串? – mgilson

+0

@GamesBrainiac - 使用'csv',你需要将所有的字符串转换为数字,手动过滤掉你不想要的东西(字符串是字符串而不是数字)然后转换整个东西成一个numpy数组。 'genfromtext'是为了处理'csv'文件,虽然(AFAIK)不是那些带有“字符串”的文件。 – mgilson

回答

2

你能只使用loadtxt(..., usecols=(1,2,3), ...),以避免在跳过线文件的开始?

的usecols说法只是告诉loadtxt列提取(并且是数字),这

# Put data into file (in shell, just me copying the sample) 
cat >> /tmp/data.csv 
"myfilename",0.034353453,-1.234556,-3,45671234 
,1.43567896, -1.45322124, 9.543422 

# In IPython 
In [1]: import numpy as np 

In [2]: a = np.loadtxt('/tmp/data.csv', usecols=(1,2,3), delimiter=',') 

In [3]: a 
Out[3]: 
array([[ 0.03435345, -1.234556 , -3.  ], 
     [ 1.43567896, -1.45322124, 9.543422 ]]) 
+0

他可以用'np.genfromtxt('temp.csv',delimiter =',',usecols =(1,2,3))'做到这一点。 –

0

,因为它只是在文件开头第一行,你可以写一个辅助发电机删除该字符串现在:

def helper(filename): 
    with open(filename) as fin: 
     # this could get more robust ... e.g. by doing typechecking if necessary. 
     line = next(fin).split(',') 
     yield ','.join(line[1:]) 
     for line in fin: 
      yield line 

arr = np.genfromtxt(helper('myfile.csv'), delimiter=',') 
+0

工作就像一个魅力。谢谢! –

+0

我在第二行中得到一个nan。这很明显,因为第一行有更多元素。但是,如果我摆脱第一行genfromtxt多余的元素引发执行行2有4列而不是3。为什么? –

+0

@AdaXu - 不确定。我想我需要能够重现你遇到的问题,但我不知道我是否可以用你所显示的数据来做到这一点。 – mgilson