2017-12-29 20 views
1

私は使用する必要がある一意のIDを供給するcsvファイルからsqlite3にテーブルを作成しています。私はどこにそれを作成し、dbとその完全なものを作ります。同じユニークなid値を持つ別のcsvファイルを取得しようとしていますが、dbに適用したい情報が追加されています。ユニークな値のSqlite更新行

私が追加したいcsvファイルは、dbの多くの行にのみ適用されます。私はエラーを取得しています:はIndexError:行の同じ量がsqlite.dbするcsvファイルに存在しないので、範囲外のリストインデックス

Traceback (most recent call last): 
File "test.py", line 62, in <module> 
update_teams(x[0], x[2]) 
IndexError: list index out of range 

は、私はこれを取得していますか?

CSV形式:

Id,PlayerName,TeamName 
641393,John Doe1,Team1 
663844,John Doe2,Team1 
607469,John Doe3,Team1 

マイコード:

import csv 
import sqlite3 

# connect to sqlite database 
conn = sqlite3.connect('players.db') 
c = conn.cursor() 

# table values 
table_spec = """CREATE TABLE IF NOT EXISTS players(
       player_id INTEGER UNIQUE, 
       name_last TEXT, 
       name_first TEXT, 
       TeamName TEXT);""" 


# Create Table 
def create_table(): 
    c.execute(table_spec) 


# Takes values and inserts them into the table 
def write_core_data(player_id, name_last, name_first): 
    c.execute('INSERT OR IGNORE 
       INTO players ("player_id","name_last","name_first") 
       VALUES (?,?,?)', (player_id,name_last, name_first)) 
    conn.commit() 


def update_teams(player_id, TeamName): 
    c.execute('UPDATE players 
       SET TeamName=? 
       WHERE player_id=?',(TeamName, player_id)) 
    conn.commit() 


# create_table() 


with open('players_master.csv') as csvfile: 
    readCSV = csv.reader(csvfile, delimiter=',') 
    for x in readCSV: 
     write_core_data(x[0], x[1], x[2]) 
     print(x[0]) 

with open('team_list.csv') as teamlist: 
    readCSV = csv.reader(teamlist, delimiter=',') 
    for x in readCSV: 
     update_teams(x[0], x[2]) 
     print("Added team {} to {}".format(x[2], x[1])) 

c.close() 
conn.close() 

任意の入力を大幅に理解されます。ありがとうございます

+0

さてこれらのCSVファイルがどのように大きいですか? MBs? GBs? –

+0

質問ありがとうございます。 dbファイルは6,793KB、csvファイルは334KBです。だから彼らは本当に小さいですが、私はちょうど行の量が異なることが問題であるかもしれないので考えました。 –

+1

SQLite(およびほとんどのデータベース)はこのように動作しません。少量のデータではなく、行がなくなったわけではありません。あなたは問題が起こっているコードのどこで強調表示できますか? –

答えて

2

おそらく、あなたのcvsファイルには、空の行または小さすぎる行があります。 スキップ空行:

for x in readCSV: 
    if x: 
     update_teams(x[0], x[2]) 

あなたはlen(x) >= 3ことも主張することができます。

for x in readCSV: 
    if len(x) < 3: 
     print('Skipping', x) 
    else: 
     update_teams(x[0], x[2]) 
+0

これは問題でした。解決していただきありがとうございます! –

関連する問題