0

I am learning the program written by other programmer. So I would like to view the structure of the pickled item. Since I need to know the structure of pickled data, I am trying to load pickle in Ipython using Spyder... e.g.:

import pickle

data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
#selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()

I would like to know the structure of the .pkl file pickled here.

JJJ
  • 32,902
  • 20
  • 89
  • 102
Abhishek
  • 471
  • 5
  • 17

2 Answers2

1

It's not clear what you mean by structure. If I run your code, I can then do:

In [6]: with open('data.pkl','rb') as f:
   ...:     x = pickle.load(f)
   ...:     y = pickle.load(f)
   ...:     
   ...:     
In [7]: x
Out[7]: {'a': [1, 2.0, 3, (4+6j)], 'b': ('string', 'Unicode string'), 'c': None}
In [8]: y
Out[8]: [1, 2, 3]

I can recover your successive writes with an equal number of reads. If I try to get more I get a EOFError: Ran out of input.

What do you want to know? How any objects there are on the file? The structure of each object? The conversion between Python object and bytes on the file?

hpaulj
  • 221,503
  • 14
  • 230
  • 353
  • Thank you for the answer. Actually, I wanted to retrieve the pickled data in the console. I would like to know if I could know what type of data the pickled object contains without loading For eg: type(x) is dict type(y): list – Abhishek Mar 13 '17 at 08:54
  • Because we can give 2 times to load pickle when we know only 2 items are pickled x = pickle.load(f) y = pickle.load(f) but when we don't know how many items are there...Then how to deal with such issues. – Abhishek Mar 13 '17 at 09:07
1

What to do when we don't know how many items are pickled...

Found an answer:

unpickled_store = []
file_id = open('data.pkl','rb')
while True:
        try:
            unpickled_item = pickle.load(file_id)
            unpickled_store.append(unpickled_item)
        except EOFError:
            break
hpaulj
  • 221,503
  • 14
  • 230
  • 353
Abhishek
  • 471
  • 5
  • 17