深さ学習pythonデータ構造(一)-シーケンス読み出しpickleとcPickle


pickleとcPickle;両者の関係:「cPickle–A faster pickle」
 
import cPickle as pickle
常用関数:pickle.dump(data,handle,0 or 1 or 2)
1つのファイルハンドルと1つのデータオブジェクトをパラメータとして受け入れる[シーケンス化]0:txt,1,2:古い新しいバイナリ
                    pickle.load(handle)[逆シーケンス化]
     
【まずf=open(,“wb”)ファイルハンドルを開き、データを自分の望むフォーマットで整理して読み込む】
 
    def get_all_pics(self,
                     imagepath="/home/lmzwhu/programs/DATAS/HWDB/train/",
                     dict_file="/home/lmzwhu/programs/DATAS/HWDB/train_im_addr_dict"):
       
        '''
                      ( )ID           
        {0:[filepath1, filepath2, ...], 1:[...], ...}
        '''
        #         ,     ,   
        if os.path.exists(dict_file):
            with open(dict_file, "rb") as f:
                return pickle.load(f)
        
        #          ,       
        codes = os.listdir(imagepath)
        im_addr = {}
        for code in codes:
            path = os.path.join(imagepath, code)
            if not os.path.isdir(path):
                continue
            addresses = glob(os.path.join(path, "*.png"))
            im_addr[int(code)] = addresses

        #             
        with open(dict_file, "wb") as f:
            pickle.dump(im_addr, f)

        return im_addr
    

 
一、dump:pythonオブジェクトをローカルのファイルにシーケンス化して保存します.【永久保存】例えば、ネット上から這い降りたデータを、ローカルに保存する
>>> import cPickle
>>> data = range(1000)
>>> cPickle.dump(data,open("test\\data.pkl","wb")) 

dump関数には2つのパラメータを指定する必要があります.1つ目はシーケンス化が必要なpythonオブジェクト名、2つ目はローカルのファイルです.ここでopen関数を使用してファイルを開き、「書く」操作を指定する必要があります.
二、load:ローカルファイルをロードし、pythonオブジェクトを復元する
>>> data = cPickle.load(open("test\\data.pkl","rb"))

dumpと同様にopen関数を使用してローカルのファイルを開き、「読み取り」操作を指定する必要があります.
三、dumps:pythonオブジェクトのシーケンス化を文字列変数に保存する【一時保存】
>>> data_string = cPickle.dumps(data)

四、loads:文字列変数からpythonオブジェクトを読み込む
>>> data = cPickle.loads(data_string)

例:
# -*- coding: utf-8 -*- 
import pickle
#      :
# import cPickle as pickle 
obj = {"a": 1, "b": 2, "c": 3} 
#   obj          tmp.txt  
pickle.dump(obj, open("tmp.txt", "w")) 
# do something else ... 
#   tmp.txt        obj   
obj2 = pickle.load(open("tmp.txt", "r")) 
print obj2

例:ニューラルネットワークにおけるモデルパラメータの保存
if best_accuracy

 
import pickle

b=7
i=13000000
fa=99.056
s='     123abc'

f=open('sample_pickle.dat','wb')    #           
try:
    pickle.dump(b,f)    #    
    pickle.dump(i,f)    #    
    pickle.dump(fa,f)    #     
except:
    print('     ')
finally:
    f.close()

'''
  pickle    'sample_pickle.dat'       
'''
f=open('sample_pickle.dat','rb')
n=pickle.load(f)    #         
for i in range(n):
    x=pickle.load(f)
    print(x)
f.close()

'''  
13000000
99.056
     123abc

'''

テキストファイルをバイナリファイルに変換
'''
             
'''
with open('test.txt')as src,open('test_pickle.dat','wb')as dest:
    lines=src.readline()
    pickle.dump(len(lines),dest)
    for line in lines:
        pickle.dump(line,dest)
with open('test_pickle.dat','rb')as fp:
    n=pickle.load(fp)
    for i in range(n):
        print(pickle.load(fp))