ValueError:解包需要3个以上的值

时间:2016-10-24 02:34:55

标签: python

我正在努力解决这个问题ValueError,当我想要定义一个init_db函数并重置数据库并从本地文档(hardwarelist.txt)添加一些数据时会发生这种情况,代码是:

def init_db():
    """Initializes the database."""
    db = get_db()
    with app.open_resource('schema.sql', mode='r') as f:
        db.cursor().executescript(f.read())
    with open('hardwarelist.txt') as fl:
        for eachline in fl:
           (model,sn,user,status)=eachline.split(',')
           db.execute('insert into entries (model,sn,user,status) values (?, ?, ?, ?)',
                          (model,sn,user,status))
    fl.close()
    db.commit()

错误是:

File "/home/ziyma/Heroku_pro/flaskr/flaskr/flaskr.py", line 48, in init_db
    (model,sn,user,status)=eachline.split(',')
ValueError: need more than 3 values to unpack

我该怎么办?

1 个答案:

答案 0 :(得分:2)

我的一位导师告诉我“如果一半代码是错误处理,那么你的错误处理就不够了。”但是我们可以利用python的异常处理来简化工作。在这里,我重新设计了您的示例,以便在检测到错误时显示一条消息,并且不会向数据库提交任何内容。

当你遇到坏线时,它会打印出来,你可以从中找出错误。

import sys

def init_db():
    """Initializes the database."""
    db = get_db()
    with app.open_resource('schema.sql', mode='r') as f:
        db.cursor().executescript(f.read())
    with open('hardwarelist.txt') as fl:
        try:
            for index, eachline in enumerate(fl):
               (model,sn,user,status)=eachline.strip().split(',')
               db.execute('insert into entries (model,sn,user,status) values (?, ?, ?, ?)',
                          (model,sn,user,status))
            db.commit()
        except ValueError as e:
            print("Failed parsing {} line {}: {} ({})".format('hardwarelist.txt',
                index, eachline.strip(), e), file=sys.stderr)

            # TODO: Your code should have its own exception class
            # that is raised. Your users would catch that exception
            # with a higher-level summary of what went wrong.
            raise

您应该扩展该异常处理程序以捕获数据库代码中的异常,以便捕获更多错误。

作为旁注,在分割之前,您需要strip该行,以删除\n换行符。

更新

从评论中,这是一个关于分割多个逗号形式的例子。在这种情况下,它的Unicode FULLWIDTH COMMA U + FF0C。是否可以直接在您的python脚本中输入unicode取决于您的文本编辑器等...,但该逗号可以由"\uff0c"","表示。无论如何,可以使用正则表达式来分割多个字符。

我使用unicode转义创建文本

>>> text='a,b,c\uff0cd\n'
>>> print(text)
a,b,c,d

我可以用excapes编写正则表达式

>>> re.split('[,\uff0c]', text.strip())
['a', 'b', 'c', 'd']

或通过复制/粘贴备用逗号字符

>>> re.split('[,,]', text.strip())
['a', 'b', 'c', 'd']