2014-04-22 9 views
15

Ich versuche, eine Liste variabler Länge von Zeichenfolge zu einem HDF5-Dataset zu speichern. Der Code dafür istSpeichern einer Liste von Zeichenfolgen zu einem HDF5-Dataset von 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() 

ich eine Störung erhalte die besagt, dass "Typeerror: No Umsetzungsweg für dtype: dtype (‘ & lt U3')" wo die & lt bedeutet tatsächlich kleiner als Symbol
Wie kann ich dieses Problem lösen.

+0

Für den Anfang haben Sie einen Tippfehler auf 'create_dataset'. Kannst du genau den Code angeben, den du benutzt, insbesondere, woher 'strList' kommt? – SlightlyCuban

+0

Entschuldigung wegen des Tippfehlers, ich versuche, einen Pandas-Datenrahmen zu einer HDF5-Datei zu serialisieren, also muss ich einen Header erstellen, der die Namen aller Spalten enthält, also extrahierte ich die Spaltennamen in einer Liste und versuchte, sie in a zu schreiben HDF5-Datensatz. – gman

+0

bis auf den Tippfehler über obigen Code emuliert genau die gleiche Situation – gman

Antwort

14

Sie lesen in Unicode-Strings, geben aber Ihren Datentyp als ASCII an. Gemäß the h5py wiki unterstützt h5py diese Konvertierung derzeit nicht.

Sie werden die Saiten in einem Format h5py Griffe codieren müssen:

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

Hinweis: nicht alles in UTF-8 kodiert in ASCII codiert werden!

+0

Vielen Dank, das hat perfekt funktioniert – gman

+0

Was ist der richtige Weg, diese Zeichenfolgen aus der hdf5-Datei (in Python3) wieder zu extrahieren? – DilithiumMatrix

+0

@DilithiumMatrix ASCII ist auch gültig UTF-8, aber Sie können 'ascii.decode ('utf-8')' verwenden, wenn Sie 'str' Typ benötigen. Hinweis: Mit meiner Antwort werden Nicht-ASCII-Zeichen gelöscht. Wenn Sie sie mit 'encode ('unicode_escape')' konserviert haben, müssen Sie 'decode ('unicode_escape')' dekodieren, um Dinge zurück zu konvertieren. – 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

Ich bin in einer ähnlichen Situation in hdf5 Datei speichern Spaltennamen von Datenrahmen als Datensatz zu wollen. Unter der Annahme, df.columns ist, was ich speichern wollen, fand ich folgende Arbeiten:

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

Dies setzt voraus, die Spaltennamen sind ‚einfache‘ Strings, die in ASCII codiert werden können.