我知道这个问题已被问过很多次了,但我似乎无法通过任何描述的方式工作。
我正在尝试将文件导入数据库,该文件包含以逗号分隔的数据列(即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
我确信我是愚蠢的,并且遗漏了一些显而易见的东西,但是我看不到它。
由于
答案 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()