1

我正在使用 .csv 文件导入 CSV 文件numpy.genfromtxt

要导入的数据有一个列名标题,其中一些列名包含genfromtxt认为无效的字符。具体来说,一些名称包含“#”和“”。输入数据无法更改,因为它是由我无法控制的其他来源生成的。

使用names=Trueand comments=None,我无法引入我需要的所有列名。

我尝试过覆盖numpy.lib.NameValidator.deletechars=None,但这不会影响实际使用的 NameValidator 类实例。

我知道这deletechars是由于重新排列可能会像访问属性一样访问字段而存在。但是,我必须能够读入包含无效字符的列名,即使在读入时删除了这些字符。

有没有办法强制NameValidator不检查无效字符,或修改它检查的字符?我无法修改 numpy/lib/_iotools.py 因为我不是 root 并且修改共享安装会很糟糕。

4

3 回答 3

2

您没有明确声明 numpy.genfromtxt 是一项硬性要求,因此我建议您尝试asciitable

该模块有一种在解析之前替换某些条目的方法:http: //cxc.harvard.edu/contrib/asciitable/#replace-bad-or-missing-values

您还可以根据现有的读者定义自己的读者:http: //cxc.harvard.edu/contrib/asciitable/#advanced-table-reading

asciitable reader 的输出是 numpy 数组,所以你应该可以直接用 asciitable 或多或少地替换你当前使用的函数。

于 2012-08-07T08:29:24.097 回答
1

恕我直言,genfromtxt通常用于一些更简单的解决方案可以做到的情况。

因此,除非您有一些麻烦的数据集(缺少条目、多个未知的列类型),否则最好编写一个快速而肮脏的解析器(即,跳过一些行,解析标题,读取其余部分并在最后重新组织)。

现在,如果你真的需要genfromtxt,@ecatmur 公正地指出,deletechars参数genfromtxt被发送_iotools.NameValidator到构造要删除的字符集。使用deletechars=None告诉NameValidator使用默认集。首先要尝试的是不要使用deletechars=None,而是使用空的setor ''

请注意,无论如何,双引号"和结尾空格将被删除,并且将区分相似的名称:

>>> fields = ["blah", "'blah'", "\"blah\"", "#blah", "blah "]
>>> np.lib._iotools.NameValidator(deletechars='').validate(fields)
... ('blah', "'blah'", 'blah_1', '#blah', 'blah_2')

第三个和最后一个条目将产生三个名为 的列blah,因此我们必须重命名它们。

如果这不适合您,恐怕您会遇到障碍:目前没有办法告诉genfromtxt您接受定制的NameValidator. 不过,这可能是个好主意,因此您可能想在 numpy 的邮件列表中提出这一点。

于 2012-08-07T13:07:41.920 回答
1

NameValidatordeletechars如果使用 构造,将使用其默认集deletechars=None,但如果您传入非None集,则它将使用该集。并np.genfromtext接受deletechars它传递给的参数NameValidator

所以,你应该可以写

np.genfromtxt(..., deletechars=set())

对于空集或默认值的某个子集set("""~!@#$%^&*()-=+~\|]}[{';: /?.>,<""")

deletechars = np.lib._iotools.NameValidator.defaultdeletechars - set("# ")
np.genfromtxt(..., deletechars=deletechars)
于 2012-08-07T08:46:43.933 回答