字符串表示错误

时间:2016-02-11 19:03:20

标签: python python-3.x

我是非常非常新的Python,我想我可以做一个简单的应用来为我解析xml格式。问题是,几乎看起来我从element.getElementsByTagName()方法中获取了无效元素。我将在下面附上所有相关的源代码。

尝试格式化从XML捕获的数据时出现问题;错误代码如下:

Traceback (most recent call last):
        File "C:/development/xml2dnf/main.py", line 8, in <module> output_file.write(str(result))
        File "C:\development\xml2dnf\Shotsheet.py", line 18, in __str__ reply += str(shot) + "\n"
        File "C:\development\xml2dnf\StaticShot.py", line 19, in __str__ self.rect[2], self.rect[3])
ValueError: unexpected '{' in field name

我试图弄清楚报告的有问题的行,直到我发现错误可能不存在。当我进入我的层次结构时,我注意到如果我告诉我的一个类解析我发送给它的特定列表,它几乎按预期工作。当我不解析前述时,错误就会神奇地消失。

认为我的两类课程都是问题所在,我去找他们,尽我所能找到一个可以减轻流浪的'{'。我没有发现任何问题。

我尝试进行故障排除,直到xml本身。我打印出来看起来没问题。但是,当我打印出我应该得到的结果时,我注意到它打印了一些奇怪的,无效的值,然后打印出错误不存在时应该得到的结果。

我做了一些谷歌搜索,但我在这个问题上找不到什么。无论我能找到什么,或者没有缓解我的问题或无关紧要。考虑到我是这门语言的新手,我已经用尽了我的故障排除方法。

更新:

在搞乱XML之后,我注意到无效元素是我不理解getElementsById如何工作的结果。该方法返回带有ID的所有元素,而不仅仅是元素的直接子元素。调整实施解决了这个问题。

现在我已经解决了这个问题,我仍然遇到了上述错误。我唯一能想到的是我的课程的__str__实现是错误的,但我仍然没有看到如何。单独打印每个参数会产生预期的结果,但使用__str__会失败并且错误会让我无法以任何方式进行操作。

为了便于说明,这里是解释器说错误的代码:

def __str__(self):
        reply = "ShotData\x7Bid = {0} rect = ({1}, {2}, {3}, {4}) ".format(self.index, self.rect[0], self.rect[1],
                                                                           self.rect[2], self.rect[3])
        if self.render != 'ALPHA':
            reply += "render = {0} ".format(self.render)

        if self.collision >= 0:
            reply += "collision = {0} ".format(self.collision)

        if self.fixed_angle:
            reply += "fixed_angle = true angular_velocity = {0}\x7D".format(self.angular_velocity)

        delay_string = str(self.delay_color)
        reply += "delay_color = {0} ".format(delay_string)

        return reply

调用它的代码:

def __str__(self):
        reply = "#UserShotData\n\nshot_image = {0}\ndelay_rect=({1}, {2}, {3}, {4})\n\n"

        for shot in self.shot_array:
            reply += str(shot) + "\n"

        delay_x1 = self.delay_rect[0]
        delay_y1 = self.delay_rect[1]
        delay_x2 = self.delay_rect[2]
        delay_y2 = self.delay_rect[3]

        return reply.format(self.shot_image, delay_x1, delay_y1, delay_x2, delay_y2)

请求字符串表示的指令:

output_file.write(str(result))

与往常一样,我们将非常感谢您对此问题的任何帮助。

2 个答案:

答案 0 :(得分:2)

问题在于写ShotData\x7Bid与编写ShotData{Bid完全相同,使用转义序列并不会导致.format对大括号进行处理。如果你想逃避大括号,你需要加倍:

reply = "ShotData{{id = {0} rect = ({1}, {2}, {3}, {4}) ".format(self.index, self.rect[0], self.rect[1], self.rect[2], self.rect[3])

答案 1 :(得分:0)

答案在于格式行。 \x7B字符打破了它。如果你想在格式化的字符串中插入花括号,我建议你以后再做:

 reply = "{0} rect = ({1}, {2}, {3}, {4})   ".format(self.index, self.rect[0], self.rect[1], self.rect[2],self.rect[3])
 reply = "ShotData{Bid = " + reply