2017-01-27 2 views
1

Используя python, я пытаюсь импортировать csv в таблицу sqlite и использовать заголовки в файле csv, чтобы стать заголовками в таблице sqlite. Код работает, но таблица «MyTable» не создается. Вот код:csv в sqlite table python

with open ('dict_output.csv', 'r') as f: 
    reader = csv.reader(f) 
    columns = next(reader) 

#Strips white space in header 
    columns = [h.strip() for h in columns] 


#reader = csv.DictReader(f, fieldnames=columns) 
    for row in reader: 
     print(row) 

    con = sqlite3.connect("city_spec.db") 
    cursor = con.cursor() 

#Inserts data from csv into table in sql database. 
    query = 'insert into MyTable({0}) values ({1})' 
    query = query.format(','.join(columns), ','.join('?' * len(columns))) 
    print(query) 
    cursor = con.cursor() 
    for row in reader: 
     cursor.execute(query, row) 
#cursor.commit() 

    con.commit() 

    con.close() 

Заранее благодарим за любую помощь.

+1

, где ваше заявление «создать таблицу»? –

ответ

2

Вы можете использовать панда, чтобы сделать это легко (возможно, потребуется pip install pandas первых):

import sqlite3 
import pandas as pd 

# load data 
df = pd.read_csv('dict_output.csv') 

# strip whitespace from headers 
df.columns = df.columns.str.strip() 

con = sqlite3.connect("city_spec.db") 

# drop data into database 
df.to_sql("MyTable", con) 

con.close() 

Панда будет делать всю тяжелую работу за вас, в том числе создать реальную таблицу!

+1

Сценарий будет (может) кричать с именем «name =» в предпоследней строке. Просто удалите его, так как * имя * является позиционным параметром в любом случае. –

+1

Упс, хорошо поймай @ Билл! – sundance

+0

Вы уверены в необходимости * strip *? Я попытался опустить его, и имена переменных sql выглядят нормально. Но я не специалист по пандам. –

0

Вы также можете сделать это легко с peewee orm. Для этого вы используете только расширение от Peewee, в playhouse.csv_loader:

from playhouse.csv_loader import * 

db = SqliteDatabase('city_spec.db') 

Test = load_csv(db, 'dict_output.csv') 

Вы создали city_spec.db базы данных с заголовками, как поля и данные из dict_output.csv

Если вы не» t иметь peewee вы можете установить его с

pip install peewee 
0

Вы еще не отметили, что ваш ответ решён, но здесь.

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

import sqlite3 
import csv 

con = sqlite3.connect("city_spec.sqlite") ## these statements belong outside the loop 
cursor = con.cursor() ## execute them just once 

first = True 
with open ('dict_output.csv', 'r') as f: 
    reader = csv.reader(f) 
    columns = next(reader) 
    columns = [h.strip() for h in columns] 
    if first: 
     sql = 'CREATE TABLE IF NOT EXISTS MyTable (%s)' % ', '.join(['%s text'%column for column in columns]) 
     print (sql) 
     cursor.execute(sql) 
     first = False 
    #~ for row in reader: ## we will read the rows later in the loop 
     #~ print(row) 

    query = 'insert into MyTable({0}) values ({1})' 
    query = query.format(','.join(columns), ','.join('?' * len(columns))) 
    print(query) 
    cursor = con.cursor() 
    for row in reader: 
     cursor.execute(query, row) 
    con.commit() 
    con.close()