CSV via NumPy genfromtxt():dtype表示变量字符串大小

时间:2016-11-07 18:54:32

标签: python csv numpy scipy genfromtxt

我正在使用genfromtxt()读取CSV,我希望所有值都是字符串。我需要指定字符串dtype,但指定S会产生空字符串:

In [83]: s = StringIO("a,b,c\n1,1.3,abcde\n2,4,hihihi")

In [84]: data = np.genfromtxt(s, dtype='S', delimiter=',', names=True)

In [85]: data
Out[85]: 
array([('', '', ''), ('', '', '')], 
      dtype={'names':['a','b','c'], 'formats':['S','S','S'], 'offsets':[0,0,0], 'itemsize':3})

In [86]: data['a']
Out[86]: 
array(['', ''], 
      dtype='|S1')

我认为这是因为数组不能有可变长度的列,你需要指定像|S10这样的东西:

In [98]: data = np.genfromtxt(s, dtype=[(col, '|S10') for col in ('a', 'b', 'c')], delimiter=',', skip_header=1)

In [99]: data
Out[99]: 
array([('1', '1.3', 'abcde'), ('2', '4', 'hihihi')], 
      dtype=[('a', 'S10'), ('b', 'S10'), ('c', 'S10')])

In [100]: data['a']
Out[100]: 
array(['1', '2'], 
      dtype='|S10')

但是如果我不知道每列的最大字符串长度会怎样呢?

我知道我可以指定dtype=None并且它会“自动”找出dtypes,但我希望它们都是字符串,上面的例子将给出ints / floats。

我也看到了这个:https://stackoverflow.com/a/14639568/1406873建议使用python object dtype,但这似乎为我的需求增加了太多的开销。

我想我可以先读取整个CSV,跟踪最大列长度,然后用这些长度调用genfromtxt()。还有其他想法吗?

参考文献:

1 个答案:

答案 0 :(得分:0)

genfromtxt一般地对待str(或np.str) - 至少在Py3中

In [590]: np.genfromtxt(b"a,b,c\n1,1.3,abcde\n2,4,hihihi".splitlines(), dtype=str)
Out[590]: 
array(['a,b,c', '1,1.3,abcde', '2,4,hihihi'], 
      dtype='<U11')

In [591]: np.genfromtxt(b"a,b,c\n1,1.3,abcde\n2,4,hihihi".splitlines(),dtype=str, delimiter=',')
Out[591]: 
array([['a', 'b', 'c'],
       ['1', '1.3', 'abcde'],
       ['2', '4', 'hihihi']], 
      dtype='<U6')