'/'在HDF5文件名称中混淆

Sar*_*ica 16 python hdf5 pytables h5py pandas

我在h5py,PyTables(通过Pandas)和C++生成的HDF5文件之间经历了一些非常奇怪的交互.似乎h5checkh5py似乎应对包含'/'的类型名称,但pandas/PyTables不能.显然,我的理解存在差距,因此:

我在这里有什么不明白的?


血淋淋的细节

我在HDF5文件中有以下数据:

   [...]
   DATASET "log" {
      DATATYPE  H5T_COMPOUND {
         H5T_COMPOUND {
            H5T_STD_U32LE "sec";
            H5T_STD_U32LE "usec";
         } "time";
         H5T_IEEE_F32LE "CIF/align/aft_port_end/extend_pressure";
         [...]
Run Code Online (Sandbox Code Playgroud)

这是通过C++ API创建的.该h5check公用事业说,文件是有效的.

请注意,这CIF/align/aft_port_end/extend_pressure 并不是指组/节点/叶子的路径.它是一个标签,我们在内部使用,恰好有一些内部结构包含'/'作为分隔符.我们不希望HDF5文件对此有所了解:它不应该关心.显然,如果'/'在任何HDF5名称中都是非法的,那么我们必须将该分隔符更改为其他名称.

使用PyTables(好吧,Pandas但它内部使用PyTables)来读取文件,我得到了一个

 >>> import pandas as pd
 >>> store = pd.HDFStore('data/XXX-20150423-071618.h5')
 >>> store
/home/XXX/virt/env/develop/lib/python2.7/site-packages/tables/group. py:1156: UserWarning: problems loading leaf ``/log``::

  the ``/`` character is not allowed in object names: 'XXX/align/aft_port_end/extend_pressure'

The leaf will become an ``UnImplemented`` node. 
Run Code Online (Sandbox Code Playgroud)

我在这个问题中询问过这个问题并且被告知 '/' 在规范中非法的.然而,h5py的事情变得陌生......

使用h5py读取文件,我得到我想要的:

>>> f['/log'].dtype
>>> dtype([('time', [('sec', '<u4'), ('usec', '<u4')]), ('CI
F/align/aft_port_end/extend_pressure', '<f4')[...]
Run Code Online (Sandbox Code Playgroud)

这或多或少是我的目标.

不用说,我很困惑.我设法创建了一个非法的HDF5文件,以某种方式通过h5check?是PyTables不支持这种特殊情况?... 我很迷惑.


显然,我可以写一个这样的简单包装器:

>>> import matplotlib.pyplot as plt
>>> silly = pd.DataFrame(f['/log']['CIF/align/aft_port_end/extend_pressure'])
>>> silly.plot()
>>> plt.show()
Run Code Online (Sandbox Code Playgroud)

HDF5文件中获取所有数据到Pandas.但是,由于之前的混乱,我不确定这是不是一个好主意.我最担心的是,如果数据非常大,转换可能无法扩展......

tit*_*jan 5

我浏览了一下h5check源代码,如果一个名字包含一个斜杠,我找不到它测试的任何地方.您可以检查它可以生成的错误消息:

grep error_push h5checker.c -A1
Run Code Online (Sandbox Code Playgroud)

您提供的链接明确指出对象名称中不允许使用斜杠.所以是的,我认为你已经制作了一个非法的文件,但通过了h5check.该工具似乎更关注二进制数据布局.我能找到的最接近的相关检查是防止重复的名字.

在我看来,这就是它的全部.事实上,h5py和其他库以某种方式能够创建或读取这个非法文件是无关紧要的.规范说"不要在对象名称中添加斜杠",所以你不这样做.故事结局.

如果你不相信,可以这样想:如果你以某种方式设法创建一个带有文件名斜杠的常规文件,会发生什么?大多数程序假定文件名不包含斜杠,因此它们能够通过将斜杠字符拆分为目录路径来对其进行分区.您的文件将破坏此行为,因此引入许多微妙(而不是那么微妙)的错误.用户会抱怨,程序员会讨厌你,系统管理员会诅咒你.

同样可以安全地假设,旁边的PyTables许多其他库和程序将无法处理变量名中的斜杠.关于HDF的好处在于它存在很多工具,并且通过使用斜杠可以省去这个优势.您可能认为这并不重要,也许您的HDF-5文件仅供内部使用.但是,情况可能会在5年内发生变化,这种情况往往会发生.

只需咬紧牙关,用'|'替换'/' 在将变量写入HDF5之前.阅读时将它们更换回来.通过实施此操作而失去的时间,您将通过避免未来的错误和用户投诉赢回x-fold (x> 1).

抱歉咆哮,但我希望能说服你.

  • @Sardathrion,您的文件很好。我知道复合类型成员的标签上没有与斜杠相关的限制。链接的文档引用“组”名称空间中的名称;即文件中对象的POSIX样式路径。 (2认同)