如何将csv文件中的文件名用作sqlite中的表名?
我想用Python把八个csv文件导入到sqlite数据库中,每个文件都作为一个单独的表格。数据库表格的名字应该和csv文件的名字一样,只是去掉了.csv这个后缀。请问我该怎么创建和csv文件同名的表格,并把数据插入到正确的数据库表格里呢?
下面是我尝试写的代码。导入的库、UnicodeDictReader函数和数据库连接的部分省略了。
filmappe = '../csv'
for csvfile in os.listdir(filmappe):
with open(os.path.join(filmappe, csvfile), 'rb') as fil:
spamreader = UnicodeDictReader(fil)
t = (csvfile[:-4],)
to_db = [(i['fnr'], i['kjonn'], i['landbakgrunn'], i['alder'], i['arbkomm'], i['naring']) for i in spamreader]
cur.execute("CREATE TABLE IF NOT EXISTS ? (fnr, kjonn, landbakgrunn, alder, arbkomm, naring);", t )
cur.executemany("INSERT OR IGNORE INTO ? (fnr, kjonn, landbakgrunn, alder, arbkomm, naring) VALUES (?,?,?,?,?,?);",t, to_db)
1 个回答
2
你不能把表名当作查询参数使用;这是使用SQL参数的一个重要原因,就是为了防止这些数据被当作对象名称来解释。
在这里你需要使用字符串插值:
cur.execute("""
CREATE TABLE IF NOT EXISTS "{}"
(fnr, kjonn, landbakgrunn, alder, arbkomm, naring)
""".format(t))
cur.executemany("""
INSERT OR IGNORE INTO "{}" (fnr, kjonn, landbakgrunn, alder, arbkomm, naring)
VALUES (?,?,?,?,?,?)
""".format(t), to_db)
我在表名周围加了"
引号,以确保那些也是关键字的名称仍然可以使用。
请不要对用户提供的数据这样做;如果你不能信任文件名,那你就很容易受到SQL注入攻击。