如何读取泡菜文件?


85

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

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

是的,我需要所有条目。文件的大小表明它包含了所有文件。
Kenenbek Arzymatov '16

1
然后@jsbueno是正确的答案。
安德烈


我构建了一些东西来直接在您的浏览器中查看泡菜文件:pickleviewer.com
Christo S.

Answers:


91

Pickle一次序列化一个对象,然后读回一个对象-腌制的数据按顺序记录在文件上。

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

对第一个对象进行反序列化后,文件指针位于下一个对象的开头-如果您pickle.load再次调用,它将读取下一个对象-这样做直到文件结束。

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

21

作为熊猫的一部分,有一个read_pickle函数0.22+

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()


-25

您没有对其执行任何操作,仅加载了文件。

for line in x:
    print x

将打印每一行。(在第二个声明中)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.