피클 라이브러리의 사용법은 "간단한 예를 통해 머신러닝이 무엇인지 이해하기" 글에 언급되어 있으며, 이번 글에서는 이에 대해 좀 더 자세히 설명하겠습니다.
그렇다면 직렬화 및 역직렬화 작업이 왜 필요한가요?
보관이 용이합니다. 직렬화 프로세스는 텍스트 정보를 이진 데이터 스트림으로 변환합니다. 이러한 방식으로 정보는 하드 디스크에 쉽게 저장됩니다. 파일을 읽어야 할 경우 하드 디스크에서 데이터를 읽은 다음 역직렬화하여 원본 데이터를 얻습니다. Python 프로그램이 실행되면 문자열, 목록, 사전과 같은 일부 데이터를 얻습니다. 단순히 메모리에 넣었다가 전원을 켜면 데이터가 손실되는 것이 아니라 나중에 사용할 수 있도록 오랫동안 저장하고 싶습니다. 끄다. Python 모듈 컬렉션의 Pickle 모듈은 유용하며 객체를 전송하거나 저장할 수 있는 형식으로 변환할 수 있습니다.
load() 함수는 load() 함수와 동일한 역직렬화를 수행합니다. 스트림 개체를 받아들이고 파일에서 직렬화된 데이터를 읽는 대신 직렬화된 데이터가 포함된 str 개체를 받아들이고 개체를 직접 반환합니다.
코드 샘플:
[python] view plain copy #!/usr/bin/env python # -*- coding: UTF-8 -*- import cPickle as pickle obj = 123, "abcdedf", ["ac", 123], {"key": "value", "key1": "value1"} print obj# 输出:(123, 'abcdedf', ['ac', 123], {'key1': 'value1', 'key': 'value'}) # 序列化到文件 with open(r"d:\a.txt", "r+") as f: pickle.dump(obj, f) with open(r"d:\a.txt") as f: print pickle.load(f)# 输出:(123, 'abcdedf', ['ac', 123], {'key1': 'value1', 'key': 'value'}) # 序列化到内存(字符串格式保存),然后对象可以以任何方式处理如通过网络传输 obj1 = pickle.dumps(obj) print type(obj1)# 输出:<type 'str'> print obj1# 输出:python专用的存储格式 obj2 = pickle.loads(obj1) print type(obj2)# 输出:<type 'tuple'> print obj2# 输出:(123, 'abcdedf', ['ac', 123], {'key1': 'value1', 'key': 'value'})
2. 전송이 쉽습니다. 두 프로세스가 원격으로 통신하면 다양한 유형의 데이터를 서로 보낼 수 있습니다. 어떤 유형의 데이터이든 바이너리 시퀀스 형태로 네트워크를 통해 전송됩니다. 송신자는 이 객체를 네트워크에서 전송하기 전에 바이트 시퀀스로 변환해야 합니다. 수신자는 바이트 시퀀스를 객체로 복원해야 합니다.
간단한 예를 통해 머신러닝이 무엇인지 이해해보세요
pickle은 Python 언어의 표준 모듈입니다. Pickle 라이브러리는 Python을 설치하면 이미 포함되어 있으므로 별도로 설치할 필요가 없습니다.
피클 모듈은 기본 데이터 직렬화 및 역직렬화를 구현합니다. 피클 모듈의 직렬화 연산을 통해 프로그램에서 실행 중인 객체 정보를 파일로 저장할 수 있으며, 피클 모듈의 역직렬화 연산을 통해 파일에서 마지막 프로그램이 저장한 객체를 생성할 수 있다.
공식 소개에서 직렬화 작업에 대한 영어 설명에는 "직렬화", "피클링", "직렬화", "마샬링" 또는 "평탄화" 등과 같은 여러 단어가 있습니다. 모두 직렬화의 의미를 나타냅니다. 이에 따라 "de-serializing", "unpickling", "deserailization" 등과 같이 deserialization 작업을 나타내는 영어 단어가 많이 있습니다. 혼란을 피하기 위해 일반적으로 "피클링"/"언피클링" 또는 "직렬화"/"역직렬화"를 사용합니다. pickle
모듈은 바이너리 형식으로 직렬화되어 파일에 저장되며(저장된 파일의 접미사는 ".pkl"임) 미리보기를 위해 직접 열 수 없습니다. 그리고 pythonjson
은 사람이 읽을 수 있으며 직접 열고 볼 수 있습니다(예: 메모장++에서 볼 수 있음). pickle
模块是以二进制的形式序列化后保存到文件中(保存文件的后缀为”.pkl”),不能直接打开进行预览。而python的另一个序列化标准模块json
,则是human-readable的,可以直接打开查看(例如在notepad++中查看)。
pickle模块有两类主要的接口,即序列化和反序列化。
常采用这样的方式使用:
[python] view plain copy import cPickle as pickle pickle.dump(obj,f) pickle.dumps(obj,f) pickle.load(f) pickle.loads(f)
其中序列化操作包括:
pickle.dump()
反序列化操作包括:
Pickler(file, protocol).dump(obj)
pickle.load()
Unpickler(file).load()
import picklewith open('svm_model_iris.pkl', 'wb') as f: pickle.dump(svm_classifier, f)
import picklewith open('svm_model_iris.pkl', 'rb') as f: model = pickle.load(f)
pickle.load()
🎜🎜🎜🎜Pickler(file, protocol).dump(obj)
。import picklewith open('svm_model_iris.pkl', 'wb') as f: pickle.dump(svm_classifier, f)
file为’svm_model_iris.pkl’,并且以二进制的形式(’wb’)写入。
关于参数protocol,一共有5中不同的类型,即(0,1,2,3,4)。(0,1,2)对应的是python早期的版本,(3,4)则是在python3之后的版本。
此外,参数可选 pickle.HIGHEST_PROTOCOL和pickle.DEFAULT_PROTOCOL。当前,python3.5版本中,pickle.HIGHEST_PROTOCOL的值为4,pickle.DEFAULT_PROTOCOL的值为3。当protocol参数为负数时,表示选择的参数是pickle.HIGHEST_PROTOCOL。
关于参数protocol,官方的详细介绍如下:
pickle.dumps()
方法的参数如下:
pickle.dumps(obj, protocol=None,*,fix_imports=True)pickle.dumps()
方法跟pickle.dump()
方法的区别在于,pickle.dumps()
方法不需要写入文件中,它是直接返回一个序列化的bytes对象。
pickle模块提供了序列化的面向对象的类方法,即 class pickle.Pickler(file, protocol=None,*,fix_imports=True)
,Pickler类有dump()方法。
Pickler(file, protocol).dump(obj) 实现的功能跟 pickle.dump() 是一样的。
关于Pickler类的其他method,请参考官方API。
插播一条硬广:技术文章转发太多,本文来自微信公众号:“Python数据之道”(ID:PyDataRoad)。
序列化的方法为 pickle.load()
,该方法的相关参数如下:
pickle.load(file, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)
该方法实现的是将序列化的对象从文件file中读取出来。它的功能等同于 Unpickler(file).load()
。
关于参数file,有一点需要注意,必须是以二进制的形式进行操作(读取)。
参考前文的案例如下:
import picklewith open('svm_model_iris.pkl', 'rb') as f: model = pickle.load(f)
file为’svm_model_iris.pkl’,并且以二进制的形式(’rb’)读取。
读取的时候,参数protocol是自动选择的,load()方法中没有这个参数。
pickle.loads()
方法的参数如下:
pickle.loads(bytes_object, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)pickle.loads()
方法跟pickle.load()
方法的区别在于,pickle.loads()
方法是直接从bytes对象中读取序列化的信息,而非从文件中读取。
pickle模块提供了反序列化的面向对象的类方法,即 class pickle.Unpickler(file, *,fix_imports=True, encoding="ASCII". errors="strict")
,Pickler类有load()方法。
Unpickler(file).load() 实现的功能跟 pickle.load() 是一样的。
关于Unpickler类的其他method,请参考官方API。
官方文档是这么介绍的,这里我就不进一步描述了。
pickle模块还是比较实用的,当然,关于pickle模块,其实还有许多的信息可以去了解,想了解更多信息的童鞋,建议可以阅读下python官方的API文档(library文件)。
위 내용은 피클 라이브러리 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!