5

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

4

1 回答 1

8

在以下示例中,我假设文件包含定义列名的第一行。否则,您可以只使用固定的名称列表。我概述的解决方案可以改进以测试实际数据值以推断它们的类型,但我假设最初您会对只为 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 安全的。(出于这个原因,我最近不得不写自己的读者)。

于 2012-12-13T09:39:38.360 回答