我们如何从泡菜文件中获取注释,这将告诉我们泡菜文件中存储的对象数量及其详细信息?



有人在Pickle文件中存储了多个对象。现在我想解开该文件,但我如何知道 Pickle 文件中存储了多少个对象?他们是否有任何注释或其他东西,我们可以从中获取有关 Pickle 文件的信息?

Pickle 不存储该信息,并且无论如何都不支持在 pickle 中一次存储多个顶级对象。所以简单的答案是:它总是一个对象。请注意,对象可以简单嵌套,因此您可以存储对象列表。这仍然是一个单一的顶级列表。

如果需要向文件添加多个泡菜,则必须创建自己的元数据,并存储除泡菜数据之外

的元数据。

例如,您可以将对象数和每个单独酸洗的对象存储为固定长度的数字:

import pickle
import struct
with open(some_filename, 'wb') as output:
    output.write(struct.pack('I', len(sequence_of_objects)))
    for obj in sequence_of_objects:
        pickled = pickle.dumps(obj)
        output.write(struct.pack('I', len(pickled)))
        output.write(pickled)

上面使用4字节无符号整数来记录有多少对象以及pickle长度;如果您的对象数量或大小可以那么大,请根据需要进行调整。

然后可以使用生成器函数再次读取上述内容:

import pickle
import struct
def read_objects(filename):
    with open(filename, 'rb') as inf:
        count, = struct.unpack('I', inf.read(4))
        logger.info("Reading up to %d objects from %s", count, filename)
        while True:
            length_bytes = inf.read(4)
            if not length_bytes:
                return
            length, = struct.unpack('I', length_bytes)
            yield pickle.loads(inf.read(length))

相关内容

最新更新