【问题标题】:Dynamically import columns from csv into database table in sqlite3 and python将csv中的列动态导入sqlite3和python中的数据库表
【发布时间】:2012-12-01 00:20:15
【问题描述】:

如何获取任意 csv 文件并使用 python 创建一个包含指定列的新表?假设我有许多具有不同列名的不同 csv 文件,我想使用 python 为每个单独的文件创建一个表。

【问题讨论】:

    标签: python sql sqlite csv import


    【解决方案1】:

    在以下示例中,我假设文件包含定义列名的第一行。否则,您可以只使用固定的名称列表。我概述的解决方案可以改进以测试实际数据值以推断它们的类型,但我假设最初您会对只为 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 上吗?我会非常有兴趣查看源代码以了解如何构建一个。
    • 不是,但可以。今天有点忙,等有空再发。
    • 现在作为要点发布在gist.github.com/4290995
    猜你喜欢
    • 2011-02-22
    • 1970-01-01
    • 2015-02-05
    • 2011-06-10
    • 2019-07-13
    • 2016-09-20
    • 2014-12-02
    • 2013-09-20
    • 1970-01-01
    相关资源
    最近更新 更多