如何将csv文件中的文件名用作sqlite中的表名?

0 投票
1 回答
1003 浏览
提问于 2025-04-18 15:11

我想用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注入攻击。

撰写回答