Python到SQL:列表的列表
我现在遇到了一个问题,想把一个包含列表的列表导出到MySQL数据库里。
我正在使用MySQLdb这个库,并且使用了executemany这个命令。
举个例子,我有一个列表的列表:
k1=[[['Bob', 'Alfred', 'Jen'],
['123 Elm Street', '55 Ninth Ave', '1 Paved Rd'],
[00123, 34565, 30094],
['Newark', 'Salinas', 'Los Angeles'],
['NJ', 'CA', 'CA']],[['Bob1', 'Alfred1', 'Jen1'],
['123 Elm Street1', '55 Ninth Ave1', '1 Paved Rd1'],
[001231, 345651, 300941],
['Newark1', 'Salinas1', 'Los Angeles1'],
['NJ1', 'CA1', 'CA1']]]
然后我尝试(在初始化游标和数据库之后):
cursor.executemany('''INSERT INTO addresses
(name, street, zipcode, city, state)
VALUES
(%s, %s, %s, %s, %s)''',zip(k1))
但是我遇到了一个错误:
_mysql_exceptions.ProgrammingError: not enough arguments for format string
基本上,我想把列表k1中的名字、街道、邮政编码、城市和州导入到MySQL数据库的“addresses”表中,并且对应好每个字段。
如果有人能给我指个方向,我会非常感激。
4 个回答
1
我想你是想把k1里面的每个列表(每个列表里面又有几个小列表)传给zip,像这样:
>>> [zip(*x) for x in k1]
[[('Bob', '123 Elm Street', 83, 'Newark', 'NJ'), ('Alfred', '55 Ninth Ave', 34565, 'Salinas', 'CA'), ('Jen', '1 Paved Rd', 30094, 'Los Angeles', 'CA')], [('Bob1', '123 Elm Street1', 665, 'Newark1
', 'NJ1'), ('Alfred1', '55 Ninth Ave1', 345651, 'Salinas1', 'CA1'), ('Jen1', '1 Paved Rd1', 300941, 'Los Angeles1', 'CA1')]]
>>>
另外要注意,你的邮政编码应该用字符串表示,而不是数字,这样才能保留前面的零,避免被误解成你不想要的格式(你看里面的'83'邮政编码吗?其实它是00123,我记得是这样的)。
3
我觉得这其实不是一个SQL的问题;我们先把数据整理成正确的格式,再考虑怎么用executemany()来处理。
你的k1例子是一个包含两个列表的列表,每个内部列表又是一个包含地址组成部分的列表。所以你实际上有一个列表的列表的列表。我不太明白最外层的列表有什么用,但里面的层次似乎可以用zip来处理。
如果忽略最外层,我觉得你想要的是:
zip(*k1[0])
这样可以得到k1中第一个元素看起来合理的结果。再说一次,我不太清楚你为什么在k1[0]和k1[1]中重复相同的数据,所以我也不想猜测你接下来会怎么处理k1中的其他元素。
在你担心如何将这些与SQL数据库结合之前,先在Python解释器中试着玩玩这些代码:
>>> k1=[[['Bob', 'Alfred', 'Jen'],['123 Elm Street', '55 Ninth Ave', '1 Paved Rd'],[00123, 34565, 30094],['Newark', 'Salinas', 'Los Angeles'],['NJ', 'CA', 'CA']],[['Bob1', 'Alfred1', 'Jen1'],['123 Elm Street1', '55 Ninth Ave1', '1 Paved Rd1'],[001231, 345651, 300941],['Newark1', 'Salinas1', 'Los Angeles1'],['NJ1', 'CA1', 'CA1']]]
>>> zip(k1)
[([['Bob', 'Alfred', 'Jen'], ['123 Elm Street', '55 Ninth Ave', '1 Paved Rd'], [83, 34565, 30094], ['Newark', 'Salinas', 'Los Angeles'], ['NJ', 'CA', 'CA']],), ([['Bob1', 'Alfred1', 'Jen1'], ['123 Elm Street1', '55 Ninth Ave1', '1 Paved Rd1'], [665, 345651, 300941], ['Newark1', 'Salinas1', 'Los Angeles1'], ['NJ1', 'CA1', 'CA1']],)]
>>> k1[0]
[['Bob', 'Alfred', 'Jen'], ['123 Elm Street', '55 Ninth Ave', '1 Paved Rd'], [83, 34565, 30094], ['Newark', 'Salinas', 'Los Angeles'], ['NJ', 'CA', 'CA']]
>>> k = k1[0]
>>> zip(k)
[(['Bob', 'Alfred', 'Jen'],), (['123 Elm Street', '55 Ninth Ave', '1 Paved Rd'],), ([83, 34565, 30094],), (['Newark', 'Salinas', 'Los Angeles'],), (['NJ', 'CA', 'CA'],)]
>>> zip(k[0], k[1])
[('Bob', '123 Elm Street'), ('Alfred', '55 Ninth Ave'), ('Jen', '1 Paved Rd')]
>>> zip(k[0], k[1], k[2], k[3], k[4])
[('Bob', '123 Elm Street', 83, 'Newark', 'NJ'), ('Alfred', '55 Ninth Ave', 34565, 'Salinas', 'CA'), ('Jen', '1 Paved Rd', 30094, 'Los Angeles', 'CA')]
>>> zip(*k)
[('Bob', '123 Elm Street', 83, 'Newark', 'NJ'), ('Alfred', '55 Ninth Ave', 34565, 'Salinas', 'CA'), ('Jen', '1 Paved Rd', 30094, 'Los Angeles', 'CA')]
3
你的数据结构看起来有点奇怪。我猜你是想把k1变成这样:
>>> sum([zip(*x) for x in k1], [])
<<<
[('Bob', '123 Elm Street', 83, 'Newark', 'NJ'),
('Alfred', '55 Ninth Ave', 34565, 'Salinas', 'CA'),
('Jen', '1 Paved Rd', 30094, 'Los Angeles', 'CA'),
('Bob1', '123 Elm Street1', 665, 'Newark1', 'NJ1'),
('Alfred1', '55 Ninth Ave1', 345651, 'Salinas1', 'CA1'),
('Jen1', '1 Paved Rd1', 300941, 'Los Angeles1', 'CA1')]
现在你可以使用executemany这个方法了:
sql = "INSERT INTO addresses (name, street, zipcode, city, state) VALUES (%s, %s, %s, %s, %s)"
data = sum([zip(*x) for x in k1], [])
cursor.executemany(sql, data)