python,read' .dat'每行的不同列的文件

时间:2016-02-29 11:43:18

标签: python numpy

我需要从.dat文件中提取一些数据,我通常使用

import numpy as np
file = np.loadtxt('blablabla.dat')

此处我的数据不是由特定的分隔符分隔,而是具有预定义的长度(数字),而某些行不具有某些列的任何值。 这里有一个明确的样本:

 3  0  36  0  0 0  0   0    0  0         99. 
-2  0   0  0  0 0  0   0    0  0         99. 
 2  0   0  0  0 0  0   0    0  0 .LA.0?.  3. 
 5  0   0  0  0 2  4   0    0  0 .SAS7?. 99. 
-5  0   0  0  0 0  0   0    0  0         99. 
99  0   0  0  0 0  0   0    0  0 .S..3*.  3.5

我上面的小代码得到错误:

# Convert each value according to its column and store
ValueError: Wrong number of columns at line 3

有人知道如何收集此类数据吗?

2 个答案:

答案 0 :(得分:1)

numpy.genfromtxt似乎是你想要的;您可以为每列指定字段宽度,并将缺少的数据视为NaN s。

对于这种情况:

import numpy as np
data = np.genfromtxt('blablabla.dat',delimiter=[2,3,4,3,3,2,3,4,5,3,8,5])

如果要将信息保留在文件的字符串部分中,可以阅读两次并指定usecols参数:

import numpy as np
number_data = np.genfromtxt('blablabla.dat',delimiter=[2,3,4,3,3,2,3,4,5,3,8,5],\
                            usecols=(0,1,2,3,4,5,6,7,8,9,11))
string_data = np.genfromtxt('blablabla.dat',delimiter=[2,3,4,3,3,2,3,4,5,3,8,5],\
                            usecols=(10),dtype=str)

答案 1 :(得分:0)

您最需要的是获取用作分隔符的空“列”位置列表 那会让你开始

In [108]: table = ''' 3  0  36  0  0 0  0   0    0  0         99. 
   .....: -2  0   0  0  0 0  0   0    0  0         99. 
   .....:  2  0   0  0  0 0  0   0    0  0 .LA.0?.  3. 
   .....:  5  0   0  0  0 2  4   0    0  0 .SAS7?. 99. 
   .....: -5  0   0  0  0 0  0   0    0  0         99. 
   .....: 99  0   0  0  0 0  0   0    0  0 .S..3*.  3.5'''.split('\n')

In [110]: max_row_len = max(len(row) for row in table)

In [117]: spaces = reduce(lambda res, row: res.intersection(idx for idx, c in enumerate(row) if c == ' '), table, set(range(max_row_len)))

此代码在最长行中构建一组字符位置 - reduce 仅留下所有行中包含空格的位置集