Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使np.loadtxt使用多个可能的分隔符_Python_Numpy - Fatal编程技术网

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。更多信息: