簡體   English   中英

將列從CSV動態導入到sqlite3和python中的數據庫表中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM