все Python 3Файлы и I/Oпонятие
pickle
pickle
Сериализация Python-объектов в бинарный формат. Сохраняет произвольные объекты. Не безопасно для ненадёжных данных!
Синтаксис
import pickle
pickle.dump(obj, f)
pickle.load(f)
Файл обязательно открывается в бинарном режиме ('wb' для dump, 'rb' для load) — с обычным 'w' будет TypeError. Формат чисто питоновский и завязан на код: при загрузке классы объектов должны импортироваться по тому же пути, что и при сохранении, поэтому после переименования модуля или класса старые .pkl перестают читаться — для обмена данными с другими программами берите JSON.
Примеры
import pickle, os, tempfile
data = {'key': [1,2,3], 'val': (4,5)}
path = os.path.join(tempfile.gettempdir(), 'data.pkl')
with open(path,'wb') as f:
pickle.dump(data, f)
with open(path,'rb') as f:
loaded = pickle.load(f)
print(loaded) # → {'key':[1,2,3],'val':(4,5)}
import pickle, os, tempfile
# dumps/loads — в bytes
bytes_data = pickle.dumps([1,'hello',3.14])
print(bytes_data[:10]) # → ? первые байты пикла, зависят от протокола
print(pickle.loads(bytes_data)) # → [1,'hello',3.14]
import pickle, os, tempfile
# Сериализация объекта класса
class Point:
def __init__(self,x,y): self.x=x;self.y=y
def __repr__(self): return f'Point({self.x},{self.y})'
p = Point(1,2)
bytes_p = pickle.dumps(p)
print(pickle.loads(bytes_p)) # → Point(1,2)
import pickle, os, tempfile
# Протоколы
print(pickle.HIGHEST_PROTOCOL) # → 5
bytes2 = pickle.dumps([1,2,3], protocol=2)
print(pickle.loads(bytes2)) # → [1,2,3]
import pickle, os, tempfile
# ВНИМАНИЕ: pickle небезопасен для чужих данных!
# Никогда не делай pickle.load() из ненадёжного источника!
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности