在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
那么,我该怎么办呢?有没有办法为所有对象设置默认大小?
两种方式。
其一,如果您知道对象的最大大小,则可以将其用作所有对象的固定大小。当您阅读太多时,对象协议应该没有问题检测对象的结尾。
第二种方式是创建一个“索引”。
索引是11个固定长度偏移的集合,存储在文件的开头。
然后,当您添加新对象时,您可以使用它的偏移更新索引。这样你也可以把事情“乱序”(即“第3”项是索引中的第3个插槽,但是数据中的第一个对象)。
显然,在更复杂的情况下,这些都会变得更加微妙。
但是如果你的例子是有限的,那么要么可以做到这一点。
附加物:
一方面,您可以使用空格将名称填充为20个字符,然后稍后将其修剪掉。这使得它们大小相同。
另一方面,它并不重要。您需要随机执行I / O来定位对象。您可以简单地在文件中寻找适当的偏移量并从那里进行写入/读取。泡菜过程将完成剩下的工作。
因此,在这种情况下,您不需要知道对象有多大,只要它们不会太长。