Python:numpy.genfromtxt - 需要包含无效字符的列名

时间:2012-08-07 06:20:22

标签: python numpy genfromtxt

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

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

使用names=Truecomments=None,我无法引入所需的所有列名称。

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

我理解deletechars存在是由于重新访问字段的可能性,就像它是一个属性一样。但是,我必须能够读取包含无效字符的列名,即使在读入时删除了字符。

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

3 个答案:

答案 0 :(得分:2)

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

此模块可以在解析之前替换某些条目:http://cxc.harvard.edu/contrib/asciitable/#replace-bad-or-missing-values

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

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

答案 1 :(得分:1)

如果使用NameValidator构建,

deletechars将使用其deletechars=None的默认设置,但如果您传入非None设置,则会使用该设置。 np.genfromtext会将deletechars参数传递给NameValidator

所以,你应该能够写

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

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

deletechars = np.lib._iotools.NameValidator.defaultdeletechars - set("# ")
np.genfromtxt(..., deletechars=deletechars)

答案 2 :(得分:1)

恕我直言,genfromtxt经常用于一些更简单的解决方案。

所以,除非你有一些麻烦的数据集(缺少条目,多个未知的列类型),你最好编写一个快速和脏的解析器(即跳过一些行,解析标题,读取其余的并重新组织端)。

现在,如果你真的需要genfromtxt,@ ecatmur正确指出deletechars的{​​{1}}参数被发送到genfromtxt以构造要删除的字符集。使用_iotools.NameValidator告诉deletechars=None使用默认设置。首先要尝试的是不要使用NameValidator,而应使用空deletechars=Noneset

请注意,无论如何,双引号''和结束空格都将被删除,类似的名称将被区分:

"

第三个和最后一个条目将产生三个名为>>> fields = ["blah", "'blah'", "\"blah\"", "#blah", "blah "] >>> np.lib._iotools.NameValidator(deletechars='').validate(fields) ... ('blah', "'blah'", 'blah_1', '#blah', 'blah_2') 的列,因此我们必须重命名它们。

如果这不适合你,我担心你会遇到障碍:目前没有办法告诉blah接受自定义的genfromtxt。不过,这可能是一个好主意,所以你可能想在numpy的邮件列表上提出这一点。