[英]Dynamically import columns from csv into database table in sqlite3 and python
如何使用python提取任意csv文件並創建包含指定列的新表? 假設我有許多具有不同列名的不同csv文件,並且我想使用python為每個文件創建一個表。
在下面的示例中,我假定文件包含定義列名稱的第一行。 否則,您可以只使用固定的名稱列表。 我概述的解決方案可以進行改進,以測試實際數據值以推斷出它們的類型,但是我認為,最初,您將對只為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安全的。 (由於這個原因,我最近不得不編寫自己的閱讀器)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.