使用python将文件导入SQLite3

时间:2014-11-26 20:09:17

标签: python python-3.x sqlite

我知道这个问题已被问过很多次了,但我似乎无法通过任何描述的方式工作。

我正在尝试将文件导入数据库,该文件包含以逗号分隔的数据列(即csv)。我制作了一个类似于我想读的actula文件的测试文件,所以这里是内容。

Wind_Speed, Wind_Direction, Wind_Max
10, 360, 12
13, 320, 11
12, 340, 14
12, 360, 14

这是我一直在做的事情。

#!/usr/bin/python3.3

import csv, sqlite3

con = sqlite3.connect('test.db')
cur = con.cursor()

with open('test.dat', newline='') as f:
    reader = csv.reader(f)
    for column in reader:
        cur.execute('INSERT INTO jaws VALUES {}'.format(column))
con.commit()

这是错误消息,

Traceback (most recent call last):
  File "csvdict.py", line 11, in <module>
    cur.execute('INSERT INTO jaws VALUES {}'.format(column))
sqlite3.OperationalError: near "['Wind_Speed', ' Wind_Direction', ' Wind_Max']": syntax error

我确信我是愚蠢的,并且遗漏了一些显而易见的东西,但是我看不到它。

由于

1 个答案:

答案 0 :(得分:1)

您没有正确格式化数据。

首先,您的错误消息说您插入我认为是您的列名称。

其次你要小心how you insert into sql

#!/usr/bin/python3.3

import csv, sqlite3

con = sqlite3.connect('test.db')
cur = con.cursor()

with open('test.dat', 'r') as f:
    reader = csv.reader(f)
    reader.next() # skip the headers
    for column in reader:
        cur.execute('INSERT INTO jaws VALUES (?,?,?)',tuple(i for i in column))
con.commit()

对于像您的示例一样的小文件,在输入结束时提交更改很好,但您可能需要考虑更频繁地为更大的文件执行此操作。因为过去我遇到了问题。

修改

为了回应评论中提到的异常,以下是跳过第一行的另一种方法:

#!/usr/bin/python3.3

import csv, sqlite3

con = sqlite3.connect('test.db')
cur = con.cursor()

with open('test.dat', 'r') as f:
    reader = csv.reader(f)
    first = True
    for column in reader:
        if first:
            first = False
            continue
        cur.execute('INSERT INTO jaws VALUES (?,?,?)',tuple(i for i in column))
con.commit()

<强> EDIT2:

为了回应评论中提到的异常,以下是跳过第一行的另一种方法:

#!/usr/bin/python3.3

import csv, sqlite3

con = sqlite3.connect('test.db')
cur = con.cursor()

with open('test.dat', 'r') as f:
    reader = csv.reader(f)
    skip_n = 4  # skips 4 lines
    skip_i = 0
    for column in reader:
        if skip_i < skip_n:
            skip_i += 1
            continue
        cur.execute('INSERT INTO jaws VALUES (?,?,?)',tuple(i for i in column))
con.commit()