Search code examples
pythonpickle

Converting the output of pickle.dumps() into a string and back?


In my Python program, I have a list with some objects from a custom class:

# Some example program, not the actual code.
class SomeClass:
    def __init__(self):
        import random
        import os
        self.thing = random.randint(5,15)
        self.thing2 = str(os.urandom(16))
        self.thing3 = random.randint(1,10)
        self.thing4 = "You get the idea"
a_list = [SomeClass(),SomeClass(),SomeClass(),SomeClass(),SomeClass()]
import pickle
print((pickle.dumps(a_list)))

I need to convert the output of pickle.dumps() into a string, which is easy enough, but how do I convert that back into a byte stream that pickle.loads() can use? Help would be appreciated.

  • I tried converting it into UTF-8, but since the file I need to save the string to is UTF-8 encoded, so that did not work.

Solution

  • The usual way to "stringify" binary data is to base64-encode it:

    >>> import pickle
    >>> import base64
    >>> L = list(range(5))
    >>> ps = pickle.dumps(L)
    >>> ps
    b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00]\x94(K\x00K\x01K\x02K\x03K\x04e.'
    >>> s = base64.b64encode(ps).decode('ascii')
    >>> s
    'gASVDwAAAAAAAABdlChLAEsBSwJLA0sEZS4='
    >>># Round trip
    >>> pickle.loads(base64.b64decode(s))
    [0, 1, 2, 3, 4]
    

    Base64 encoding is usually used for transferring binary data in text-only environments (such as HTTP, or email). However if you want to save your pickled data to a file you can do this directly by opening the file in binary mode:

    with open('myfile.bin', 'wb') as f:
        pickle.dump(my_object, f)