2014-11-26 6 views
0

Я знаю, что этот вопрос задан довольно много раз, но я не могу понять, как это работает.Импорт файла в SQLite3 с использованием python

Я пытаюсь импортировать файл в базу данных, в файле есть столбцы данных, разделенных запятой (т. Е. 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

прочитайте сообщение об ошибке. он четко описывает, где (и что) проблема. –

+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() 

Для небольшого файла, как ваш пример одного изменения на совершали конце ввода в порядке, но вы можете рассмотреть это делать чаще для большего файла. Я столкнулся с проблемами, возникающими из-за этого в прошлом.

EDIT:

В ответ на исключение упомянутого в свой комментарий, здесь альтернативный способ, чтобы пропустить первую строку:

#!/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() 
+0

Спасибо за вашу помощь Фермер Джо, я пытаюсь повторить это безрезультатно. Я получаю объект AttributeError: '_csv.reader' не имеет атрибута 'next'. – user3355986

+0

@ user3355986 Удаление этой строки приведет к тому, что заголовки будут вставлены в ваш db ... это то, что вы хотите? –

+0

@ user3355986 См. Мое редактирование для альтернативы. Я использую python2.7, поэтому может быть, поэтому мой код выдал вам исключение. –

Смежные вопросы