PYTHON

Python Pickle: Syntax, Usage, and Examples

The pickle module in Python lets you serialize and deserialize Python objects, meaning you can convert them to a byte stream and back again. This is especially useful for saving program state, caching data, or transferring Python objects between different executions.

In OOP projects or machine learning workflows, this process—called object serialization—allows developers to persist complex objects without rewriting initialization logic.

Pickle Python objects with just a few lines of code. You can store dictionaries, lists, sets, custom classes, and more—all in a compact binary format that preserves their full object hierarchy.


What Is Pickle in Python?

Pickling in Python refers to the process of converting a Python object into a byte stream using the pickle module. This process is also called serialization. The reverse—converting the byte stream back into an object—is called unpickling.

data = {"name": "Alice", "age": 30}
with open("data.pkl", "wb") as f:
    pickle.dump(data, f)

This example demonstrates how to use the python pickle dump method to store a dict in binary format. The saved file contains a bytes object representation of the original data.


Why Use Python Pickle

Pickle lets you store Python data structures directly to a file without needing to convert them into text formats like JSON or CSV. It supports more complex objects, such as custom classes and nested data structures, which makes it useful for prototyping, caching, and storing trained machine learning models.

Because pickle preserves the object hierarchy, you can easily restore nested objects, references, and methods without extra parsing or encoding logic.


Basic Syntax of Pickle Python

To serialize (pickle) an object:

pickle.dump(obj, file)

To deserialize (unpickle) an object:

obj = pickle.load(file)

Use binary file modes (wb, rb) to work with pickled data.

You can pass a callable object as part of the pickling process—for example, a function reference or Lambda—but keep in mind that only top-level functions and classes can be safely pickled.


Python Pickle Example

Pickling

import pickle

user = {"username": "johndoe", "email": "john@example.com"}
with open("user.pkl", "wb") as file:
    pickle.dump(user, file)

Unpickling

with open("user.pkl", "rb") as file:
    loaded_user = pickle.load(file)
print(loaded_user)

This is a simple example of how to create and load a pickle file Python program might use to store temporary data or results from a Python code execution.


Pickling Custom Classes

You can pickle custom objects easily:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person = Person("Alice", 30)
with open("person.pkl", "wb") as f:
    pickle.dump(person, f)

Then you can load the pickle file Python created:

with open("person.pkl", "rb") as f:
    loaded_person = pickle.load(f)

This demonstrates object serialization in action, preserving all attributes of your OOP class instance.


Customizing Pickling Behavior with __getstate__() and __setstate__()

For advanced control, define special methods to customize what gets saved or restored:

class Connection:
    def __init__(self, url):
        self.url = url
        self.status = "connected"

    def __getstate__(self):
        state = self.__dict__.copy()
        state["status"] = "disconnected"
        return state

    def __setstate__(self, state):
        self.__dict__.update(state)

The getstate method defines what is pickled, while setstate restores object attributes during unpickling. This can prevent unnecessary code execution when reloading sensitive connections or states.

Objects that cannot be serialized this way are known as unpicklable objects.


Pickling Protocols and Optimization

Pickle supports multiple protocols (versions of its serialization format). By default, it uses the latest version:

pickle.dump(obj, file, protocol=pickle.HIGHEST_PROTOCOL)

Using the highest protocol improves performance and reduces file size through internal optimization. When sharing pickled data between systems or Python versions, specify a lower protocol for compatibility.


Unpickling and Error Handling

To unpickle (deserialize) objects:

with open("data.pkl", "rb") as f:
    obj = pickle.load(f)

If unpickling fails due to corrupted data, version mismatch, or missing dependencies, you can catch errors gracefully:

import pickle
try:
    with open("data.pkl", "rb") as f:
        obj = pickle.load(f)
except Exception as e:
    print("Error unpickling:", e)

If you’re working with external data sources like JSON or XML, remember that pickle files are Python-specific and cannot be parsed by other tools.


Pickle and Numpy Arrays

When dealing with large numerical data, you can combine pickle with Numpy to serialize arrays efficiently:

import numpy as np, pickle

arr = np.array([1, 2, 3])
with open("array.pkl", "wb") as f:
    pickle.dump(arr, f)

Pickling stores array shapes and data types, letting you restore them later without reinitializing from scratch.

This is a common pattern in model training and scientific use cases where data persistence matters.


Unpickling Binary Data and Bytes

Unpickled data often returns as a bytes object before being fully deserialized. If you’re manually handling these bytes—for example, from an API—you can unpickle data like this:

import pickle
response = some_api_call()  # returns raw bytes
obj = pickle.loads(response.content)

This is also where marshalling (another term for serializing code objects) overlaps conceptually with pickling, although marshal is mainly used internally for compiled source code.


Pickling and Encoding Considerations

When pickling text-based objects or transferring data over networks, pay attention to encoding.

Although pickle handles its own binary representation, strings and non-ASCII characters still depend on how they were initially encoded. Mismatched encodings can cause decoding errors during unpickling.


Pickling in Python: Limitations

  • You cannot pickle open file handles or database connections.
  • Pickled data is not secure; avoid loading pickle files from untrusted sources.
  • Python version mismatches may cause unpickling errors.

Using Pickle with Protocols

Pickle supports several protocols (versions of the serialization format). By default, it uses the latest version:

pickle.dump(obj, file, protocol=pickle.HIGHEST_PROTOCOL)

Use this when sharing pickled data between different Python versions.


Loading Pickle File Python Programmatically

You can automate loading data in apps or data pipelines:

import pickle

def load_model():
    with open("model.pkl", "rb") as file:
        model = pickle.load(file)
    return model

This pattern is common in machine learning workflows.


Pickling in Python Example with Nested Structures

complex_data = {
    "name": "Example",
    "scores": [90, 85, 88],
    "attributes": {"height": 170, "weight": 65}
}

with open("complex.pkl", "wb") as f:
    pickle.dump(complex_data, f)

This shows pickling in Python working with nested dictionaries and lists.


When Not to Use Pickle

  • Avoid it when sharing data across different programming languages.
  • Avoid using it in public-facing applications that load external pickle files.
  • Use other formats like JSON or CSV if human readability or portability is more important.

Real-World Pickle Use Cases

  • Caching models and preprocessed datasets in machine learning.
  • Saving in-memory game states or simulation progress.
  • Serializing dict configurations or tuple-based datasets.
  • Passing structured data between APIs or cloud services that accept raw bytes.
  • Storing function states or serialized Lambda logic for later execution.

Best Practices for Using Python Pickle

  • Always open files in binary mode when using pickle.
  • Store version information with your data if it’s long-lived.
  • Use with open() blocks to manage file resources properly.
  • Don’t load pickle files from untrusted sources due to security risks.
  • Use the highest protocol for best performance and compatibility.

The Python pickle module gives you a flexible way to serialize and store objects across sessions. You’ve seen how to create, load, and manage pickle files in real-world scenarios. Pickling in Python is especially useful for applications involving large objects, trained models, and temporary session storage.

Learn to Code in Python for Free
Start learning now
button icon
To advance beyond this tutorial and learn Python by doing, try the interactive experience of Mimo. Whether you're starting from scratch or brushing up your coding skills, Mimo helps you take your coding journey above and beyond.

Sign up or download Mimo from the App Store or Google Play to enhance your programming skills and prepare for a career in tech.

You can code, too.

© 2025 Mimo GmbH

Reach your coding goals faster