使用Python的sqlite文件名列表

我正在尝试使用
Python使用目录中的文件名列表填充sqlite3数据库.我不确定为什么这不起作用:

conn = sqlite3.connect( "databasefile.db" )
cur = conn.cursor()
cur.execute('CREATE TABLE IF NOT EXISTS filenames (filename TEXT)')
for root, dirnames, filenames in os.walk(directory):
    for filename in filenames:
        if filename.endswith(".ext"):
            cur.executemany('INSERT INTO filenames (filename) VALUES (?)', (filename))
            conn.commit()

我想在数据库文件中生成它:

   Column
1  1st.ext
2  2nd.ext
3  3rd.ext

但相反它会导致:

   Column
1  1
2  r
3  s
4  t
5  .
6  e
7  x
8  t
9  2
10 n
11 d
12 .

etc.

谁能帮我理解我哪里出错了?

编辑:谢谢,我没有意识到迭代字符串给出了单个字符.添加逗号以使’filename’成为元组并解决.

最佳答案 首先,您不需要使用executemany,因为您实际上并不是一次只执行多个插入.其次,将(filename)更改为(filename,).字符串和元组都支持迭代器协议,如果没有逗号,executemany函数会将变量filename解释为迭代的东西.当您遍历字符串时,您将获得单个字符.

您可能做的另一件事情如下:

for root, dirnames, filenames in os.walk(directory):
    cur.executemany("INSERT INTO filenames (filename) VALUES (?)",
                    [(filename,) for filename in filenames if filename.endswith(".ext")])
    conn.commit()

现在你实际上正在利用executemany,一般来说,减少数据库访问的次数会更少.

点赞