[SciPy-user] How to read legacy scipy.Pickler arrays?
Robert Kern
robert.kern at gmail.com
Mon Mar 24 18:16:18 EDT 2008
On Mon, Mar 24, 2008 at 4:56 PM, Mark Coletti <mcoletti at gmail.com> wrote:
> Ok, I give up. What do I need to do to read legacy scipy pickled data?
Here is the relevant code from old Numeric. It should be
straightforward to update for numpy.
def DumpArray(m, fp):
if m.typecode() == 'O':
raise TypeError, "Numeric Pickler can't pickle arrays of Objects"
s = m.shape
if LittleEndian: endian = "L"
else: endian = "B"
fp.write("A%s%s%d " % (m.typecode(), endian, m.itemsize()))
for d in s:
fp.write("%d "% d)
fp.write('\n')
fp.write(m.tostring())
def LoadArray(fp):
ln = string.split(fp.readline())
if ln[0][0] == 'A': ln[0] = ln[0][1:] # Nasty hack showing my
ignorance of pickle
typecode = ln[0][0]
endian = ln[0][1]
shape = map(lambda x: string.atoi(x), ln[1:])
itemsize = string.atoi(ln[0][2:])
sz = reduce(multiply, shape)*itemsize
data = fp.read(sz)
m = fromstring(data, typecode)
m = reshape(m, shape)
if (LittleEndian and endian == 'B') or (not LittleEndian and endian == 'L'):
return m.byteswapped()
else:
return m
import pickle, copy
class Unpickler(pickle.Unpickler):
def load_array(self):
self.stack.append(LoadArray(self))
dispatch = copy.copy(pickle.Unpickler.dispatch)
dispatch['A'] = load_array
class Pickler(pickle.Pickler):
def save_array(self, object):
DumpArray(object, self)
dispatch = copy.copy(pickle.Pickler.dispatch)
dispatch[ArrayType] = save_array
--
Robert Kern
"I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth."
-- Umberto Eco
More information about the SciPy-User
mailing list