如何在pytables中创建可以存储Unicode字符串的压缩数据集?

时间:2014-01-14 23:33:19

标签: python string unicode compression pytables

我正在使用PyTables存储一个数据数组,工作正常;我需要存储一个包含JSON数据的中等大小(50K-100K)的Unicode字符串,我想压缩它。

我怎样才能在PyTables中这样做?自从我使用HDF5以来已经很长时间了,我记不起存储字符数组的正确方法,因此它们可以被压缩。 (我似乎无法在PyTables网站上找到类似的例子。)

2 个答案:

答案 0 :(得分:3)

PyTables本身并不支持unicode。存储unicode。首先将字符串转换为字节,然后存储长度为1的字符串或uint8的VLArray。要获得压缩,只需使用具有非零Filters的{​​{1}}实例来实例化数组。

我知道存储JSON数据的所有示例都使用HDF5 C-API。

答案 1 :(得分:3)

好的,根据Anthony Scopatz的方法,我有一个可行的解决方案。

def recordStringInHDF5(h5file, group, nodename, s, complevel=5, complib='zlib'):
    '''creates a CArray object in an HDF5 file 
    that represents a unicode string'''

    bytes = np.fromstring(s.encode('utf-8'),np.uint8)
    atom = pt.UInt8Atom()
    filters = pt.Filters(complevel=complevel, complib=complib)
    ca = h5file.create_carray(group, nodename, atom, shape=(len(bytes),),
                               filters=filters)
    ca[:] = bytes
    return ca
def retrieveStringFromHDF5(node):
    return unicode(node.read().tostring(), 'utf-8')

如果我这样做:

>>> h5file = pt.openFile("test1.h5",'w')
>>> recordStringInHDF5(h5file, h5file.root, 'mrtamb',
    u'\u266b Hey Mr. Tambourine Man \u266b')

/mrtamb (CArray(30,), shuffle, zlib(5)) ''
  atom := UInt8Atom(shape=(), dflt=0)
  maindim := 0
  flavor := 'numpy'
  byteorder := 'irrelevant'
  chunkshape := (65536,)

>>> h5file.flush()
>>> h5file.close()
>>> h5file = pt.openFile("test1.h5")
>>> print retrieveStringFromHDF5(h5file.root.mrtamb)

♫ Hey Mr. Tambourine Man ♫

我已经能够在300kB范围内使用字符串来运行它并获得良好的压缩比。