2016-01-28 10 views
12

は、私はこのようないくつかのデータと保存され、それを複数回作成:ピクルファイルの読み方は?

with open('filename', 'a') as f: 
     pickle.dump(data, f) 

ファイルのサイズが増加するたびに、私は、ファイル

with open('filename', 'rb') as f: 
    x = pickle.load(f) 

を開いたとき、私は最後の時間からのデータのみを見ます。 ファイルを正しく読み取るにはどうすればよいですか?

+1

ファイルにオブジェクトを追加しています。あなたがペリカンをしていないときは、最初の入力のみをキャンセルします。これらのエントリがすべて必要なのですか?そうでない場合、 'open( 'filename'、 'wb') 'に変更してください。 – Andrey

+0

はい、すべてのエントリが必要です。ファイルのサイズには、すべてのファイルが含まれていることが示されています。 –

+1

それから@jsbuenoは彼の答えに間違いありません。 – Andrey

答えて

21

Pickleは一度に1つのオブジェクトをシリアル化し、単一のオブジェクトを読み戻します。 ピクルされたデータはファイルに順番に記録されます。

pickle.loadを単に実行すると、ファイルにシリアル化された最初のオブジェクトを読み込む必要があります(書いた最後のオブジェクトではありません)。

最初のオブジェクトのシリアル番号を解除した後、ファイルポインタは次のオブジェクトの になります。pickle.loadを再度呼び出すだけで、次のオブジェクトが読み込まれます。

-5

ファイルをロードするだけで何もしないでください。

for line in x: 
    print x 

各行が印刷されます。 (2番目の文で)

2

次に、ピクルスファイルの書き込みおよび読み取りの例を示します。 pickleデータをファイルに追加し続ける場合は、ファイルの終わりに達するまで、またはファイルの終わりに達するまで例外が生成されるまで、ファイルから読み込みを続ける必要があります。それが最後の機能です。

import os 
import pickle 


PICKLE_FILE = 'pickle.dat' 


def main(): 
    # append data to the pickle file 
    add_to_pickle(PICKLE_FILE, 123) 
    add_to_pickle(PICKLE_FILE, 'Hello') 
    add_to_pickle(PICKLE_FILE, None) 
    add_to_pickle(PICKLE_FILE, b'World') 
    add_to_pickle(PICKLE_FILE, 456.789) 
    # load & show all stored objects 
    for item in read_from_pickle(PICKLE_FILE): 
     print(repr(item)) 
    os.remove(PICKLE_FILE) 


def add_to_pickle(path, item): 
    with open(path, 'ab') as file: 
     pickle.dump(item, file, pickle.HIGHEST_PROTOCOL) 


def read_from_pickle(path): 
    with open(path, 'rb') as file: 
     try: 
      while True: 
       yield pickle.load(file) 
     except EOFError: 
      pass 


if __name__ == '__main__': 
    main() 
関連する問題