Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将列表列表插入表中?[Python]_Python_Sqlite_Csv_Insert - Fatal编程技术网

如何将列表列表插入表中?[Python]

如何将列表列表插入表中?[Python],python,sqlite,csv,insert,Python,Sqlite,Csv,Insert,我有一个列名称的列表: csvfields = ['id', 'gen', 'age', 'mar', 'loc', 'inc', 'iscr', 'escr'] 和数据列表及列表: csvdata = [['51', 'F', '46', 'M', '0', '15100', '531', '555'], ['52', 'M', '29', 'M', '2', '14200', '673', '633'], ['53', 'M', '25', 'S', '0', '22200', '74

我有一个列名称的列表:

csvfields = ['id', 'gen', 'age', 'mar', 'loc', 'inc', 'iscr', 'escr']
和数据列表及列表:

csvdata = [['51', 'F', '46', 'M', '0', '15100', '531', '555'], 
['52', 'M', '29', 'M', '2', '14200', '673', '633'], 
['53', 'M', '25', 'S', '0', '22200', '742', '998'], 
['54', 'M', '36', 'M', '2', '1000', '677', '646'], 
['55', 'F', '99', 'S', '0', '10600', '608', '998'], 
['56', 'F', '45', 'M', '2', '6100', '710', '743'], 
['57', 'M', '99', 'M', '2', '16500', '679', '646'], 
['58', 'F', '37', 'M', '0', '7400', '637', '683'], 
['59', 'M', '45', 'S', '0', '22800', '683', '998'], 
['60', 'M', '22', 'S', '0', '6400', '699', '998']]
我创建了一个函数,用于创建一个包含
csvfields
al列的表:

def create_dbtb(dbname, tablename):
    conn = sqlite3.connect(dbname)
    curs = conn.cursor()
    columns =  ', '.join(csvfields)
    curs.execute('''CREATE TABLE IF NOT EXISTS {}({})'''.format(tablename, columns))
    conn.commit()
    conn.close()
但是现在我想创建另一个函数,将
csvdata
中的数据插入到创建的表中。我创建了下一个函数,但它不起作用,我不知道如何修复它

def fill_dbtb(self):
    conn = sqlite3.connect('data.db')
    curs = conn.cursor()
    columns = ', '.join(csvfields)
    data = ', '.join([row for row in csvdata])
    curs.execute('''INSERT INTO data {} VALUES ({})'''.format(columns, data)) 
有人知道如何解决这个问题吗

顺便说一句,这是我在运行第二个函数后得到的错误:

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    x.fill_dbtb()
  File "/Users/dirkkoomen/Desktop/Python cursus/inzendopgave 4/opgave 6/oefnen.py", line 48, in fill_dbtb
    curs.execute('''INSERT INTO data ({}) VALUES ({})'''.format(', '.join(self.csvfields), ', '.join([row for row in self.csvdata])))
TypeError: sequence item 0: expected str instance, list found
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
x、 fill_dbtb()
文件“/Users/dirkkoomen/Desktop/Python cursus/inzendophaved 4/ophaved 6/oefnen.py”,第48行,在fill_dbtb中
curs.execute(''INSERT INTO data({})value({}')。格式(','.join(self.csvfields),','.join([self.csvdata中的行对应行]))
TypeError:序列项0:应为str实例,找到列表

终于找到了解决方法,不知道这是不是最好的方法

def create_dbtb(dbname, tablename):
    conn = sqlite3.connect(dbname)
    curs = conn.cursor()
    columns =  ', '.join(csvfields)
    curs.execute('''DROP TABLE IF EXISTS {}'''.format(tablename))
    curs.execute('''CREATE TABLE {}({})'''.format(tablename, columns))
    conn.commit()
    conn.close()

def fill_dbtb():
    conn = sqlite3.connect('data.db')
    curs = conn.cursor()
    csvdata_new = [tuple(l) for l in csvdata]
    fields = tuple(csvfields)
    for item in csvdata_new:
        var_string = ', '.join('?'*len(item))
        curs.executemany('''INSERT INTO data {} VALUES ({})'''.format(fields, var_string), (item,))
    conn.commit()
    conn.close()

这很好,请告诉我是否有更好的方法。

的可能重复项您是否尝试过使用列表理解来迭代嵌套列表并将其添加到table@Clint更好的方法是使用
executemany
而不是在python中循环要为您的查询提供参数,这对SOL injection是开放的。您应该研究参数化以找到正确的方法。在过去几天中,您已经提出了许多问题,这些问题表明,如果您能找到一门涵盖Python基础知识、输入/输出和数据库交互的课程,而不是每次遇到困难时都这样做,您可能会受益匪浅。您是否阅读过关于您正在学习或正在学习的python教程主题的任何python文档?请参阅@roganjosh的评论:“您不应该使用format()为查询提供参数,这是SQL注入的开放方式。您应该研究参数化以找到正确的方法。”