Pythonプログラミング-pickleモジュールの使用詳細(例付)


1.モジュールの紹介
pickleモジュールを紹介する前に、pythonのモジュールとモジュールの分類を理解し、モジュールをより深く理解することができます.
(1)モジュールは何ですか.
  • Pythonモジュール(Module)は、Pythonファイルである.pyの最後に、Pythonオブジェクト定義とPython文が含まれています.
  • モジュールは、Pythonコードセグメントを論理的に組織することができます.
  • 関連するコードを1つのモジュールに割り当てると、コードがより使いやすく、分かりやすくなります.
  • モジュールは関数、クラス、変数を定義することができ、モジュールには実行可能なコードも含まれます.
  • 他のプログラムに参照され、このモジュールの関数などの機能を使用することができ、Pythonの標準ライブラリを使用するのもこの方法です.

  • (2)モジュールの分類:
    Pythonでは、モジュールは次のように分類されます.
  • システム内蔵モジュール:sys、time、jsonモジュールなど、pythonをインストールした後、モジュールをインポートする形式で直接使用することができます.
  • カスタムモジュール:カスタムモジュールは自分で書いたモジュールで、ある論理またはいくつかの関数をカプセル化して他の関数に呼び出す.(注:カスタムモジュールの名前は、システムに組み込まれているモジュールと重複することはできません.そうしないと、システムに組み込まれているモジュールをインポートできません).たとえば、osをカスタマイズします.pyモジュールを使用すると、pythonに内蔵されているモジュールは使用できません.
  • サードパーティのオープンソースモジュール:このモジュールはpip installモジュール名でインストールでき、オープンソースのコードがあります.

  • 2.pickleモジュールの紹介
    (1)pickleモジュール:
    pickleモジュールはpython言語のシステム内蔵モジュールであり、pythonをインストールした後にpickleライブラリが含まれており、単独でインストールする必要はありません.
    (2)pickleモジュールの特徴:
    1、pythonでのみ使用でき、pythonの基本データ型のみをサポートし、python独自のモジュールである.
    2、シーケンス化の場合、メモリアドレスではなくシーケンスオブジェクト全体をシーケンス化します.
    3、pickleには2種類の主要なインタフェースがあり、すなわちシーケンス化と逆シーケンス化である.
    pickleモジュールのシーケンス化操作により、プログラムで実行されているオブジェクト情報をファイルに保存し、永続的に保存することができます.
    pickleモジュールの逆シーケンス化操作により、前回プログラムで保存したオブジェクトをファイルから作成できます.
    (3)なぜシーケンス化と逆シーケンス化が必要なのか.
    1、保存しやすい
    シーケンス化プロセスはPythonプログラムの実行中にいくつかの文字列、リスト、辞書などのデータ情報をバイナリデータストリームに変換することである.これにより、ハードディスク(HDD)に情報が格納されやすくなり、ファイルを読み込む必要がある場合、ハードディスク(HDD)からデータを読み出し、逆シーケンス化して元のデータを得ることができます.
    2、伝送しやすい
    2つのプロセスがリモート通信を行う場合、互いに様々なタイプのデータを送信することができる.どのタイプのデータでも、ネットワーク上でバイナリシーケンスとして転送されます.送信側はオブジェクトをバイトシーケンスに変換し、ネットワーク上で伝送する必要がある.受信者はバイトシーケンスをオブジェクトに復元し,元のデータを得る必要がある.
    3.pickleモジュールの使用
    (1)シーケンス化操作:
    シーケンス化方法1:pickle.dump()
    フォーマット:pickle.dump(obj,file)
    この方法は、シーケンス化されたオブジェクトobjをファイルfileにバイナリ形式で書き込み、保存し、直接プレビューできない.ファイルfileについては、バイナリ形式で操作(書き込み)する必要があります.
    例は以下の通りである:5人の学生の成績を成績表に記入し、cjbに保存する.txtファイル内
    import random
    import pickle
    
    #        
    cjb=[]
    
    #  5           
    for i in range(5):
        name=input("name:")        #  
        cj=random.randint(50,100)  #    50——100         
        cjb.append([name,cj])
    print(cjb)
    
    #           cjb.txt   
    with open('cjb.txt','wb')as f:
        pickle.dump(cjb,f)
        print("     ")
    
    
        :
    name:1
    name:2
    name:3
    name:4
    name:5
    [['1', 65], ['2', 82], ['3', 95], ['4', 99], ['5', 59]]
         

     
    シーケンス化方法2:pickle.dumps()
    フォーマット:pickle.dumps(obj)
    pickle.dumps()メソッドとpickle.dump()方法の違い:pickle.dumps()メソッドは、ファイルに書き込む必要はありません.シーケンス化されたbytesオブジェクトを直接返します.
    例は以下の通りである:上記の例と同様に、方法が異なるだけで、5人の学生の成績を成績表に記入し、cjbに保存する.txtファイル内
    import random
    import pickle
    
    #        
    cjb=[]
    
    #  5           
    for i in range(5):
        name=input("name:")       #  
        cj=random.randint(50,100) #  
        cjb.append([name,cj])
    print(cjb)
    print(pickle.dumps(cjb))       #    bytes  
    print(type(pickle.dumps(cjb))) #class 'bytes'
    
    #           cjb.txt   
    with open('cjb.txt','wb')as f:
        f.write(pickle.dumps(cjb))
        print("     ")
    
    
        :
    name:1
    name:2
    name:3
    name:
    name:4
    [['1', 91], ['2', 56], ['3', 88], ['', 67], ['4', 93]]
    b'\x80\x03]q\x00(]q\x01(X\x01\x00\x00\x001q\x02K[e]q\x03(X\x01\x00\x00\x002q\x04K8e]q\x05(X\x01\x00\x00\x003q\x06KXe]q\x07(X\x00\x00\x00\x00q\x08KCe]q\t(X\x01\x00\x00\x004q
    K]ee.'

    (2)逆シーケンス化操作:
    逆シーケンス化方法1:pickle.load()
    フォーマット:pickle.load(file)
    この方法は、シーケンス化されたオブジェクトをファイルfileから読み出すことです.ファイルfileについては、バイナリ形式で操作(読み取り)しなければなりません.
    例は、上記の例と同様に、5人の学生の成績を成績表に書き込むcjbに保存する.txtファイル;プログラムの再実行時にcjbを読み出す.txt中の学生情報は,ロードし,再度データを書き込む場合には,追加の方式で書き込む.
    import random
    import pickle
    
    #    cjb,  cjb=[],    ,        
    try:
        with open('cjb.txt','rb')as f:
            cjb=pickle.load(f)
            print(cjb)
            print("     ")
    except:
        cjb=[]
    #  5           
    for i in range(5):
        name=input("name:")       #  
        cj=random.randint(50,100) #  
        cjb.append([name,cj])
    print(cjb)
    
    #           cjb.txt   
    with open('cjb.txt','wb')as f:
        pickle.dump(cjb,f)
        print("     ")
    
    
        :
    [['1', 73], ['2', 60], ['3', 81], ['4', 87], ['5', 95], ['q', 83], ['w', 91], ['e', 88], ['rt', 85], ['t', 72]]
         
    name:a
    name:b
    name:c
    name:d
    name:e
    [['1', 73], ['2', 60], ['3', 81], ['4', 87], ['5', 95], ['q', 83], ['w', 91], ['e', 88], ['rt', 85], ['t', 72], ['a', 54], ['b', 83], ['c', 70], ['d', 97], ['e', 67]]
         

     
    逆シーケンス化方法2:pickle.loads()
    フォーマット:pickle.loads()
    pickle.loads()メソッドとpickle.load()方法の違い:pickle.loads()メソッドは、ファイルからではなくbytesオブジェクトからシーケンス化された情報を直接読み出すことです.次の例は、情報をファイルに保存するので、ファイルから読み出してpickleとする.loads(f.read()の方式で読み取ります.
    例は、上記の例と同様に、5人の学生の成績を成績表に書き込むcjbに保存する.txtファイル;プログラムの再実行時にcjbを読み出す.txt中の学生情報は,ロードし,再度データを書き込む場合には,追加の方式で書き込む.
    import random
    import pickle
    
    #    cjb,  cjb=[],    ,        
    try:
        with open('cjb.txt','rb')as f:
            cjb=pickle.loads(f.read())
            print(cjb)
            print("     ")
    except:
        cjb=[]
    
    #  5           
    for i in range(5):
        name=input("name:")       #  
        cj=random.randint(50,100) #  
        cjb.append([name,cj])
    print(cjb)
    
    #           cjb.txt   
    with open('cjb.txt','wb')as f:
        f.write(pickle.dumps(cjb))
        print("     ")
    
        :
    [['1', 87], ['2', 59], ['3', 78], ['4', 77], ['5', 75]]
         
    name:a
    name:b
    name:c
    name:d
    name:e
    [['1', 87], ['2', 59], ['3', 78], ['4', 77], ['5', 75], ['a', 55], ['b', 86], ['c', 86], ['d', 61], ['e', 67]]