使用unicode在hdf5中存储字符串数据集

时间:2017-06-20 19:25:18

标签: python-3.x utf-8 h5py

我正在尝试从包含特殊字符的文件中存储变量字符串表达式,例如ø, æ , and å。这是我的代码:

import h5py as h5
file = h5.File('deleteme.hdf5','a')
dt = h5.special_dtype(vlen=str)
dset = file.create_dataset("text",(1,),dtype=dt)
dset.attrs[str(1)] = "some text with ø, æ, å"

但是文本存储不正确。存储的数据包含文本:

"some text with \37777777703\37777777670, \37777777703\37777777646,\37777777703\37777777645"

如何正确存储特殊字符?我试图遵循文档中提供的指南:Strings in HDF5 - Variable-length UTF-8

修改

输出来自h5dump。下面的答案证实这些字符已正确存储为utf-8。

2 个答案:

答案 0 :(得分:2)

使用:

import numpy as np
import h5py as h5
file = h5.File('deleteme.hdf5','w')
dt = h5.special_dtype(vlen=str)
dset = file.create_dataset("text",(3,),dtype=dt)
dset[:] = 'ø æ å'.split()
dset.attrs["1"] = "some text with ø, æ, å"
file.close()

file = h5.File('deleteme.hdf5','r')
print(file['text'][:])
print(file['text'].attrs["1"])
file.close()

我明白了:

$ python3 stack44661467.py 
['ø' 'æ' 'å']
some text with ø, æ, å

h5py确实将字符串看作/解释为unicode - 写作和阅读。

使用转储实用程序:

$ h5dump deleteme.hdf5 
HDF5 "deleteme.hdf5" {
GROUP "/" {
   DATASET "text" {
      DATATYPE  H5T_STRING {
         STRSIZE H5T_VARIABLE;
         STRPAD H5T_STR_NULLTERM;
         CSET H5T_CSET_UTF8;
         CTYPE H5T_C_S1;
      }
      DATASPACE  SIMPLE { ( 3 ) / ( 3 ) }
      DATA {
      (0): "\37777777703\37777777670", "\37777777703\37777777646",
      (2): "\37777777703\37777777645"
      }
      ATTRIBUTE "1" {
         DATATYPE  H5T_STRING {
            STRSIZE H5T_VARIABLE;
            STRPAD H5T_STR_NULLTERM;
            CSET H5T_CSET_UTF8;
            CTYPE H5T_C_S1;
         }
         DATASPACE  SCALAR
         DATA {
         (0): "some text with \37777777703\37777777670, \37777777703\37777777646, \37777777703\37777777645"
         }
      }
   }
}
}

请注意,datatype标记为UTF8

     DATATYPE  H5T_STRING {
         STRSIZE H5T_VARIABLE;
         STRPAD H5T_STR_NULLTERM;
         CSET H5T_CSET_UTF8;
         CTYPE H5T_C_S1;
      }

这就是文档所说的内容:

http://docs.h5py.org/en/latest/strings.html#variable-length-utf-8

  

它们可以存储Python unicode字符串可以存储的任何字符,但NULL除外。在文件中,这些文件被创建为具有字符集H5T_CSET_UTF8的可变长度字符串。

h5py(或其他读者)担心将\37777777703\37777777670解释为正确的unicode字符。

答案 1 :(得分:1)

您应该尝试通过执行以下操作以UTF-8格式存储数据:

以utf-8格式编码(在使用h5py存储之前):

u"æ".encode("utf-8")

返回:

'\xc3\xa6'

然后解码你可以像这样使用字符串解码:

'\xc3\xa6'.decode("utf-8")

会返回:

æ

希望它有所帮助!

修改

当您打开文件并希望它们位于utf-8中时,您可以在读取文件方法上使用encoding参数:

f = open(fname, encoding="utf-8")

这应该有助于正确编码原始文件。

来源:python-notes