用于从 HDF5 文件读取/写入 Python 类型的实用程序,包括 MATLAB v7.3 MAT 文件。
项目描述
概述
这个 Python 包提供了高级实用程序,用于从 HDF5(Heirarchal Data Format)格式的文件读取/写入各种 Python 类型。该软件包还提供对 MATLAB MAT v7.3 格式文件的支持,这些文件只是具有不同扩展名和一些额外元数据的 HDF5 文件。
所有这些都是在没有腌制数据的情况下完成的。Pickling 不利于安全性,因为它允许在解释器中执行任意代码。人们希望能够从不受信任的来源读取可能的 HDF5 和 MAT 文件,因此在这个包中避免了酸洗。
该软件包的文档位于 http://pythonhosted.org/hdf5storage/
该软件包的源代码位于 https://github.com/frejanordsiek/hdf5storage
该软件包根据 2 条款 BSD 许可证 ( https://github.com/frejanordsiek/hdf5storage/blob/master/COPYING.txt ) 获得许可。
安装
依赖项
此包仅支持 Python >= 2.6。
这个包需要 numpy 和 h5py (>= 2.1) 包才能运行。请注意,完整功能需要 h5py >= 2.3。一个可选的依赖项是 scipy 包。
通过 pip 安装
这个包在PyPI上。要使用 pip 安装 hdf5storage,请运行以下命令:
pip install hdf5storage
从源安装
要从源代码安装 hdf5storage,请下载包,然后安装依赖项
pip install -r requirements.txt
然后安装包,用 Python 运行命令
python setup.py install
运行测试
对于测试,需要包nose (>= 1.0) 以及Python 2.6 上的unittest2。有一些测试需要安装 Matlab 和 scipy 并位于可执行路径中。没有它们意味着这些测试无法运行(它们将被跳过),但所有其他测试都将运行。要安装除 scipy 之外的所有测试依赖项,请运行
pip install -r requirements_tests.txt.
运行测试
python setup.py nosetests
建筑文档
该文档还需要 sphinx (>= 1.7)。可以通过以下方式安装文档依赖项
pip install -r requirements_doc.txt
构建文档
python setup.py build_sphinx
蟒蛇2
这个包是为 Python 3 设计和编写的,后来添加了对 Python 2.7 和 2.6 的支持。这确实意味着在 Python 2 中有些东西有点笨拙。示例包括要求字典的unicode键、int和long类型都映射到 Python 3 int类型等。存储格式的元数据在 Python 中看起来更熟悉3 立场也是如此。
该文档主要是根据 Python 3 语法和类型编写的。将指出除了直接翻译语法和类型之外的重要 Python 2 信息。
分层数据格式 5 (HDF5)
HDF5 文件(参见http://www.hdfgroup.org/HDF5/)是用于交换数字数据的常用文件格式。它内置了对多种数字格式(无符号整数、浮点数、字符串等)作为标量和数组、枚举和复合类型的支持。它还处理不同硬件平台上数据表示的差异(字节序、不同的浮点格式等)。从名称可以想象,数据在 HDF5 文件中以分层形式表示,对 Unix 文件系统进行建模(Datasets 相当于文件,Groups 相当于目录,并且支持链接)。
这个包使用 h5py 包 ( http://www.h5py.org/ ) 与PyTables 包 ( http://www.pytables.org/ ) 连接 HDF5 文件。
MATLAB MAT v7.3 文件支持
MATLAB ( http://www.mathworks.com/ ) 7.3 版及更高版本的 MAT 文件是具有不同文件扩展名 ( .mat ) 和一组非常具体的元数据和存储约定的 HDF5 文件。此包为一组有限的 Python 和 MATLAB 类型提供读写支持。
SciPy ( http://scipy.org/ ) 具有读取和写入旧 MAT 文件格式的功能。这个包具有模仿 scipy.io.savemat和scipy.io.loadmat函数的函数,它们具有相同的名称和相似的参数。如果 MAT 文件格式不是基于 HDF5 的格式,则分派到 SciPy 版本。
支持的类型
下表给出了支持的 Python 和 MATLAB 类型。这些表假定一个已导入集合和 numpy 为:
import collections as cl import numpy as np
该表给出了可以读取和写入的 Python 类型、支持它的该包的第一个版本、它被转换为用于存储的 numpy 类型(如果没有写入类型信息,那将是它被读回的内容)如果以 MAT 文件为目标,它将成为 MATLAB 类,并且此包的第一个版本支持编写它以便 MATLAB 可以读取它。
Python |
MATLAB |
|||
---|---|---|---|---|
类型 |
版本 |
转换成 |
班级 |
版本 |
布尔 |
0.1 |
np.bool_ 或 np.uint8 |
合乎逻辑的 |
0.1 [ 1 ] |
没有任何 |
0.1 |
np.float64([]) |
[] |
0.1 |
0.1 |
np.int64 [ 2 ] |
整数64 |
0.1 |
|
0.1 |
np.int64 |
整数64 |
0.1 |
|
漂浮 |
0.1 |
np.float64 |
双倍的 |
0.1 |
复杂的 |
0.1 |
np.complex128 |
双倍的 |
0.1 |
字符串 |
0.1 |
np.uint32/16 |
字符 |
0.1 [ 5 ] |
字节 |
0.1 |
np.bytes_ 或 np.uint16 |
字符 |
0.1 [ 6 ] |
字节数组 |
0.1 |
np.bytes_ 或 np.uint16 |
字符 |
0.1 [ 6 ] |
列表 |
0.1 |
np.object_ |
细胞 |
0.1 |
元组 |
0.1 |
np.object_ |
细胞 |
0.1 |
放 |
0.1 |
np.object_ |
细胞 |
0.1 |
冻结集 |
0.1 |
np.object_ |
细胞 |
0.1 |
cl.deque |
0.1 |
np.object_ |
细胞 |
0.1 |
听写 |
0.1 |
结构 |
0.1 [ 7 ] |
|
np.bool_ |
0.1 |
合乎逻辑的 |
0.1 |
|
np.void |
0.1 |
|||
np.uint8 |
0.1 |
uint8 |
0.1 |
|
np.uint16 |
0.1 |
uint16 |
0.1 |
|
np.uint32 |
0.1 |
uint32 |
0.1 |
|
np.uint64 |
0.1 |
uint64 |
0.1 |
|
np.uint8 |
0.1 |
整数8 |
0.1 |
|
np.int16 |
0.1 |
整数16 |
0.1 |
|
np.int32 |
0.1 |
整数32 |
0.1 |
|
np.int64 |
0.1 |
整数64 |
0.1 |
|
np.float16 [ 8 ] |
0.1 |
|||
np.float32 |
0.1 |
单身的 |
0.1 |
|
np.float64 |
0.1 |
双倍的 |
0.1 |
|
np.complex64 |
0.1 |
单身的 |
0.1 |
|
np.complex128 |
0.1 |
双倍的 |
0.1 |
|
np.str_ |
0.1 |
np.uint32/16 |
字符/uint32 |
0.1 [ 5 ] |
np.bytes_ |
0.1 |
np.bytes_ 或 np.uint16 |
字符 |
0.1 [ 6 ] |
np.object_ |
0.1 |
细胞 |
0.1 |
|
np.ndarray |
0.1 |
|||
np.矩阵 |
0.1 |
0.1 [ 9 ] |
||
np.chararray |
0.1 |
0.1 [ 9 ] |
||
np.recarray |
0.1 |
结构化 np.ndarray |
0.1 [ 9 ] |
下表给出了可以从 MAT 文件中读取的 MATLAB 类、可以读取它们的此包的第一个版本以及它们被读取的 Python 类型。
MATLAB 类 |
版本 |
蟒蛇类型 |
---|---|---|
合乎逻辑的 |
0.1 |
np.bool_ |
单身的 |
0.1 |
np.float32 或 np.complex64 [ 12 ] |
双倍的 |
0.1 |
np.float64 或 np.complex128 [ 12 ] |
uint8 |
0.1 |
np.uint8 |
uint16 |
0.1 |
np.uint16 |
uint32 |
0.1 |
np.uint32 |
uint64 |
0.1 |
np.uint64 |
整数8 |
0.1 |
np.int8 |
整数16 |
0.1 |
np.int16 |
整数32 |
0.1 |
np.int32 |
整数64 |
0.1 |
np.int64 |
字符 |
0.1 |
np.str_ |
结构 |
0.1 |
结构化 np.ndarray |
细胞 |
0.1 |
np.object_ |
规范空 |
0.1 |
np.float64([]) |
版本
- 0.1.18。性能改进版本。
来自 Daniel Hrisca 的拉取请求 #111。对对象的__getitem__方法的多次重复调用 变成了单次调用。
本着 PR #111 的精神,进一步减少__getitem__调用。
- 0.1.17。修复了以下问题的错误修复和弃用解决方法版本。
问题 #109。修复了 32 位平台的修复问题 #102(之前的修复是 segfaulting)。
移动到使用setuptools中的pkg_resources.parse_version 和distutils.version类作为后备,而不是仅使用后者,以准备删除distutils (PEP 632) 并防止在标记为已弃用的 Python 版本上发出警告。
问题 #110。将numpy 类型上的 tostring 方法的所有使用更改为使用tobytes(如果可用),使用tostring作为旧版本 numpy 的后备,但它不是。
- 0.1.16。修复了以下错误的错误修复版本。
问题 #81 和 #82。h5py.File将要求将来显式传递模式。所有没有通过它的调用都固定通过它。
问题 #102。添加了对 h5py 3.0 和 3.1 的支持。
问题 #73。修复了loadmat中缺少变量会导致函数认为文件是 v7.3 之前格式的 MAT 文件回退到 scipy.io.loadmat的错误,因为该文件是 v7.3 格式的 MAT 文件.
修复了文档字符串和阻止文档构建的文档中的格式问题。
- 0.1.15。修复了以下错误的错误修复版本。
问题 #68。修复了str和numpy.unicode_ 字符串(但不是它们的 ndarrays)以 uint32格式保存的错误,无论 Options.convert_numpy_bytes_to_utf16的值如何。
第 70 期。更新了setup.py和requirements.txt以指定可用于特定 python 版本的 numpy 和 h5py 的最大版本(避免支持放弃的版本)。
问题 #71。修复了在为以类似结构的方式写入的数据执行 python 元数据时不会始终写入“python_fields”属性的错误。该错误导致写入和读取时不保留字段顺序。
当没有元数据用于仅适用于旧版本 numpy 的结构化 dtype 时,修复了测试中的断言以处理字段重新排序。
问题 #72。修复了填充了具有相同形状的 ndarray 的 python 集合被转换为多维对象 ndarray 而不是元素的 1D 对象 ndarray 的错误。
- 0.1.14。错误修复版本还添加了一些功能。
问题 #45。修复了 Python 3.0 到 3.2 的 unicode 字符串中的语法错误。
问题#44 和#47。修复了字符串类型转换和存储测试中的错误。
问题 #46。修复了由于信号 NaN 而在测试中引发的RuntimeWarnings 。
添加了用于构建文档和运行测试的需求文件。
如果找不到 Matlab,则跳过 Matlab 兼容性测试,而不是引发错误。
- 0.1.13。错误修复版本修复了以下错误。
问题 #36。修复了将int和long写入HDF5 及其在 32 位系统上的测试的错误。
- 0.1.12。错误修复版本修复了以下错误。此外,还更新了版权年份,并在用于测试的 Matlab 文件中放置了通知。
问题#32。 在从存储 python 元数据但不存储 Matlab 元数据的 HDF5 文件中读取时,在重塑np.ndarray之前修复了转置。
问题 #33。修复了读取空 numpy 字符串数组时丢失字符数的问题。
问题 #34。修复了使用 Matlab 元数据编写np.chararray时的转换错误。
- 0.1.11。修正以下问题的修正版本。
第 30 期。修复了 loadmat不以读取模式打开文件的问题。
- 0.1.10。次要功能/性能修复版本执行以下操作。
问题 #29。添加了写入和读取功能以一次写入和读取多条数据,并使 savemat和loadmat使用它们来提高性能。以前,HDF5 文件是针对每条数据打开和关闭的,这会影响性能,尤其是对于大文件。
- 0.1.9。错误修复和次要功能发布执行以下操作。
问题 #23。修复了字段名称为“O”的结构化np.ndarray永远无法写入 HDF5 COMPOUND 数据集的错误(错误地认为字段的 dtype 是对象)。
问题 #6。添加了可选的数据压缩和数据校验和的存储。由几个新选项控制。
- 0.1.8。错误修复版本修复了以下两个错误。
问题 #21。修复了在编写 MATLAB 元数据时编写dict类型时未设置“MATLAB_class”属性的错误。
问题 #22。修复了在dict键和结构化np.ndarray的字段名称中允许使用空字符 ( '\x00' ) 和正斜杠 ( '/' )的错误(除了在未按情况设置structured_numpy_ndarray_as_struct时允许正斜杠 当设置了matlab_compatible选项时)。这些会导致h5py包和 HDF5 库出现问题。 NotImplementedError现在在这些情况下被抛出。
- 0.1.7。错误修复版本增加了兼容性选项和一些添加的测试代码。做了以下。
修复了在 MATLAB MAT v7.3 文件中读取大于 2 GB 的变量时没有为hdf5storage.loadmat指定要读取的显式变量名称的问题。Fix 还通过删除不需要的内存副本来稍微减少内存消耗和处理时间。
选项现在将接受它不支持的任何其他关键字参数,忽略它们,以便与带有附加选项的未来包版本兼容。
添加了用于读取已压缩或应用了其他 HDF5 过滤器的数据的测试。
0.1.6。错误修复版本修复了在 32 位系统上确定 Python 2.x int的最大大小的错误。
- 0.1.5。错误修复版本修复了以下错误。
修复了在 Python 2.x 中回读时可能存储的int太大而无法放入int的错误。当它太大时,它会转换为long。
修复了int或long太大而无法放入np.int64引发错误异常的错误。
修复了无法正确读取或写入具有非 ASCII 字符(假定为 Python 2.x 中的 UTF-8 编码)的结构化np.ndarray的字段名称的错误。
修复了当设置该选项时,具有非 ASCII 字符的np.bytes_可能被错误地转换为 UTF-16 的错误(在进行 MATLAB 兼容性时隐式设置)。现在,它抛出一个NotImplementedError。
- 0.1.4。错误修复版本修复了以下错误。感谢mrdomino编写错误修复程序。
修复了当dtype是位置参数时,它被用作np.ndarray.astype的关键字参数的 错误。
修复了 Ubuntu 12.04 上没有h5py.__version__导致的错误。
- 0.1.3。错误修复版本修复了以下错误。
修复了正确读取和写入空结构化np.ndarray(具有字段)的能力。
- 0.1.2。错误修复版本修复了以下错误。
删除了对2.2之前的 h5py 版本的np.float16的错误支持,因为那时引入了对它的支持。
当未设置结构化的_numpy_ndarray_as_struct选项时,现在可以写入一个或多个字段为 “对象” dtype 的结构化 np.ndarray,而不会出现错误。它们被写成一个 HDF5 组,就像设置了选项一样。
当使用的 h5py 包的版本为2.3或更高版本时,已添加对 MATLAB 中结构数据类型的“MATLAB_fields”属性的支持。早期版本仍然缺少支持(此软件包需要最低版本2.1)。
检查类型dict中的非 unicode 字符串键(Python 3 中的str和 Python 2 中的unicode )是在对 HDF5 文件进行任何更改之前而不是在中间完成的,因此如果键无效,则不会应用任何更改存在。
HDF5 用户块在数据写入 HDF5 文件的开始而不是结束时设置了适当的元数据以支持 MATLAB,这意味着写入可能会崩溃,并且文件仍然是有效的 MATLAB 文件。
- 0.1.1。错误修复版本修复了以下错误。
str现在写成numpy.str_而不是 numpy.bytes_。
现在可以正确读取实部或虚部为nan 但另一部分不是的复数,而不是将两个部分都设置为nan。
修复了由于str.decode()和unicode.encode()不采用与 Python 3 中相同的关键字参数而导致的 Python 2 上的字符串转换错误 。
现在可以在 Python 2 上读取 MATLAB 结构体数组而不会产生错误。
如果设置了convert_numpy_str_to_utf16选项, numpy.str_现在在 Python 2 上写为numpy.uint16并且可以在不使用 UTF-16 双峰的情况下完成转换,而不是总是将它们写为numpy.uint32。
0.1。初始版本。