如何使用python获取任意csv文件并使用其中的指定列创建新表?假设我有许多不同列名的不同csv文件,我想使用python为每个单独的文件创建一个表。
答案 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安全性。 (因为这个原因,我最近不得不写自己的读者)。