在Python中,我必须开发一个简单的程序来在二进制文件中写入和读取对象。最多将有11条记录将被一对一地插入,装入或删除。就像文件有11个插槽,当插入数据时,插槽索引将被传递。因此,当用户尝试插入已填充的索引时,它将失败,并且用户会收到消息。
所以,我的想法是根据对象的大小保存数据。例如:如果用户在索引3中插入数据,则我不会在文件的开头插入,而是开始在“ 3 *(对象大小)”中插入
但是问题是对象的大小并不总是相同的,因此会丢失对所请求数据的引用。
import pickle
class Reg:
def __init__(self, id, name):
self.id = id
self.name = name
def display(self):
print("{}: {}".format(self.id, self.name))
user = Reg(642213, "{}{}".format("José da Silva", 642213))
print(len(pickle.dumps(user)))
user = Reg(462903, "{}{}".format("Carlos Ribeiro", 462903))
print(len(pickle.dumps(user)))
user = Reg(502453, "{}{}".format("Alberto", 502453))
print(len(pickle.dumps(user)))
user = Reg(189567, "{}{}".format("Rodrigo Peixoto Gama", 189567))
print(len(pickle.dumps(user)))
控制台日志为:81 81 74 87
那么,我该怎么办?有没有办法为所有对象设置默认大小?
答案 0 :(得分:0)
两种方式。
一个,如果您知道对象的最大大小,则可以将其用作所有对象的固定大小。当您阅读过多的内容时,对象协议应该不会检测到对象的结尾。
第二种方法是创建一个“索引”。
索引是11个固定长度偏移量的集合,存储在文件的开头。
然后,当您添加新对象时,就可以使用其偏移量更新索引。这样,您还可以将内容“乱序”放置(即“第3个”项目是索引中的第3个插槽,但是数据中的第一个对象)。
很显然,在更复杂的情况下,它们都变得更加细微。
但是如果您的例子有限,那么任何一个都可以解决问题。
附录:
一方面,您可以将名称填充为20个字符(带空格),然后稍后将其修剪掉。这使它们的大小都相同。
另一方面,这并不重要。您需要执行随机dis I / O来定位对象。您可以简单地在文件中寻找适当的偏移量并从那里进行写入/读取。腌制过程将完成其余的工作。
因此,在那种情况下,您不必知道对象的大小,只要它们不太长即可。