动态导入列从CSV导入数据库表中的sqlite3和Python(Dynamically import

2019-08-04 00:49发布

如何采取一个任意的CSV文件,并创建一个新表使用python它在指定的列? 比方说,我有不同的列名很多不同的CSV文件,我想创建一个表使用python每个单独的文件。

Answer 1:

在下面的例子中我推定该文件包含用于定义列名的第一行。 否则,你可以只使用名称的固定列表。 该解决方案我的轮廓可以细化到实际测试数据值,使他们的类型推论,但我认为一开始你会很乐意与只定义为在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的安全。 (最近,我写我自己的读者正是由于这个原因)。



文章来源: Dynamically import columns from csv into database table in sqlite3 and python