首页 > 解决方案 > Matlab & HDF5:写入的字符串属性具有 b'string' 格式

问题描述

我正在使用带有字符串属性的 hdf5 结构。我通常用python写数据,没有问题。现在我需要从 matlab 编写相同的结构。

对于我使用 h5writeatt() 的属性,例如:

h5writeatt(filepath, dataset, 'myattr', 'mystringvalue'); 

当我使用 h5py 从 python 读取属性时,所有属性都以格式返回

值 = b'mystringvalue'

任何想法为什么matlab使用这种格式以及如何禁用它?我正在做的字符串比较失败了,因为 b 和 ' 是字符串的一部分。当然,编写一个小函数来检查这种格式并删除它并不难,但似乎是不必要的开销。

谢谢你的帮助

标签: matlabtypesattributeshdf5

解决方案


b'foo'是 Python字节序列对象的表示,而不是字符串。

Python 3.x 中的字符串是一种不同的数据类型,它是 Unicode 代码点序列,而不是字节,因此 Python(与 MATLAB 不同)可以正确处理多种语言的文本。

如果将字节序列与字符串进行比较,它们是不一样的:

>>> s = 'foo'
>>> b = bytes([102, 111, 111])
>>> b
b'foo'
>>> s == b
False

为了能够比较它们,您需要将encode字符串与字节对象进行比较,或者decode将字节对象与字符串进行比较:

>>> s.encode('ascii') == b
True
>>> s == b.decode('ascii')
True

请注意,您必须指定要用于在字符串和字节之间进行转换的编码。ascii将始终将一个代码点转换为一个字节,反之亦然,但如果它遇到大于 127 的字节值,则会引发错误 - 如果您需要使用这些字符,那么您需要决定您正在使用哪个代码页并指定一个合适的编解码器。当然,发明 Unicode 就是为了消除这种令人头疼的问题。


推荐阅读