在腌制数据上寻找

Seek on Pickled Data

是否可以跳转到 Python 中的 pickled 文件中的特定记录?

例如:

import pickle

with open ('BinaryFile.dat', mode='wb') as MyFile:
    pickle.dump('Item1', MyFile)
    pickle.dump('Item2', MyFile)
    pickle.dump('Item3', MyFile)
    pickle.dump('Item4', MyFile)
    pickle.dump('Item5', MyFile)

with open('BinaryFile.dat', mode='rb') as MyReadFile:
    MyReadFile.seek(3)
    print(pickle.load(MyReadFile))

给出 _pickle.UnpicklingError: invalid load key, '\x05'.

seek 是否对选取的数据有效?我需要多次调用 pickle.load(MyReadFile) 吗?

Pickle 记录可以连接到一个文件中,所以是的,您可以 pickle.load(f) 多次,但文件本身的索引方式无法让您查找给定记录。

你的 f.seek(3) 正在做的是寻找文件中的第三个 字节 ,它位于 pickle 记录的中间,因此是不可 picklable 的。

如果您需要随机访问,您可能需要查看 built-in shelve module,它使用数据库文件模块在 pickle 之上构建了一个类似字典的界面。

(另一种简单的方法是简单地拥有一个装满 pickle 文件的目录。)

您可以通过在调用 pickle.dump() 之前使用文件 tell() 方法显式保存每个项目的起始位置并稍后使用该信息在 [=13= 之前重新定位文件流来实现这一点].

我的意思是:

import pickle

indices = []

with open ('BinaryFile.dat', mode='wb') as MyFile:
    indices.append(MyFile.tell())
    pickle.dump('Item1', MyFile)
    indices.append(MyFile.tell())
    pickle.dump('Item2', MyFile)
    indices.append(MyFile.tell())
    pickle.dump('Item3', MyFile)
    indices.append(MyFile.tell())
    pickle.dump('Item4', MyFile)
    indices.append(MyFile.tell())
    pickle.dump('Item5', MyFile)

with open('BinaryFile.dat', mode='rb') as MyReadFile:
    MyReadFile.seek(indices[3])
    print(pickle.load(MyReadFile))  # -> Item4

当然,要真正发挥作用,您还需要将位置数据保存到 indices 列表中。