我必须将大型逗号分隔表导入为numpy数组。因此,我使用genfromtxt这样做。但是,我遇到这些表包含“foo,bar”形式括号中的元素,我甚至不需要这些元素。 在导入numpy期间,然后引发一个错误,即列数不一致,因为它将这些元素识别为两个单独的条目。如何在不知道这些条目的位置的情况下避免这种情况。如果这是不可能的,有没有办法明确地从导入中删除某些列,这可能包含这些值?我知道usecols,但我想要相反。另外,usecols也可能也错误地计算列的数量,因此排除不会以这种方式工作。
答案 0 :(得分:1)
'invalid_raise'参数可能会有所帮助:
invalid_raise : bool, optional
If True, an exception is raised if an inconsistency is detected in the
number of columns.
If False, a warning is emitted and the offending lines are skipped.
使用False
,您的文件至少应该加载。
但是如果你仍然需要使用有问题的行,你还需要一些其他方法。
如果所有数据字段都排成一行,则delimited
的列宽版本可能会有效。
genfromtxt
接受一个生成器作为输入 - 也就是说,一次可以为它提供一行的函数。
使用re
函数清理输入源中的(foo,bar)
字符串的示例:
def foo(astr):
# replace (foo,bar) with (foo:bar)
return re.sub(r'\(([^,]*)(,)([^,]*)\)',r'(\1:\3)',astr)
txt = 'foo,2,3\n(foo,bar),5,6\nbar,8,9\n'
txt = txt.splitlines()
np.genfromtxt((foo(i) for i in txt),delimiter=',',dtype=None)
产生
array([('foo', 2, 3), ('(foo:bar)', 5, 6), ('bar', 8, 9)],
dtype=[('f0', 'S9'), ('f1', '<i4'), ('f2', '<i4')])
或从文件
with open('stack27383639.txt') as f:
F=np.genfromtxt((foo(l) for l in f),dtype=None,names=True)