我有一个程序读取数据文件,用户选择他们想要使用的列.我希望它对输入文件更加通用; 有时,列可能如下所示:
10:34:24.58 8.284 6.121
有时它们看起来像这样:
10 34 24.58 8.284 6.121
我希望程序在两种情况下将其识别为5列,而不是第一列为5列而第二列为3列.基本上,我希望它能够识别white space
为分隔符和:
分隔符.
有一个简单的方法吗?我知道numpy需要一个delimiter命令,但据我所知它只能使用一个.
np.loadtxt
(和genfromtxt
)接受任何可迭代项作为输入,只要它一次将其馈入一行即可。因此,文件中的行可以通过函数或生成器传递,该函数或生成器以各种方式对消息进行按摩。这是一个简单的例子
定义一对模拟文件的线:
In [7]: txt="""10:34:24.58 8.284 6.121 ...: 10 34 24.58 8.284 6.121 ...: """ In [8]: txt=txt.splitlines() In [9]: txt Out[9]: ['10:34:24.58 8.284 6.121', '10 34 24.58 8.284 6.121']
如果不是,:
我可以直接传递给loadtxt
。
但是,让我们通过生成器传递这些行,该生成器用空格替换“:”。它可能是一个函数(带有yield)。在这里,我使用了一种新的生成器理解表达式:
In [10]: np.loadtxt((x.replace(b':',b' ') for x in txt)) Out[10]: array([[ 10. , 34. , 24.58 , 8.284, 6.121], [ 10. , 34. , 24.58 , 8.284, 6.121]])
对于文件,这应该可以工作(在打开的文件上反复返回行):
with open(filename) as f: A=np.loadtxt((x.replace(b':',b' ') for x in f))
regex对于更详尽的替换很有用。