我需要从.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
有人知道如何收集此类数据吗?
答案 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 仅留下所有行中包含空格的位置集