动态地将csv中的列导入sqlite3和python中的数据库表

时间:2012-12-13 06:31:42

标签: python sql sqlite csv import

如何使用python获取任意csv文件并使用其中的指定列创建新表?假设我有许多不同列名的不同csv文件,我想使用python为每个单独的文件创建一个表。

1 个答案:

答案 0 :(得分:6)

在下面的示例中,我假设文件包含定义列名的第一行。否则,您可以使用固定的名称列表。我可以改进我概述的解决方案来测试实际数据值以推断它们的类型,但我认为最初你会对一个只为CSV文件中的每一列定义varchar字段的解决方案感到满意(sqlite将所有内容存储为无论如何,角色数据。)

In [54]: f = open("/Users/sholden/test.csv", 'rU')

In [55]: reader = csv.reader(f)

In [56]: names = reader.next()

In [57]: names
Out[57]: ['First', 'Second', 'Third']

In [65]: import sqlite3 as db

In [66]: conn = db.connect(":memory:")

In [67]: curs = conn.cursor()

In [68]: sql = """create table x (\n""" +\
      ",\n".join([("%s varchar" % name) for name in names])\
      + ")"

In [69]: sql
Out[69]: 'create table x (\nFirst varchar,\nSecond varchar,\nThird varchar)'

In [70]: curs.execute(sql)
Out[70]: <sqlite3.Cursor at 0x101f2eea0>

In [71]: for line in reader:
    curs.execute("""INSERT INTO x (First, Second, Third)
                    VALUES (?, ?, ?)""", tuple(line))
   ....:     

In [72]: curs.execute("SELECT * FROM x")
Out[72]: <sqlite3.Cursor at 0x101f2eea0>

In [73]: curs.fetchall()
Out[73]: [(u'3', u'4', u'Charlie'), (u'5', u'6', u'Damion'), (u'78', u'90', u'Sidney')]

如果您的数据涉及Unicode,请务必小心,因为已知Python 2 csv模块不具有Unicode安全性。 (因为这个原因,我最近不得不写自己的读者)。