3
如何使用python獲取任意csv文件並使用指定的列創建新表?假設我有許多不同列名的csv文件,我想用python爲每個單獨的文件創建一個表。動態從csv導入到sqlite3和python數據庫表中的列
如何使用python獲取任意csv文件並使用指定的列創建新表?假設我有許多不同列名的csv文件,我想用python爲每個單獨的文件創建一個表。動態從csv導入到sqlite3和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安全的。 (因爲這個原因我最近不得不寫我自己的讀者)。
感謝您的幫助。你的讀者是否在github上?我會非常感興趣的,看看如何建立一個來源。 – user1876508
它不是,但它可以。今天有點忙,我會再次張貼它。 – holdenweb
現在發佈(沒有嘗試一般性)作爲要點在https://gist.github.com/4290995 – holdenweb