2017-06-20 44 views
0

我想从包含特殊字符的文件中存储可变字符串表达式,如ø, æ , and å。这是我的代码:用unicode在hdf5中存储字符串数据集

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。

+0

用Python3'h5py'读取字符看起来很好。我确实用'h5dump'来看你的代码。 – hpaulj

+0

'h5dump'也显示该字符串的'DATATYPE'是'CSET H5T_CSET_UTF8;' – hpaulj

回答

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 - 写入和读取。

随着dump工具:

$ 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

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

要编码UTF-8格式(storingwith h5py前)做:

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

返回:

'\xc3\xa6' 

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

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

这将返回:

æ 

希望它能帮助!

编辑

当你打开的文件,你想他们是UTF-8,你可以使用的编码参数上读取文件的方法:

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

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

来源:python-notes

+0

我正在从包含这些字符的文件中读取文本,并随即存储文本。使用你的方法,我不得不改变文件本身,或者通过检查每个被读取的字符来实现。 – imranal

+0

当我使用这个'encode'' h5dump'显示相同的字符串,但将它标记为'CSET H5T_CSET_ASCII;' – hpaulj

+0

嗯。对不起,你是绝对正确的我编辑后没有重读这个问题。我会做更多的搜索并尝试找到某些东西,但我认为你的解决方案将与编码到utf-8有关! – cosinepenguin

相关问题