【问题标题】:Loading csv and saving HDF5 in Python在 Python 中加载 csv 并保存 HDF5
【发布时间】:2014-10-13 19:14:44
【问题描述】:

我正在尝试从文本文件(三列浮点数,65341 行,由一个或多个空格分隔)导入数据,并将其保存到 HDF5 文件。我试图将它们保存在一个由文件名定义的三个组的子表中。

所以,对于一个名为“data_a1_b2_c3.dat”的文件,我想要 /data/a1/b2/c3 中的 1x6000 数组(其中 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

【问题讨论】:

标签: python numpy hdf5 pytables h5py


【解决方案1】:

为了快速取胜 - 您可以将数据保存为数组(我猜是这样 - 因为数据只是一维数据):

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 的东西 - 更容易操作 DataFrames 和 Series...

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2015-08-26
    • 2020-05-09
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多