Python 基于pickle数据的Seek

Python 基于pickle数据的Seek,python,pickle,seek,Python,Pickle,Seek,可以用Python跳转到pickle文件中的特定记录吗 例如: 导入pickle 以open('BinaryFile.dat',mode='wb')作为MyFile: pickle.dump('Item1',MyFile) pickle.dump('Item2',MyFile) pickle.dump('Item3',MyFile) pickle.dump('Item4',MyFile) pickle.dump('Item5',MyFile) 打开('BinaryFile.dat',mode='

可以用Python跳转到pickle文件中的特定记录吗

例如:

导入pickle
以open('BinaryFile.dat',mode='wb')作为MyFile:
pickle.dump('Item1',MyFile)
pickle.dump('Item2',MyFile)
pickle.dump('Item3',MyFile)
pickle.dump('Item4',MyFile)
pickle.dump('Item5',MyFile)
打开('BinaryFile.dat',mode='rb')作为MyReadFile时:
MyReadFile.seek(3)
打印(pickle.load(MyReadFile))
给出
\u pickle.UnpicklingError:无效的加载键“\x05”。


seek甚至可以处理精选的数据吗?我需要多次调用pickle.load(MyReadFile)吗?

pickle记录可以连接到一个文件中,因此,是的,您可以多次调用
pickle.load(f)
,但文件本身的索引方式不允许您搜索给定的记录

你的<代码> F.S寻(3)所做的是查找文件中的第三个字节,该文件位于一个泡菜记录的中间,因此不能被清除。

如果您需要随机访问,您可能希望查看使用数据库文件模块在
pickle
之上构建字典式界面的


(另一个简单的方法是,只需拥有一个满是pickle文件的目录。)

您可以这样做:在调用
pickle.dump()
之前,使用file
tell()
方法显式保存每个项目的起始位置,然后使用该信息在
pickle.load()
之前重新定位文件流

我的意思是:

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

当然,要使其真正有用,还需要将位置数据保存到
索引
列表中。

如果要在文件中向后移动,该怎么办?有没有办法
pickle.unload(f)
?没有,但是您可以使用
f.tell()
来确定每次
之后您在文件中的位置。load()
,跟踪它们,然后
f.seek()
返回到您想要的位置。谢谢。所以我可以使用seek,但前提是它指向记录的开始?