Skip to content

Commit cd7b115

Browse files
committed
TST: fixed do_copy testing
BUG: more encoding/decoding issues
1 parent 8bbfb2e commit cd7b115

File tree

2 files changed

+33
-24
lines changed

2 files changed

+33
-24
lines changed

pandas/io/pytables.py

+17-16
Original file line numberDiff line numberDiff line change
@@ -765,9 +765,9 @@ def copy(self, file, mode = 'w', propindexes = True, keys = None, complib = None
765765
index = False
766766
if propindexes:
767767
index = [ a.name for a in s.axes if a.is_indexed ]
768-
new_store.append(k,data, index=index, data_columns=getattr(s,'data_columns',None))
768+
new_store.append(k, data, index=index, data_columns=getattr(s,'data_columns',None), encoding=s.encoding)
769769
else:
770-
new_store.put(k,data)
770+
new_store.put(k, data, encoding=s.encoding)
771771

772772
return new_store
773773

@@ -1043,13 +1043,13 @@ def convert(self, values, nan_rep, encoding):
10431043

10441044
kwargs = dict()
10451045
if self.freq is not None:
1046-
kwargs['freq'] = self.freq
1046+
kwargs['freq'] = _ensure_decoded(self.freq)
10471047
if self.tz is not None:
1048-
kwargs['tz'] = self.tz
1048+
kwargs['tz'] = _ensure_decoded(self.tz)
10491049
if self.index_name is not None:
1050-
kwargs['name'] = self.index_name
1050+
kwargs['name'] = _ensure_decoded(self.index_name)
10511051
try:
1052-
self.values = Index(_maybe_convert(values, self.kind, encoding), **kwargs)
1052+
self.values = Index(_maybe_convert(values, self.kind, self.encoding), **kwargs)
10531053
except:
10541054

10551055
# if the output freq is different that what we recorded, then infer it
@@ -1706,7 +1706,7 @@ def get_attrs(self):
17061706
""" retrieve our attributes """
17071707
self.encoding = _ensure_encoding(getattr(self.attrs,'encoding',None))
17081708
for n in self.attributes:
1709-
setattr(self,n,getattr(self.attrs, n, None))
1709+
setattr(self,n,_ensure_decoded(getattr(self.attrs, n, None)))
17101710

17111711
def write(self, obj, **kwargs):
17121712
self.set_attrs()
@@ -1847,7 +1847,7 @@ def read_multi_index(self, key):
18471847

18481848
def read_index_node(self, node):
18491849
data = node[:]
1850-
kind = node._v_attrs.kind
1850+
kind = _ensure_decoded(node._v_attrs.kind)
18511851
name = None
18521852

18531853
if 'name' in node._v_attrs:
@@ -1858,13 +1858,13 @@ def read_index_node(self, node):
18581858
factory = self._get_index_factory(index_class)
18591859

18601860
kwargs = {}
1861-
if 'freq' in node._v_attrs:
1861+
if u'freq' in node._v_attrs:
18621862
kwargs['freq'] = node._v_attrs['freq']
18631863

1864-
if 'tz' in node._v_attrs:
1864+
if u'tz' in node._v_attrs:
18651865
kwargs['tz'] = node._v_attrs['tz']
18661866

1867-
if kind in ('date', 'datetime'):
1867+
if kind in (u'date', u'datetime'):
18681868
index = factory(_unconvert_index(data, kind, encoding=self.encoding), dtype=object,
18691869
**kwargs)
18701870
else:
@@ -2077,7 +2077,7 @@ def write(self, obj, **kwargs):
20772077
self.attrs.default_kind = obj.default_kind
20782078
self.write_index('items', obj.items)
20792079

2080-
for name, sdf in obj.iteritems():
2080+
for name, sdf in obj.iterkv():
20812081
key = 'sparse_frame_%s' % name
20822082
if key not in self.group._v_children:
20832083
node = self._handle.createGroup(self.group, key)
@@ -3358,7 +3358,8 @@ def _get_converter(kind, encoding):
33583358
raise ValueError('invalid kind %s' % kind)
33593359

33603360
def _need_convert(kind):
3361-
if kind in ('datetime', 'datetime64', 'string'):
3361+
kind = _ensure_decoded(kind)
3362+
if kind in (u'datetime', u'datetime64', u'string'):
33623363
return True
33633364
return False
33643365

@@ -3464,7 +3465,7 @@ def __init__(self, field, op=None, value=None, queryables=None, i=None, encoding
34643465

34653466
# we have valid conditions
34663467
if self.op in ['>', '>=', '<', '<=']:
3467-
if hasattr(self.value, '__iter__') and len(self.value) > 1:
3468+
if hasattr(self.value, '__iter__') and len(self.value) > 1 and not isinstance(self.value,basestring):
34683469
raise ValueError("an inequality condition cannot have multiple values [%s]" % str(self))
34693470

34703471
if not is_list_like(self.value):
@@ -3559,7 +3560,7 @@ def stringify(value):
35593560
value = value.encode(self.encoding)
35603561
return value
35613562

3562-
kind = self.kind
3563+
kind = _ensure_decoded(self.kind)
35633564
if kind == u'datetime64' or kind == u'datetime' :
35643565
v = lib.Timestamp(v)
35653566
if v.tz is not None:
@@ -3576,7 +3577,7 @@ def stringify(value):
35763577
return TermValue(v,v,kind)
35773578
elif kind == u'bool':
35783579
if isinstance(v, basestring):
3579-
v = not stringify(v).strip().lower() in [u'false', u'f', u'no', u'n', u'none', u'0', u'[]', u'{}', u'']
3580+
v = not v.strip().lower() in [u'false', u'f', u'no', u'n', u'none', u'0', u'[]', u'{}', u'']
35803581
else:
35813582
v = bool(v)
35823583
return TermValue(v,v,kind)

pandas/io/tests/test_pytables.py

+16-8
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from pandas.tests.test_series import assert_series_equal
1818
from pandas.tests.test_frame import assert_frame_equal
1919
from pandas import concat, Timestamp
20+
from pandas.util import py3compat
2021

2122
from numpy.testing.decorators import slow
2223

@@ -1276,8 +1277,14 @@ def test_unimplemented_dtypes_table_columns(self):
12761277

12771278
with ensure_clean(self.path) as store:
12781279

1280+
l = [('date', datetime.date(2001, 1, 2))]
1281+
1282+
# py3 ok for unicode
1283+
if not py3compat.PY3:
1284+
l.append(('unicode', u'\u03c3'))
1285+
12791286
### currently not supported dtypes ####
1280-
for n, f in [('unicode', u'\u03c3'), ('date', datetime.date(2001, 1, 2))]:
1287+
for n, f in l:
12811288
df = tm.makeDataFrame()
12821289
df[n] = f
12831290
self.assertRaises(
@@ -2602,24 +2609,25 @@ def do_copy(f = None, new_f = None, keys = None, propindexes = True, **kwargs):
26022609

26032610
# check indicies & nrows
26042611
for k in tstore.keys():
2605-
if tstore.is_table(k):
2612+
if tstore.get_storer(k).is_table:
26062613
new_t = tstore.get_storer(k)
26072614
orig_t = store.get_storer(k)
26082615

26092616
self.assert_(orig_t.nrows == new_t.nrows)
2610-
for a in orig_t.axes:
2611-
if a.is_indexed:
2612-
self.assert_(new_t[a.name].is_indexed == True)
26132617

2614-
except (Exception), detail:
2615-
pass
2618+
# check propindixes
2619+
if propindexes:
2620+
for a in orig_t.axes:
2621+
if a.is_indexed:
2622+
self.assert_(new_t[a.name].is_indexed == True)
2623+
26162624
finally:
26172625
safe_close(store)
26182626
safe_close(tstore)
26192627
safe_remove(new_f)
26202628

26212629
do_copy()
2622-
do_copy(keys = ['df'])
2630+
do_copy(keys = ['/a','/b','/df1_mixed'])
26232631
do_copy(propindexes = False)
26242632

26252633
# new table

0 commit comments

Comments
 (0)