如何在二进制文件中编写多个对象并将其读取为特定对象?

问题描述 投票:0回答:1

在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

那么,我该怎么办呢?有没有办法为所有对象设置默认大小?

python python-3.x binary
1个回答
0
投票

两种方式。

其一,如果您知道对象的最大大小,则可以将其用作所有对象的固定大小。当您阅读太多时,对象协议应该没有问题检测对象的结尾。

第二种方式是创建一个“索引”。

索引是11个固定长度偏移的集合,存储在文件的开头。

然后,当您添加新对象时,您可以使用它的偏移更新索引。这样你也可以把事情“乱序”(即“第3”项是索引中的第3个插槽,但是数据中的第一个对象)。

显然,在更复杂的情况下,这些都会变得更加微妙。

但是如果你的例子是有限的,那么要么可以做到这一点。

附加物:

一方面,您可以使用空格将名称填充为20个字符,然后稍后将其修剪掉。这使得它们大小相同。

另一方面,它并不重要。您需要随机执行I / O来定位对象。您可以简单地在文件中寻找适当的偏移量并从那里进行写入/读取。泡菜过程将完成剩下的工作。

因此,在这种情况下,您不需要知道对象有多大,只要它们不会太长。

© www.soinside.com 2019 - 2024. All rights reserved.