Python对象正在写入不可读取的数据

2024-06-23 20:03:31 发布

您现在位置:Python中文网/ 问答频道 /正文

Python是我学习的第一种语言,目前我正在研究用于存储简单数据的文件输入/输出系统。我做了一个关于简单写作和酸洗的练习。出于我的目的,我想使用简单的写作,因为我想编辑我的“保存文件”。在

当数据是字符串时,我成功地存储和检索数据。问题是,当我存储对象时,它将其存储为不可读的格式:

<__main__.Character object at 0x0078FE10>

我怎样才能把上面这个不可读的格式返回到我的对象中呢?Python是否有一个内置函数可以实现这一点?在

或者,在写入数据文件之前,我是否必须将对象转换为包含所有重要变量的字符串?在

编辑:哦,忘了代码!

^{pr2}$

这是I/O系统的读取部分。您可以看到它读取数据>;将字符串转换为列表>;拆分列表中的参数>;使用参数创建对象。在

with open('charData', 'r') as data:
    data = data.read()  # Read the contents of the file into memory.
    print (data)

    my_list = data.splitlines()
    print (my_list[0])  # Print the list.
    char_data = ast.literal_eval(my_list[0])

new_character = Character(*char_data)

然后我有自己的函数来显示对象统计信息:

new_character.stats()

吐出

Harley is level 3
with 10 health

正如你所见,它很好用。但如果我用新建文件.write(new_character)”它本质上是对象的字符串,从上面看是“<;main.character object at 0x0215FE10>;”。在

在过去的一个小时里,我一直在这个对象中使用str,但还没有找到一种方法来使用该函数来找到解决方案,并从更有经验的人那里寻求指导。在

编辑Matt Habel:

def __str__(self):
    print ("[\"", end="")
    print (self.name, end="")
    print ("\"", end=", ")
    print (self.exp, end="")
    print (",", end=" ")
    print (self.atk, end="")
    print ("]")

这将输出:

["Harley", 300, 3]
    print(new_character)
TypeError: __str__ returned non-string (type NoneType)

我制作自己的“list”的理由是,我可以使用“AST”模块来定义list参数。我稍后会将上面的列表转换为“new_character2”,并使用以下方法编写:

newFile = open("charData","w")
newFile.write(new_character2)

立即使用:

我使用return函数,而不是上面复杂的解析。在

    def export(self):
        self.name = str(self.name)
        self.exp = str(self.exp)
        self.atk = str(self.atk)
        matt_data = "[\"%s\", %s, %s]" % (self.name, self.exp, self.atk)
        return matt_data

matt_export = new_character.export()
print(matt_export)

吐出:

["Harley", 600, 3]

而且没有错误代码!在


Tags: 对象函数字符串namegtselfnewdata
2条回答

要保存对象,必须对其进行序列化。根据您使用的是python2.7.x还是3.x,您有不同的特定选项,但下面是pickle docs的版本,它将对2.7.x有所帮助。在

这种格式是python提供给对象的默认字符串表示。您可以通过在一个类的实例上调用^{}来检查这一点。如果需要对象的可读字符串,可以在类上提供自定义的__str__(self)方法。这将更改输出到文件的对象字符串表示形式。在

至于你的实际问题是如何将默认表示转换回你的对象之一:这是不可能的。这是因为默认表示只告诉你对象的名称和它当前存储的内存位置。因为内存是暂时的(在运行它的不同时间对程序是不可用的),所以不能将内存地址转换回对象之一。在

如果你想这样做,有几种方法可以做到:

  1. 您可以提供一个人类可读的__str__方法。这将输出您可以读取的数据,并希望它可以很容易地解析回一个对象。您必须从文件中读取对象的字符串表示,提取创建新对象所需的数据,然后创建对象。在
  2. 您可以研究序列化方法。这将以便于计算机读写的形式输出对象,但您可能无法读取它。有很多序列化库,但是python提供了^{}库来实现这一点。在
  3. 您可以查看一些人类可读的数据格式,如jsonyamletc。使用其中的一个将为您提供一个可读的文件和一些处理这些文件的很棒的库。在

相关问题 更多 >

    热门问题