繁体   English   中英

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

[英]Python: numpy.genfromtxt - Need column names that contain invalid characters

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

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

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

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

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

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

你没有明确声明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替换你当前使用的函数。

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

所以,你应该能够写作

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

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

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

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

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

现在,如果你真的需要genfromtxt ,@ecatmur公正地指出了deletechars的说法genfromtxt发送到_iotools.NameValidator来构建一套要删除的字符。 使用deletechars=None告诉NameValidator使用默认集。 首先要尝试的是不使用deletechars=None ,而是使用空set''

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM