2012-12-13 40 views

回答

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安全的。 (因爲這個原因我最近不得不寫我自己的讀者)。

+0

感謝您的幫助。你的讀者是否在github上?我會非常感興趣的,看看如何建立一個來源。 – user1876508

+0

它不是,但它可以。今天有點忙,我會再次張貼它。 – holdenweb

+0

現在發佈(沒有嘗試一般性)作爲要點在https://gist.github.com/4290995 – holdenweb