基本问题是 NumPy 不理解剥离引号的概念(而csv
模块理解)。当您说 时delimiter='","'
,您是在告诉 NumPy 列分隔符实际上是带引号的逗号,即引号在逗号周围,而不是值,因此您在第一列和最后一列上得到的额外引号是预期的。
查看函数文档,我认为您需要将converters
参数设置为为您去除引号(默认情况下不会):
import re
import numpy as np
fieldFilter = re.compile(r'^"?([^"]*)"?$')
def filterTheField(s):
m = fieldFilter.match(s.strip())
if m:
return float(m.group(1))
else:
return 0.0 # or whatever default
#...
# Yes, sorry, you have to know the number of columns, since the NumPy docs
# don't say you can specify a default converter for all columns.
convs = dict((col, filterTheField) for col in range(numColumns))
data = np.genfromtxt(csvfile, dtype=None, delimiter=',', names=True,
converters=convs)
或者放弃np.genfromtxt()
并让csv.csvreader
你一次给你一行文件的内容,作为字符串列表,然后你只需遍历元素并构建矩阵:
reader = csv.csvreader(csvfile)
result = np.array([[float(col) for col in row] for row in reader])
# BTW, column headings are in reader.fieldnames at this point.
编辑:好的,所以看起来您的文件并非都是浮动的。在这种情况下,您可以convs
根据需要在genfromtxt
案例中设置,或者在案例中创建转换函数的向量csv.csvreader
:
reader = csv.csvreader(csvfile)
converters = [datetime, float, int, float]
result = np.array([[conv(col) for col, conv in zip(row, converters)]
for row in reader])
# BTW, column headings are in reader.fieldnames at this point.
编辑2:好的,可变列数......您的数据源只是想让生活变得困难。幸运的是,我们可以使用magic
...
reader = csv.csvreader(csvfile)
result = np.array([[magic(col) for col in row] for row in reader])
... 哪里magic()
只是我为一个功能而想到的一个名字。(精神!)
在最坏的情况下,它可能是这样的:
def magic(s):
if '/' in s:
return datetime(s)
elif '.' in s:
return float(s)
else:
return int(s)
也许 NumPy 有一个函数,它接受一个字符串并返回一个具有正确类型的元素。 numpy.fromstring()
看起来很接近,但它可能会将时间戳中的空间解释为列分隔符。
PScsvreader
我看到的一个缺点是它不会丢弃评论。真实csv
文件没有评论。