寻求腌制数据

时间:2019-04-23 11:15:21

标签: python pickle seek

能否用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)

2 个答案:

答案 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列表中。