我目前正在尝试使用 Python 将 CSV 文件导入到 SQLite 数据库中,使用顶部字段作为列名,但我需要能够导入任何 CSV 文件,无论它有多少列。我知道如何使用 csv 顶行创建列名,但我看到的每个关于将 csv 文件导入 python 数据库的示例,python 程序都指定了列数。但是,这个程序会让用户在输入框中提供 csv 文件名,允许他们选择不同的文件名,所以我不会提前知道需要分配多少列。我将如何着手制作它以便程序自动检测列数并相应地定义表格?到目前为止,我有这样的东西(不完全是,但是一个很好的例子),但默认情况下它只有两列。哦,我稍后会更改它以添加一个选项供用户输入要打开的文件名,所以不用担心(大部分已经在不同的模块中实现)。
import csv, sqlite3
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("CREATE TABLE t (col1, col2);")
with open('data.csv','rb') as fin:
dr = csv.DictReader(fin) #dr assigned value in DictReader
to_db = [(i['col1'], i['col2']) for i in dr] #
cur.executemany("INSERT INTO t (col1, col2) VALUES (?, ?);", to_db)
con.commit()
更新:
我现在的代码是这样的:
import csv, sqlite3
from Tkinter import *
from tkFileDialog import askopenfilename
def choosefilename():
return askopenfilename()
def main():
con = sqlite3.connect(":memory:")
csvFileName = choosefilename()
cur = con.cursor()
with open(csvFileName,'rb') as fin:
data_csv = csv.DictReader(fin)
column_count = len(list(list(data_csv))[0])
create_table_statement = "CREATE TABLE t ("
for column in xrange(1, column_count):
create_table_statement = create_table_statement + 'col{0}'.format(column)
create_table_statement = create_table_statement + ');'
cur.execute(create_table_statement)
[cur.execute('INSERT INTO t values ('+'%s,'*column_count[:-1]+')', d) for d in data_csv]
Button(text='File Open', command = choosefilename).pack(fill="x")
main()
它本身不会报错,但当您尝试退出打开的文件按钮框时它会卡住。
请您参考如下方法:
如果您愿意使用 pandas 库,可以使用两个函数轻松实现:
pandas.read_csv
会返回一个dataframe对象,然后使用Dataframe方法
Dataframe.to_sql
创建您的数据库。 Pandas 应该非常聪明地处理你的 csv 标题。您可能只需要使用默认参数。
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html
