ピクルスファイルの読み方は?


91

私はいくつかのデータを作成し、次のように数回保存しました。

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

ファイルのサイズが大きくなるたびに、ファイルを開くとき

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

前回のデータしか見えません。どうすればファイルを正しく読み取ることができますか?


1
ファイルにオブジェクトを追加しています。ピックを解除すると、最初のエントリのみがピック解除されます。これらすべてのエントリが必要ですか?そうでない場合-に変更open('filename', 'wb')
アンドレイ

はい、すべてのエントリが必要です。ファイルのサイズは、ファイルにすべてが含まれていることを示しています。
Kenenbek Arzymatov 2016年

1
それなら@jsbuenoは彼の答えに正しいです。
アンドレイ


ピクルスファイルをブラウザで直接表示するための何かを作成しました:pickleviewer.com
Christo

回答:


98

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

単純に行うpickle.load場合は、ファイルにシリアル化された最初のオブジェクトを読み取る必要があります(作成した最後のオブジェクトではありません)。

最初のオブジェクトのシリアル化を解除した後、ファイルポインタは次のオブジェクトの先頭にあります-単にpickle.loadもう一度呼び出すと、次のオブジェクトが読み取られます-ファイルの終わりまでそれを行います。

objects = []
with (open("myfile", "rb")) as openfile:
    while True:
        try:
            objects.append(pickle.load(openfile))
        except EOFError:
            break

27

pandas0.22 +の一部としてread_pickle関数があります

import pandas as pd

object = pd.read_pickle(r'filepath')

6

以下は、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()


-27

あなたはそれで何もしていません、あなたはファイルをロードしているだけです。

for line in x:
    print x

各行を印刷します。(ステートメントの2番目に)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.