5

我正在尝试使用 python/numpy.loadtxt 导入数据。对于大多数数据,这不是问题,例如,如果一行看起来像这样:

0.000000      0.000000      0.000000      0.000000    -0.1725804E-13

在这种情况下,我可以使用空格作为分隔符。不幸的是,生成数据的程序不使用分隔符,只使用固定的列宽(我无法更改)。例子:

-0.1240503E-03-0.6231297E-04  0.000000      0.000000    -0.1126164E-02

我可以以某种简单的方式告诉 numpy.loadtxt 每一列都是 14 个字符吗?我宁愿不必修改其他程序手动生成的文件......

编辑:

我想我根据 dxwx 的建议分享了我非常简单的解决方案。对于我提供的示例,解决方案是

a = numpy.genfromtxt('/path/to/file.txt', delimiter = 14)

在我的真实数据的第一列之前有一个额外的空格,我不想使用最后一列和最后一行。所以它现在看起来像这样:

a = numpy.genfromtxt('/path/to/file.txt',
                     delimiter = (1,14,14,14,14,14,14), 
                     usecols = range(1,6), skip_footer = 1)

感谢大家的快速响应。

4

2 回答 2

5

看看 Numpy 的genfromtxt - 说它可以使用整数宽度作为分隔符。

于 2013-07-04T10:07:48.930 回答
1

我会改用numpy.fromregex。然后,您可以定义一个基本的正则表达式来捕获最多 14 个字符。

因此,在这里我们使用 RE 组捕获每个字段[-.\dE]{1,14}(假设没有缺失值并且格式始终与您给出的示例相匹配,关于哪些字符是可能的):

>>> regex = r"([-.\dE]{1,14})\s*([-.\dE]{1,14})\s*([-.\dE]{1,14})\s*([-.\dE]{1,14})\s*([-.\dE]{1,14})"
>>> np.fromregex(dat, regex, [('A', np.float32), ('B', np.float32),('C', np.float32),('D', np.float32),('E', np.float32),])
array([ (-0.0001240503042936325, -6.231296720216051e-05, 0.0, 0.0, -0.0011261639883741736)
], 
      dtype=[('A', '<f4'), ('B', '<f4'), ('C', '<f4'), ('D', '<f4'), ('E', '<f4')])
于 2013-07-04T10:11:17.650 回答