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

Python:numpy.genfromtxt-需要包含无效字符的列名,python,numpy,genfromtxt,Python,Numpy,Genfromtxt,我正在使用numpy.genfromtxt导入CSV文件 要导入的数据具有列名标题,其中一些列名包含genfromtxt认为无效的字符。具体来说,有些名称包含“#”和“”。无法更改输入数据,因为它是由我不控制的其他源生成的 使用names=True和comments=None,我无法输入我需要的所有列名 我已尝试重写numpy.lib.NameValidator.deletechars=None,但这不会影响实际使用的NameValidator类实例 我理解,deletechars的存在是因为可

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

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

使用
names=True
comments=None
,我无法输入我需要的所有列名

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

我理解,
deletechars
的存在是因为可以像访问属性一样重新排列字段。但是,我必须能够读入包含无效字符的列名,即使在读入时这些字符被剥离


是否有办法强制
名称验证程序
不检查无效字符,或修改其检查的字符?我无法修改numpy/lib/_iotools.py,因为我不是root用户,修改共享安装将不好。

您没有明确说明numpy.genfromtxt是一个硬要求,因此我建议您尝试

此模块可以在解析之前替换某些条目:

您还可以根据现有的阅读器定义自己的阅读器:


asciitable reader的输出是numpy数组,因此您应该能够用asciitable或多或少地直接替换当前使用的函数。

您没有明确说明numpy.genfromtxt是一个硬要求,因此我建议您尝试

此模块可以在解析之前替换某些条目:

您还可以根据现有的阅读器定义自己的阅读器:


asciitable reader的输出是numpy数组,因此您应该能够或多或少地直接用asciitable替换当前使用的函数。

NameValidator
如果使用
deletechars=None
构造,则将使用其默认的
deletechars
,但是如果您传入一个非
None
集,那么它将使用该集。和
np.genfromtext
获取一个
deletechars
参数,并将其传递给
namevalidater

所以,你应该能够写作

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

对于空集或默认
集的某个子集(“~!@$%^&*()-=+~\\\\\]}[{';:/?。>,
namevalidater
将使用其默认设置,如果使用
deletechars=None
构造,则
namevalidater
将使用该默认设置。而
np.genfromtext
将使用一个
deletechars
参数传递给
namevalidater

所以,你应该能够写作

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

对于空集或默认
集的某个子集(“~!@$%^&*()-=+\\\\\\\\]}[{':/?。>,IMHO,
genfromtxt
通常用于一些更简单的解决方案

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

现在,如果您确实需要
genfromtxt
,@ecatmur正好指出
genfromtxt
deletechars
参数被发送到
\iotools.NameValidator
来构造要删除的字符集。使用
deletechars=None
告诉
NameValidator
使用默认集。首先要做的是ry只是不使用
deletechars=None
,而是使用空的
集合
'

请注意,无论发生什么情况,双引号
和结尾空格都将被删除,相似的名称将被区分:

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


如果这不适合你,恐怕你遇到了麻烦:目前没有办法告诉
genfromtxt
接受定制的
namevalidater
。不过,这可能是个好主意,所以你可能想在numpy的邮件列表上提出一点。

我想,
genfromtxt
通常用于一些更简单的解决方案可以

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

现在,如果您确实需要
genfromtxt
,@ecatmur正好指出
genfromtxt
deletechars
参数被发送到
\iotools.NameValidator
来构造要删除的字符集。使用
deletechars=None
告诉
NameValidator
使用默认集。首先要做的是ry只是不使用
deletechars=None
,而是使用空的
集合
'

请注意,无论发生什么情况,双引号
和结尾空格都将被删除,相似的名称将被区分:

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


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

您不能自己提取标题,然后跳过它以获取纯数据吗通过
genfromtxt
?@JakobS执行此操作。-我目前正在尝试此操作,读取标题行,然后使用正则表达式查找哪些名称包含无效字符并替换它们。但是,这与