Python 使np.loadtxt使用多个可能的分隔符
我有一个程序可以读取数据文件,用户可以选择要使用的列。我希望它更通用于输入文件;有时,列可能如下所示:Python 使np.loadtxt使用多个可能的分隔符,python,numpy,Python,Numpy,我有一个程序可以读取数据文件,用户可以选择要使用的列。我希望它更通用于输入文件;有时,列可能如下所示: 10:34:24.58 8.284 6.121 10 34 24.58 8.284 6.121 import numpy as np ... data = np.loadtxt(filename,skiprows=header,dtype=str) 有时它们看起来像这样: 10:34:24.58 8.284 6.121 10 34 24.58 8.284 6.121
10:34:24.58 8.284 6.121
10 34 24.58 8.284 6.121
import numpy as np
...
data = np.loadtxt(filename,skiprows=header,dtype=str)
有时它们看起来像这样:
10:34:24.58 8.284 6.121
10 34 24.58 8.284 6.121
import numpy as np
...
data = np.loadtxt(filename,skiprows=header,dtype=str)
我希望程序在这两种情况下都将其识别为5列,而不是第一列为5列,第二列为3列。基本上,我希望它将空白
识别为分隔符,并将:
识别为分隔符
有没有一个简单的方法可以做到这一点?我知道numpy接受一个分隔符命令,但据我所知,它只能使用一个。np.loadtxt
(和genfromtxt
)接受任何iterable作为输入,只要它一次只输入一行。因此,文件的行可以通过函数或生成器传递,该函数或生成器以各种方式对文件进行处理。这里有一个简单的例子
定义一对模拟文件的行:
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
但是让我们将这些线通过一个生成器,该生成器将“:”替换为一个空格。它可能是一个函数(具有收益率)。在这里,我使用了一种新型的生成器理解表达式:
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]])
对于文件,这应该有效(在打开的文件上迭代返回行):
正则表达式对于更精细的替换非常有用。多亏了上面的答案,但我相信我已经找到了一种解决方法,它允许使用简单的两行解决方案,而无需修改程序的其余部分 最初的loadtxt行如下所示:
10:34:24.58 8.284 6.121
10 34 24.58 8.284 6.121
import numpy as np
...
data = np.loadtxt(filename,skiprows=header,dtype=str)
通过使用StringIO,我们可以简单地读取文件并将:“
的每个实例替换为”
,而无需修改任何其他代码
import numpy as np
import StringIO
...
s = open(filename).read().replace(':',' ')
data = np.loadtxt(StringIO.StringIO(s),skiprows=header,dtype=str)
我希望这对其他人有帮助 如果您不介意使用
pandas
,它的read\u csv
函数()有一个sep
参数,可以是正则表达式。很酷,谢谢!现在,我对Python非常陌生,所以您能告诉我如何将它与我当前的loadtxt命令结合起来吗:data=np.loadtxt(filename,skiprows=header,dtype=str)
我会将生成器表达式扩展为生成器函数,并让它根据需要跳过行。在前面的SO问题中已经讨论过如何使用带有load/gen
的生成器或过滤器。对于可能尝试使用此方法的任何人,请注意,Python 3中不再提供StringIO模块。相反,请导入io模块,并分别对文本和数据使用io.StringIO或io.BytesIO。更多信息: