能否用Python跳转到腌制文件中的特定记录?
例如:
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'.
是否甚至在挑选的数据上工作?我是否需要多次致电pickle.load(MyReadFile)
?
答案 0 :(得分:1)
可以将修补程序记录连接到一个文件中,因此,可以多次pickle.load(f)
,但是文件本身并未以允许您查找给定记录的方式进行索引。
您的f.seek(3)
正在做的事情是查找文件中的第三个 byte ,该字节位于泡菜记录的中间,因此无法提取。
如果需要随机访问,则可能需要研究built-in shelve
module,它使用数据库文件模块在pickle
的顶部构建了类似字典的界面。
(另一种简单的方法是简单地使目录充满泡菜文件。)
答案 1 :(得分:0)
您可以通过在调用tell()
之前使用文件pickle.dump()
显式保存每个项目的起始位置,然后稍后使用该信息在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
当然,要使其真正有用,您还需要将位置数据保存在indices
列表中。