我有一个包含 13 个列表的压缩列表。我想将这些项目插入到 mysql 数据库中。这是我的代码:
zipped_list=zip(list1,list2...list13)
for a,b,c,d,e,f,g,h,i,j,k,l,m in zipped_list:
cur.execute("INSERT INTO QB_global_sentiment(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) VALUES('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')" %("date","US_pos","US_neg","US_neu","UK_pos","UK_neg","UK_neu","CA_pos","CA_neg","CA_neu","AU_pos","AU_neg","AU_neu",str(m), str(a),str(b),str(c),str(d),str(e),str(f),str(g),str(h),str(i),str(j),str(k),str(l)))
这是我的错误:
for a,b,c,d,e,f,g,h,i,j,k,l,m in zipped_list:
ValueError: too many values to unpack
我同意有太多的项目,而且真的很长。.有没有更好的方法可以做到这一点?
谢谢!
听起来你有一个包含 13 个列表的列表,并且想要并行迭代。为此,您可以使用 zip()
,如下面的简单示例所示:
In [8]: l = [[1, 2, 3], [4, 5, 6]]
In [9]: for a, b in zip(*l):
...: print a, b
...:
1 4
2 5
3 6
我同意有太多的项目,而且真的很长。
该消息并不意味着"太多",即"超过x个数字是一个坏主意"。 这意味着"太多",因为压缩元素的数量与变量的数量不匹配。
FWIW,你不需要解压缩成单独的变量(execute() 方法将接受元组或列表),也不需要有一个 for 循环(executemany() 方法将为你做到这一点)。 此外,execute() 方法将进行替换,具有以下几个好处:帮助避免 sQL 注入攻击、提高速度和提高清晰度。
尝试以下操作:
cur.executemany('''INSERT INTO QB_global_sentiment(date, US_pos, US_neg, US_neu, UK_pos, UK_neg, UK_neu, CA_pos, CA_neg, CA_neu, AU_pos, AU_neg , AU_neu)
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', combined_data)
建议
-
如果值将在运行时更改,则可能需要对它们进行硬编码,而不是填充它们。
最好 解决迭代中返回的项中的项数问题。
如果我是你,我会像这样做
for row in zipped_list:
print ("...{} {} {} {}".format(*row[:4])
这会从zipped_list
中获取列表/元组,并且仅使用要实际填充的列数。
例:
data = [[1, 2, 3], [4, 5, 6]]
for a in data:
print("{} {}".format(*a[:2]))
输出
1 2
4 5