我正在尝试从文本文件(三列 float ,65341 行,由一个或多个空格分隔)导入数据,并将其保存到 HDF5 文件中。我试图将它们保存在一个表中,该表是三个组的子项,由文件名定义。
所以,对于一个名为“data_a1_b2_c3.dat”的文件,我想要一个 1x6000 数组在/data/a1/b2/c3(其中 c3 是表)
我可以创建 HDF5 文件和组,但创建表证明是个问题。
这就是我到目前为止的想法(我省略了文件名解析和错误检查;有效):
import numpy as np
import tables as tb
# load datafile
fname = 'data_a1_b2_c3.dat'
data=np.genfromtxt(fname)
data=data[:,2]
# Open hdf5 file
h5=tb.openFile("h5file.h5",'a')
gp1 = h5.create_group(h5.root,"data")
gp2 = h5.create_group(gp1,"a1")
gp3 = h5.create_group(gp2,"b2")
t = h5.create_table(gp3,"c3",data,'my data')
最后一行抛出如下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/tables/file.py", line 1067, in create_table
chunkshape=chunkshape, byteorder=byteorder)
File "/usr/lib64/python2.7/site-packages/tables/table.py", line 842, in __init__
descr_from_dtype(nparray.dtype)
File "/usr/lib64/python2.7/site-packages/tables/description.py", line 759, in descr_from_dtype
for name in dtype_.names:
TypeError: 'NoneType' object is not iterable
我首先想到这与我的数据数组有关。但是,我是 Python 的新手,SciPi 文档站点目前已关闭(有人有镜像吗?!)(http://www.isup.me/http://docs.scipy.org/doc/numpy/)
我的阵列形状看起来很奇怪,但类型看起来是正确的。有什么想法吗?
>>> data.shape
(65341,)
>>> data.dtype
dtype('float64')
有关信息,这是我正在导入的数据文件的前三行(只需要第三列)
0.250000000000000 0.250000000000000 584.469683289793
0.250000000000000 1.00000000000000 840.153369718130
0.250000000000000 2.00000000000000 821.242731813009
为了快速取胜 - 您可以将数据保存为数组(我猜是这样 - 因为数据只是一维的):
a = h5.create_array(gp3,"c3",data,'my data')
记得关闭文件:
h5.close()
结果:
如果你真的想把它保存为一个表,你基本上必须记住,首先需要定义表(根据它们的记录结构),然后分配和刷新它们的值。
所以,除了将这个添加到开始之外,就像你在做的那样:
class Data(tb.IsDescription):
value = tb.Float32Col()
然后做:
t = h5.create_table(gp3,"c3",Data,'my data')
row = t.row
for d in data:
row['value'] = d
row.append()
t.flush()
结果:
最后,我个人实际上会使用 Pandas对于这个 CSV 到 HDF5 的东西——操作数据帧和系列要容易得多……
我是一名优秀的程序员,十分优秀!