2014-04-22 17 views
15

Próbuję zapisać listę ciągów o zmiennej długości w zestawie danych HDF5. Kod tego jestPrzechowywanie listy ciągów do zestawu danych HDF5 z Python

import h5py 
h5File=h5py.File('xxx.h5','w') 
strList=['asas','asas','asas'] 
h5File.create_dataset('xxx',(len(strList),1),'S10',strList) 
h5File.flush() 
h5File.Close() 

ja otrzymuję błąd informujący, że „TypeError: Brak ścieżki konwersji dtype: dtype (” & lt U3')” gdzie & lt oznacza rzeczywisty mniej niż symbol
Jak mogę rozwiązać ten problem.

+0

Po pierwsze, masz literówkę na 'create_dataset'. Czy możesz podać dokładny kod, z którego korzystasz, szczególnie, skąd pochodzi 'strList'? – SlightlyCuban

+0

Przepraszam za literówkę, próbuję serializować ramkę danych pandy do pliku HDF5, więc muszę utworzyć nagłówek, który zawiera nazwy wszystkich kolumn, więc wyodrębniłem nazwy kolumn na liście i próbowałem zapisać je do Zbiór danych HDF5. – gman

+0

oprócz powyższego kodu naśladuje dokładnie podobną sytuację. – gman

Odpowiedz

14

Czytasz w ciągach Unicode, ale określając swój typ danych jako ASCII. Według the h5py wiki, h5py obecnie nie obsługuje tej konwersji.

Musisz kodowania napisów w formacie h5py uchwyty:

asciiList = [n.encode("ascii", "ignore") for n in strList] 
h5File.create_dataset('xxx', (len(asciiList),1),'S10', asciiList) 

Uwaga: Nie wszystko zakodowane w UTF-8 mogą być zakodowane w kodzie ASCII!

+0

Dziękujemy, że działało idealnie – gman

+0

Jaki jest właściwy sposób na ponowne wyodrębnienie tych ciągów z pliku hdf5 (w python3)? – DilithiumMatrix

+0

@DilithiumMatrix ASCII jest również poprawnym UTF-8, ale możesz użyć 'ascii.decode ('utf-8')' jeśli potrzebujesz 'str' type. Uwaga: moja odpowiedź spowoduje usunięcie znaków spoza zestawu ASCII. Jeśli zachowałeś je z 'encode ('unicode_escape')', potrzebujesz 'decode ('unicode_escape')' do konwersji rzeczy z powrotem. – SlightlyCuban

1

In HDF5, data in VL format is stored as arbitrary-length vectors of a base type. In particular, strings are stored C-style in null-terminated buffers. NumPy has no native mechanism to support this. Unfortunately, this is the de facto standard for representing strings in the HDF5 C API, and in many HDF5 applications.

Thankfully, NumPy has a generic pointer type in the form of the “object” (“O”) dtype. In h5py, variable-length strings are mapped to object arrays. A small amount of metadata attached to an “O” dtype tells h5py that its contents should be converted to VL strings when stored in the file.

Existing VL strings can be read and written to with no additional effort; Python strings and fixed-length NumPy strings can be auto-converted to VL data and stored.

Example

In [27]: dt = h5py.special_dtype(vlen=str) 

In [28]: dset = h5File.create_dataset('vlen_str', (100,), dtype=dt) 

In [29]: dset[0] = 'the change of water into water vapour' 

In [30]: dset[0] 
Out[30]: 'the change of water into water vapour' 
3

Jestem w podobnej sytuacji, którzy chcą przechowywać nazwy kolumn z dataframe jako zestawu danych w pliku HDF5. Zakładając df.columns jest to, co chcę, aby przechowywać, znalazłem następujące prace:

h5File = h5py.File('my_file.h5','w') 
h5File['col_names'] = df.columns.values.astype('S') 

Zakłada nazwy kolumn są „proste” struny, które mogą być zakodowane w kodzie ASCII.

Powiązane problemy