在腌制数据上寻找
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
列表中。
是否可以跳转到 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
列表中。