2017-01-27 4 views
1

pythonを使用して、私はcsvをsqliteテーブルにインポートし、csvファイルのヘッダーをsqliteテーブルのヘッダーに使用しようとしています。コードは実行されますが、テーブル "MyTable"は作成されていないようです。コードは次のとおりです。csv into 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

スクリプトは、最後から2番目の行で 'name ='で鳴ってしまいます(おそらく)。とにかく* name *は位置パラメータなので、削除するだけです。 –

+1

おっと、良いキャッチ@ビール! – sundance

+0

あなたは* strip *の必要性を確信していますか?私はそれを省略しようとし、SQL変数名はokと思われる。しかし、私はパンダの専門家ではありません。 –

0

peewee ormで簡単にすることもできます。このためにあなただけピーウィー、playhouse.csv_loaderから拡張子を使用する:あなたは「ドン場合はdict_output.csv

からフィールドなどのヘッダとデータをデータベースcity_spec.dbを作成

from playhouse.csv_loader import * 

db = SqliteDatabase('city_spec.db') 

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

あなたはそれをインストールすることができます。

pip install peewee 
0

あなたは答えをまだマークしていません。

データベースに一度だけ接続して、カーソルを1回だけ作成します。 csvレコードは1回だけ読み取ることができます。 列名だけに基づいてデータベーステーブルの粗形式を作成するコードを追加しました。繰り返しますが、これはループ内で1回だけ実行されます。 挿入コードが正常に機能しています。

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() 
関連する問題