使用numpy.loadtxt导入数据:没有分隔符但是固定列宽

时间:2013-07-04 10:02:18

标签: python numpy

我正在尝试使用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)

感谢大家的快速反应。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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')])