Python 如何使用h5py中的给定标记创建不透明数据集

Python 如何使用h5py中的给定标记创建不透明数据集,python,hdf5,h5py,Python,Hdf5,H5py,我正在尝试使用h5py重新创建一个HDF5文件,该文件将二进制数据(例如JPEG压缩图像)存储为不透明的数据集,使用标记存储MIME类型,以便以后可以轻松解码 我能够解决这个问题的唯一方法是使用低级API,但是如果有更高级的API就更好了 (我在发布我的解决方案,希望它对其他人有用,因为我很难找到很多这样做的例子)我找到的唯一方法是使用。这意味着在中创建和数据之前,我们需要设置和自己 import h5py import numpy as np # get the binary data in

我正在尝试使用
h5py
重新创建一个HDF5文件,该文件将二进制数据(例如JPEG压缩图像)存储为
不透明的
数据集,使用标记存储MIME类型,以便以后可以轻松解码

我能够解决这个问题的唯一方法是使用低级API,但是如果有更高级的API就更好了


(我在发布我的解决方案,希望它对其他人有用,因为我很难找到很多这样做的例子)

我找到的唯一方法是使用。这意味着在中创建和数据之前,我们需要设置和自己

import h5py
import numpy as np

# get the binary data in
with open('input.jpeg', 'rb') as fd:
  data = fd.read()

# set up an HDF5 type appropriately sized for our data
dtype = h5py.h5t.create(h5py.h5t.OPAQUE, len(data))
dtype.set_tag(b'image/jpeg')

# set up a simple scalar HDF5 data space
space = h5py.h5s.create(h5py.h5s.SCALAR)

with h5py.File('output.h5', 'w') as root:
  ds = h5py.h5d.create(root.id, b'mydata', dtype, space)

  ds.write(space, space, np.frombuffer(data, dtype=np.uint8), dtype)
这对我来说很有用,带有
h5dump-H输出。h5
给出:

HDF5“output.h5”{
组“/”{
数据集“mydata”{
数据类型H5T\u不透明{
不透明标签“图像/jpeg”;
}
数据空间标量
}
}
}

但如果这能简单一点就好了

解决此问题和避免低级API的更简单方法是。在使用HDFql的Python中,可以按如下方式解决此问题:

# import HDFql package
import HDFql

# get size (in bytes) of file 'input.jpeg'
HDFql.execute("SHOW FILE SIZE input.jpeg")

# move cursor to first element
HDFql.cursor_first()

# get cursor element and assign it to variable
input_size = HDFql.cursor_get_unsigned_bigint()

# create HDF5 file 'output.h5'
HDFql.execute("CREATE FILE output.h5")

# create dataset 'mydata' (in file 'output.h5') of data type opaque with a tag 'image/jpeg' and storing the content of file 'input.jpeg'
HDFql.execute("CREATE DATASET output.h5 mydata AS OPAQUE(%d) TAG image/jpeg VALUES FROM BINARY FILE input.jpeg" % input_size)

我很好奇-为什么要保存为不透明的数据集?我看到的图像数据示例将图像另存为np.array,包含各种数据类型和形状。@kcw78 jpeg编码是为了节省空间,不透明的数据类型似乎是合适的。预计存档约100k个文件,每个文件包含约500张图像和相关的相机/实验信息。@kcw78可能误解了;格式是由C++代码编写的(它将产生大部分文件),我希望一些Python代码做同样的测试,并发布问题,因为它似乎比我之前没有听说过的HDFQL更尴尬,看起来很有趣!有没有不使用本地文件系统的方法?我可以使用
variable\u transient\u register
@SamMason:不确定本地文件系统是什么意思。关于
variable\u transient\u register
的用法,是的,如果您有一个NumPy数组,其中填充了要存储在dataset
mydata
中的内容,则可以使用它。然后,您可以执行以下操作:
HDFql.execute(“创建数据集输出.h5 mydata为不透明(%d)标记图像/jpeg值,来自内存%d%”(输入大小,HDFql.variable\u transient\u寄存器(my\u numpy\u数组))
。是的,很抱歉,您的解释不正确。传入
字节是否有效?我正在努力为HDFql找到回购协议(例如github),以便我可以检查自己,有什么建议吗?