2017-06-20 103 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

相關問題