繁体   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