@@ -556,10 +556,6 @@ def _read_wide_table(self, group, where=None):
556
556
557
557
def _write_index (self , group , key , index ):
558
558
if isinstance (index , MultiIndex ):
559
- if len (index ) == 0 :
560
- raise ValueError ('Can not write empty structure, '
561
- 'axis length was 0' )
562
-
563
559
setattr (group ._v_attrs , '%s_variety' % key , 'multi' )
564
560
self ._write_multi_index (group , key , index )
565
561
elif isinstance (index , BlockIndex ):
@@ -569,10 +565,6 @@ def _write_index(self, group, key, index):
569
565
setattr (group ._v_attrs , '%s_variety' % key , 'sparseint' )
570
566
self ._write_sparse_intindex (group , key , index )
571
567
else :
572
- if len (index ) == 0 :
573
- raise ValueError ('Can not write empty structure, '
574
- 'axis length was 0' )
575
-
576
568
setattr (group ._v_attrs , '%s_variety' % key , 'regular' )
577
569
converted , kind , _ = _convert_index (index )
578
570
self ._write_array (group , key , converted )
@@ -658,7 +650,7 @@ def _read_multi_index(self, group, key):
658
650
names .append (name )
659
651
660
652
label_key = '%s_label%d' % (key , i )
661
- lab = getattr (group , label_key )[:]
653
+ lab = _read_array (group , label_key )
662
654
labels .append (lab )
663
655
664
656
return MultiIndex (levels = levels , labels = labels , names = names )
@@ -719,7 +711,14 @@ def _write_array(self, group, key, value):
719
711
self .handle .createArray (group , key , value .view ('i8' ))
720
712
getattr (group , key )._v_attrs .value_type = 'datetime64'
721
713
else :
722
- self .handle .createArray (group , key , value )
714
+ if any (x == 0 for x in value .shape ):
715
+ # ugly hack for length 0 axes
716
+ arr = np .empty ((1 ,) * value .ndim )
717
+ self .handle .createArray (group , key , arr )
718
+ getattr (group , key )._v_attrs .value_type = str (value .dtype )
719
+ getattr (group , key )._v_attrs .shape = value .shape
720
+ else :
721
+ self .handle .createArray (group , key , value )
723
722
724
723
def _write_table (self , group , items = None , index = None , columns = None ,
725
724
values = None , append = False , compression = None ):
@@ -805,7 +804,11 @@ def _read_group(self, group, where=None):
805
804
806
805
def _read_series (self , group , where = None ):
807
806
index = self ._read_index (group , 'index' )
808
- values = _read_array (group , 'values' )
807
+ if len (index ) > 0 :
808
+ values = _read_array (group , 'values' )
809
+ else :
810
+ values = []
811
+
809
812
name = getattr (group ._v_attrs , 'name' , None )
810
813
return Series (values , index = index , name = name )
811
814
@@ -959,7 +962,15 @@ def _read_array(group, key):
959
962
if isinstance (node , tables .VLArray ):
960
963
return data [0 ]
961
964
else :
962
- dtype = getattr (node ._v_attrs , 'value_type' , None )
965
+ attrs = node ._v_attrs
966
+
967
+ dtype = getattr (attrs , 'value_type' , None )
968
+ shape = getattr (attrs , 'shape' , None )
969
+
970
+ if shape is not None :
971
+ # length 0 axis
972
+ return np .empty (shape , dtype = dtype )
973
+
963
974
if dtype == 'datetime64' :
964
975
return np .array (data , dtype = 'M8[ns]' )
965
976
return data
0 commit comments