我有一个程序读取数据文件,用户选择他们想要使用的列.我希望它对输入文件更加通用; 有时,列可能如下所示:
10:34:24.58 8.284 6.121
Run Code Online (Sandbox Code Playgroud)
有时它们看起来像这样:
10 34 24.58 8.284 6.121
Run Code Online (Sandbox Code Playgroud)
我希望程序在两种情况下将其识别为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']
Run Code Online (Sandbox Code Playgroud)
如果不是,:我可以直接传递给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]])
Run Code Online (Sandbox Code Playgroud)
对于文件,这应该可以工作(在打开的文件上反复返回行):
with open(filename) as f:
A=np.loadtxt((x.replace(b':',b' ') for x in f))
Run Code Online (Sandbox Code Playgroud)
regex对于更详尽的替换很有用。
感谢上面的答案,但我相信我已经找到了一种解决方法,可以使用简单的两行解决方案,而无需修改程序的其余部分。
最初的 loadtxt 行如下所示:
import numpy as np
...
data = np.loadtxt(filename,skiprows=header,dtype=str)
Run Code Online (Sandbox Code Playgroud)
通过使用 StringIO,我们可以简单地读取文件并替换':'with 的每个实例" ",而无需修改任何其他代码。
import numpy as np
import StringIO
...
s = open(filename).read().replace(':',' ')
data = np.loadtxt(StringIO.StringIO(s),skiprows=header,dtype=str)
Run Code Online (Sandbox Code Playgroud)
我希望这对其他人有帮助!