Исключение `EOFError` в Python при работе с файлами (чаще при `pickle.load()`, `struct.unpack()`, или `read()` после конца файла).
---
Причины:
1. Попытка чтения из пустого файла (например, `pickle.load(open('file.pkl','rb'))` при `file.pkl` размер 0 байт).
2. Файл повреждён: данные обрываются до полного десериализуемого блока.
3. Использование `input()` или `sys.stdin.read()` при закрытом потоке ввода (редко в файловом контексте).
4. Ошибка режима открытия: бинарные данные читаются в текстовом режиме (`'r'` вместо `'rb'`).
---
Решение:
1. Проверка размера файла перед десериализацией
python
import os
import pickle
filepath = 'data.pkl'
if os.path.getsize(filepath) > 0:
with open(filepath, 'rb') as f:
data = pickle.load(f)
else:
data = None # или ваша логика по умолчанию2. Обработка исключения
python
try:
with open(filepath, 'rb') as f:
data = pickle.load(f)
except EOFError:
data = None # файл пуст или повреждён3. Чтение до конца файла (для текстовых/бинарных последовательных данных)
python
with open('file.txt', 'r') as f:
while True:
line = f.readline()
if not line: # EOF – readline() возвращает пустую строку
break
# обработка line4. Корректный режим открытия
- Для `pickle`, `struct` – всегда `'rb'` или `'wb'`.
- Для текста – `'r'` или `'rt'` (явно).
- Проверьте, не используется ли `'r'` для бинарных данных (вызывает EOFError при чтении байтов в строку).
5. Альтернатива – `pathlib`
python
from pathlib import Path
if Path(filepath).stat().st_size > 0:
with open(filepath, 'rb') as f:
data = pickle.load(f)