如何阅读pickle文件?

Ken*_*tov 44 python pickle

我创建了一些数据并将其存储了几次,如下所示:

with open('filename', 'a') as f:
        pickle.dump(data, f)
Run Code Online (Sandbox Code Playgroud)

每次文件大小增加,但是当我打开文件时

with open('filename', 'rb') as f:
    x = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)

我只能看到上次的数据.我怎样才能正确读取文件?

jsb*_*eno 59

Pickle一次序列化一个对象,并读回一个对象 - 将腌制的数据按顺序记录在文件中.

如果您只是这样做,pickle.load您应该阅读序列化到文件中的第一个对象(而不是您编写的最后一个对象).

在反序列化第一个对象之后,文件指针位于下一个对象的开始处 - 如果您pickle.load再次调用它,它将读取下一个对象 - 直到文件结束为止.

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


Tay*_*lrl 52

有一个read_pickle函数作为 pandas 0.22+ 的一部分

import pandas as pd

object = pd.read_pickle(r'filepath')
Run Code Online (Sandbox Code Playgroud)

  • `pd.read_pickle` 和 `pickle.load` 之间是否存在性能或兼容性差异? (3认同)

Chr*_*sto 7

我开发了一个软件工具,可以直接在您的浏览器中打开(大多数)Pickle 文件(没有传输任何内容,因此它是 100% 私密的):

https://pickleviewer.com/(以前)

现在托管在这里:https : //fire-6dcaa-273213.web.app/

编辑:如果您想在某处托管它,在此处提供:https : //github.com/ch-hristov/Pickle-viewer

随意在某处托管。


Noc*_*wer 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()
Run Code Online (Sandbox Code Playgroud)