美文网首页Python异常集
ValueError: too many values to u

ValueError: too many values to u

作者: 大猫黄 | 来源:发表于2016-01-13 16:20 被阅读1277次

    sketch.txt为两个人的对话内容。文本格式为

    角色:台词

    以下源码的功能是分解sketch.txt的每一行,将角色和台词根据冒号分解成两部分,形成

    角色 said : 台词

    的格式重新输出。

    data = open("sketch.txt")

    for each_line in data:

                role, content = each_line.split(":")

                print "%s said: %s" % (role, content)

    data.close()

    执行程序时,出现以下异常:

    Man said:  You didn't!

    Other Man said:  I'm telling you, I did!

    Man said:  You did not!

    Other Man said:  Oh I'm sorry, is this a five minute argument, or the full halfhour?

    Man said:  Ah! (taking out his wallet and paying) Just the five minutes.

    Other Man said:  Just the five minutes. Thank you.

    Other Man said:  Anyway, I did.

    Man said:  You most certainly did not!

    Traceback (most recent call last):  File "file.py", line 21, inrole, line_spoken = each_line.split(":")

    ValueError: too many values to unpack

    从以上输出可以看到,程序在分解到“Man said:  You most certainly did not!”的下一行时出现ValueError异常。

    所以自然想到这一行的下一行是什么呢?

    打开sketch.txt,可以发现是下面这一行:

    Other Man: Now let's get one thing quite clear: I most definitely told you!

    仔细观察,这一行有两个冒号,这样的话split(":")会将这一行分解成三部分,但代码中并没有处理这第三部分的代码,所以ValueError提示值过多。

    发现了问题那就好解决了,只需为split函数设置一个分割次数的参数就可以了。

    role, content = each_line.split(":", 1)

    看执行结果:

    依然有个ValueError异常,但仔细观察,这已经不是上面那个ValueError,而是一个新的异常

    Other Man said:  Oh yes I did!

    Man said:  Oh look, this isn't an argument!

    Traceback (most recent call last):  File "file.py", line 24, inrole, line_spoken = each_line.split(":", 1)

    ValueError: need more than 1 value to unpack

    再次打开sketch.txt文档,查看“Man said:  Oh look, this isn't an argument!”的下一行:

    (pause)

    这一行没有一个冒号,所以split()会出现异常。

    发现问题解决问题,跳过这种提示行

    修改代码:

    data = open("sketch.txt")

    for each_line in data:

        if each_line.find(":") < 0:

            print each_line

            continue

        else:

            role, line_spoken = each_line.split(":", 1)

            print "%s said: %s" % (role,line_spoken)

    data.close()

    find()函数找不到冒号,返回-1,所以代码会跳出本次循环,执行下一次循环。

    这样处理后,程序执行时不再异常。

    (也许有更好异常的处理方式)

    相关文章

      网友评论

        本文标题:ValueError: too many values to u

        本文链接:https://www.haomeiwen.com/subject/xveckttx.html