Skip to main content

How to Solve "EOFError: Ran out of input" with pickle.load() in Python

The EOFError: Ran out of input error occurs when Python's pickle.load() function tries to read pickled data from a file, but the file is either empty or the data is incomplete/corrupted.

This guide explains the causes of this error and provides practical solutions.

Understanding the EOFError with pickle

The pickle module is used for serializing (saving) and deserializing (loading) Python objects. The pickle.load() function reads pickled data from a file-like object. The EOFError: Ran out of input specifically means:

  • Empty File: The file you're trying to load is completely empty.
  • Incomplete Data: The file was not completely written to before pickle.dump() finished, resulting in a truncated or corrupted pickle file. This can happen if the program writing the file crashed, was interrupted, or didn't close the file properly.
  • Wrong File Mode: You are trying to read the file in a non-binary mode.

Incorrect Example (Illustrating the Error):

import pickle

file_path = 'employees.txt'

# Create an empty file (or a corrupted pickle file)
with open(file_path, 'wb') as f:
pass # Creates an empty file.

# ⛔️ EOFError: Ran out of input
with open(file_path, 'rb') as my_file: # Open in binary read mode
employee_data = pickle.load(my_file) # Try to load
print(employee_data)
  • The pickle.load() method attempts to load data from the file, however since the file is empty, the error is thrown.

Solution 1: Check File Size Before Loading

Before attempting to load data, check if the file has any content by verifying that its size is greater than 0:

import os
import pickle

file_path = 'employees.txt'

if os.path.getsize(file_path) > 0: # Check file size
with open(file_path, 'rb') as my_file: # Open in binary read mode
employee_data = pickle.load(my_file)
print(employee_data)
else:
print('The file is empty')
  • os.path.getsize(file_path): Gets the file size in bytes. A non-zero size suggests the file has content (though it doesn't guarantee the content is valid pickled data).
  • This is a proactive check that prevents the EOFError in many cases.

Solution 2: Handle EOFError with try-except

Even with a size check, it's possible (though less likely) to encounter an EOFError if the file is corrupted or was truncated during the unpickling process. Use a try-except block for robust error handling:

import pickle

file_path = 'employees.txt'

employee_data = {} # Default value

try:
with open(file_path, 'rb') as my_file:
employee_data = pickle.load(my_file)
print(employee_data)
except EOFError:
print('An EOFError exception occurred. The file is empty or corrupted.')
# Handle the error appropriately, e.g.,
# employee_data = {} # Set a default value
# OR
# raise # Re-raise the exception if you can't handle it here
  • The try...except EOFError block specifically catches the EOFError. You can then take appropriate action, such as:
    • Setting a default value for employee_data.
    • Logging an error message.
    • Retrying the load (if appropriate).
    • Raising a different exception to signal the problem to a higher level of your program.
  • You should never ignore the exception completely using pass because it will hide the fact that there has been an error, which will lead to more errors later.

Preventing the Error: Ensuring Data Integrity

The best way to avoid EOFError is to prevent the creation of empty or corrupted pickle files in the first place:

  • Always use with open(...): This ensures files are closed correctly, even if errors occur during writing.
  • Complete Write Operations: Make sure your pickle.dump() operation finishes completely before closing the file. If your program might be interrupted, consider writing to a temporary file and then renaming it to the final filename only after the pickle operation is successful.

Avoid opening file in 'wb' mode by mistake

Make sure that you don't accidentaly open the file you're trying to read in 'wb' mode before attempting to unpickle the data:

import pickle

file_path = 'employees.txt'

employees = {
'name': ['Alice', 'Tom Nolan', 'Carl'],
'age': [29, 25, 31]
}

with open(file_path, 'wb') as employees_file: # Open in write mode
employee_data = pickle.load(employees_file) # Incorrect operation
  • Opening a file in write or write binary mode will cause an io.UnsupportedOperation: not readable error.
  • Always use 'rb' (read binary) mode when unpickling data.

Conclusion

The EOFError: Ran out of input with pickle.load() indicates an empty or corrupted pickle file.

  • The most reliable solutions are to check the file size with os.path.getsize() before loading, and to always use a try-except EOFError block to handle potential issues gracefully.
  • Preventing the problem in the first place by ensuring complete write operations with pickle.dump() and using the with open(...) statement is crucial.