我正在努力解决这个问题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
我该怎么办?
答案 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']