with open((path + 'stuff.csv'),'r+') as fin1:
dr1 = csv.DictReader(fin1)
create1="CREATE TABLE LGD ("
exe1="INSERT INTO LGD ("
for a in dr1.fieldnames:
if a=='':
pass
elif ' ' in a:
create1+=a.replace(" ","")+','
exe1+=a.replace(" ","")+','
else:
create1 += a + ","
exe1+= a + ","
create1 = create1[:-1]
exe1=exe1[:-1]
create1 +=");"
exe1+=") VALUES ("
for a in range(len(dr1.fieldnames)-1):
exe1+='?'+","
exe1=exe1[:-1]
exe1+=");"
cur.execute(create1)
to_db1 = [(a[dr1.fieldnames[0]],a[dr1.fieldnames[1]],a[dr1.fieldnames[2]],a[dr1.fieldnames[3]],a[dr1.fieldnames[4]]) for a in dr1]
cur.executemany(exe1,to_db1)
conn.commit()
ok,我的目标是将每个CSV文档作为表导入sqlite数据库。假设有100个
现在我的代码动态地写字符串,但我怎么能创建to_db1列表,所以我不需要定义有多少列?
特别是这一行
to_db1 = [(a[dr1.fieldnames[0]],a[dr1.fieldnames[1]],a[dr1.fieldnames[2]],a[dr1.fieldnames[3]],a[dr1.fieldnames[4]]) for a in dr1]
我见过这个问题,但我的是不同的,因为字段名有空格,他们不能被拿走,因为许多文档是不可编辑的。我也不想丢掉下面所示的列表格式。
[(stuff,stuff,stuff),(stuff,stuff,stuff)]
将csv中的列动态导入sqlite3和python中的数据库表
重申一下我的问题,我想创建to_db1列表,但不需要在编译时定义列名。它应该以以下格式创建
[(stuff,stuff,stuff),(stuff,stuff,stuff)]
在运行时。
要获得没有空格且已经用逗号连接的字段名,可以使用列表推导式:
names = ['my _id', 'some a', 'some b']
sanitized_names = "({})".format(", ".join(x.replace(' ','') for x in names))
# => (my_id, somea, someb)
从那里,你可以重用你链接到的答案。
要从dr1
的字典中获得与dr1.fieldnames
相同顺序的元组,请使用[tuple(a[x] for x in dr1.fieldnames) for a in dr1]
。