我正在尝试使用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)
感谢大家的快速反应。
答案 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')])