从文件中读取时,如何从类初始值设定项中删除引号。Python

2024-09-30 02:30:56 发布

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

我将对类任务的调用存储在.dat文件的数组中。我想阅读这个文件并重建类调用。你知道吗

下面是我现在使用的类:

class Task:

    def __init__(self, name, timespent):
        self.name = name
        self.timespent = timespent

    def __repr__(self):
        return repr('Task("%s",%s)'%(self.name, self.timespent))

以下是对文件的读取:

task_list = []
with open("task_list2.dat", "r") as file:
    task_list = eval(file.readline())

以下是写入文件的步骤:

with open("task_list2.dat", "w") as outFile:
    print(repr(task_list), file = outFile)

文件内容如下: ['Task("class",20)'] 其中“class”是任务的名称。你知道吗

我知道这个问题与“Task(“class”,20)”周围的单引号有关,但我不知道如何去掉它们。我收到的错误消息大致是这样的:“str object没有属性'name'”

如何删除这些引号,以便在下次读取文件时重建类?你知道吗


Tags: 文件nameselftaskdefwithopenlist
1条回答
网友
1楼 · 发布于 2024-09-30 02:30:56

You really, really, really don't want to try to use ^{} and ^{} as a serialization format.

如果你只是使用,比如说,^{},你就不会有这个问题了:

with open("task_list2.dat", "wb") as outFile:
    pickle.dump(task_list, outFile)

with open("task_list2.dat", "rb") as file:
    task_list = pickle.load(file)

简单多了,是吗?你知道吗


但是如果你想知道如何解决眼前的问题,而不是让它变得无关紧要:你的__repr__方法中有多个问题,如果你想让它是圆形的,所有这些问题都需要解决。你知道吗

  • 生成一个字符串表示…然后对其调用repr。您希望返回字符串表示,而不是字符串表示的字符串表示。只需省略repr。你知道吗
  • 您应该始终委托给子对象的repr,而不是str。如果您使用的是%-格式,那就意味着使用%r而不是%s。你知道吗
  • 不要在事物周围加引号。如果不可见的对象本身有反斜杠,那么它为什么会有反斜杠呢?如果你认为你需要引号,这几乎总是一个迹象,表明你打破了以前的规则,你应该改为修复。你知道吗

下面是如何为这个类编写一个可折叠的圆形repr:

def __repr__(self):
    return 'Task(%r, %r)' % (self.name, self.timespent))

您可以验证它是否符合您的要求:

>>> t = Task('task name', 23.4)
>>> t
Task('task name', 23.4)
>>> eval(repr(t))
Task('task name', 23.4)

当然,在您的特定示例中,只要解决第一个问题(删除对repr的虚假调用)就可以去掉单引号,并使特定示例正常工作。您也可以在读取端通过调用eval两次来解决这个问题。或者,对于这个特定的示例,甚至通过调用eval(s[1:-1])eval(s.strip("'"))。但是任何像这样的“修复”只会使调试一般问题变得更加困难,一旦你有了这些问题,你就会遇到这些问题,例如,一个名字并不像一个单一的ASCII字母单词那么简单。你知道吗

相关问题 更多 >

    热门问题