>  기사  >  백엔드 개발  >  피클 라이브러리 사용에 대한 자세한 설명

피클 라이브러리 사용에 대한 자세한 설명

零下一度
零下一度원래의
2018-05-16 17:42:1254485검색

피클 라이브러리의 사용법은 "간단한 예를 통해 머신러닝이 무엇인지 이해하기" 글에 언급되어 있으며, 이번 글에서는 이에 대해 좀 더 자세히 설명하겠습니다.

그렇다면 직렬화 및 역직렬화 작업이 왜 필요한가요?

  1. 보관이 용이합니다. 직렬화 프로세스는 텍스트 정보를 이진 데이터 스트림으로 변환합니다. 이러한 방식으로 정보는 하드 디스크에 쉽게 저장됩니다. 파일을 읽어야 할 경우 하드 디스크에서 데이터를 읽은 다음 역직렬화하여 원본 데이터를 얻습니다. Python 프로그램이 실행되면 문자열, 목록, 사전과 같은 일부 데이터를 얻습니다. 단순히 메모리에 넣었다가 전원을 켜면 데이터가 손실되는 것이 아니라 나중에 사용할 수 있도록 오랫동안 저장하고 싶습니다. 끄다. Python 모듈 컬렉션의 Pickle 모듈은 유용하며 객체를 전송하거나 저장할 수 있는 형식으로 변환할 수 있습니다.

  2. load() 함수는 load() 함수와 동일한 역직렬화를 수행합니다. 스트림 개체를 받아들이고 파일에서 직렬화된 데이터를 읽는 대신 직렬화된 데이터가 포함된 str 개체를 받아들이고 개체를 직접 반환합니다.

  3. 코드 샘플:

  4. [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 &#39;str&#39;>    
    print obj1# 输出:python专用的存储格式    
      
    obj2 = pickle.loads(obj1)  
    print type(obj2)# 输出:<type &#39;tuple&#39;>    
    print obj2# 输出:(123, &#39;abcdedf&#39;, [&#39;ac&#39;, 123], {&#39;key1&#39;: &#39;value1&#39;, &#39;key&#39;: &#39;value&#39;})

  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(&#39;svm_model_iris.pkl&#39;, &#39;wb&#39;) as f:
        pickle.dump(svm_classifier, f)
    🎜직렬화 작업에는 다음이 포함됩니다.🎜🎜
      🎜
      import picklewith open(&#39;svm_model_iris.pkl&#39;, &#39;rb&#39;) as f:
          model = pickle.load(f)
      🎜🎜🎜역직렬화 작업에는 다음이 포함됩니다:🎜🎜🎜rrreee🎜🎜🎜pickle.load()🎜🎜🎜🎜Pickler(file, protocol).dump(obj)
      关于参数file,有一点需要注意,必须是以二进制的形式进行操作(写入)。
      参考前文的案例如下:

      import picklewith open(&#39;svm_model_iris.pkl&#39;, &#39;wb&#39;) 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,官方的详细介绍如下:

      피클 라이브러리 사용에 대한 자세한 설명

      2.2 序列化方法pickle.dumps()

      pickle.dumps()方法的参数如下:
      pickle.dumps(obj, protocol=None,*,fix_imports=True)
      pickle.dumps()方法跟pickle.dump()方法的区别在于,pickle.dumps()方法不需要写入文件中,它是直接返回一个序列化的bytes对象。

      2.3 序列化方法Pickler(file, protocol).dump(obj)

      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)。

      3 反序列化操作

      3.1 反序列化方法pickle.load()

      序列化的方法为 pickle.load(),该方法的相关参数如下:
      pickle.load(file, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)
      该方法实现的是将序列化的对象从文件file中读取出来。它的功能等同于 Unpickler(file).load()
      关于参数file,有一点需要注意,必须是以二进制的形式进行操作(读取)。
      参考前文的案例如下:

      import picklewith open(&#39;svm_model_iris.pkl&#39;, &#39;rb&#39;) as f:
          model = pickle.load(f)

      file为’svm_model_iris.pkl’,并且以二进制的形式(’rb’)读取。

      读取的时候,参数protocol是自动选择的,load()方法中没有这个参数。

      3.2 反序列化方法pickle.loads()

      pickle.loads()方法的参数如下:
      pickle.loads(bytes_object, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)
      pickle.loads()方法跟pickle.load()方法的区别在于,pickle.loads()方法是直接从bytes对象中读取序列化的信息,而非从文件中读取。

      3.3 反序列化方法Unpickler(file).load()

      pickle模块提供了反序列化的面向对象的类方法,即 class pickle.Unpickler(file, *,fix_imports=True, encoding="ASCII". errors="strict"),Pickler类有load()方法。
      Unpickler(file).load() 实现的功能跟 pickle.load() 是一样的。
      关于Unpickler类的其他method,请参考官方API。

      4 那些类型可以进行序列化和反序列化操作

      官方文档是这么介绍的,这里我就不进一步描述了。

      피클 라이브러리 사용에 대한 자세한 설명

      写在后面

      pickle模块还是比较实用的,当然,关于pickle模块,其实还有许多的信息可以去了解,想了解更多信息的童鞋,建议可以阅读下python官方的API文档(library文件)。

위 내용은 피클 라이브러리 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.