1

基本的に、Python 3.2 で実行しようとしているのは、3 つの列を含む入力 csv ファイルを読み取り、SQL 出力ファイルを作成することです。入力ファイルの各行の 3 つのデータは、挿入クエリのパラメーターとして使用されます。

私のコードは次のようになります:

import os  
import csv  

InFileName = r'path\test.csv'  
OutFileName = r'path\test.sql'  
NumCommas = 0  

File = open(InFileName)  
for line in File:  
    if line.count(',') > NumCommas:  
        NumCommas = line.count(',')  
File.seek(0)  

reader = csv.reader(File)  
OutFile = open(OutFileName, 'w')  
for rows in reader:  
    OutFile.write("insert into table_name values(",rows[0],", 2, to_date(",   rows[1],",'YYYY-MM-DD'), 1, 1, -1, 0, ",rows[2],", ",rows[2],", 0, 0, 0, sysdate, 0);" +   '\n')  

OutFile.close()  
File.close()  

エラーが発生しました:

範囲外のリスト インデックス

4

2 に答える 2

2

ブロックrows内にログインします。rows in readercsv のファイルの最後 (または最初) に空白行があるだけかもしれません。

これはrows、その行の配列が空になるrows[0]か、またはrows[2]ビットがその行に存在しない列にアクセスしようとする可能性があることを意味します。

for rows in reader:
    print rows # check yourself before you wreck yourself
于 2013-02-25T11:00:45.793 に答える
2

あなたのコードで

NumCommas = 0  

File = open(InFileName)  
for line in File:  
    if line.count(',') > NumCommas:  
        NumCommas = line.count(',')

入力ファイルのすべての行の 1 行に含まれるコンマの最大数を決定して記憶します。その後、その情報を使用して入力を検証することすらありません。

ジャックはすでに指摘しています: あなたの入力を検証してください:

for (lineno, row) in enumerate(reader):
    if len(row) >= 3:
        OutFile.write("insert into table_name values(",row[0],", 2, to_date(",   row[1],",'YYYY-MM-DD'), 1, 1, -1, 0, ",row[2],", ",row[2],", 0, 0, 0, sysdate, 0);" +   '\n')
    else:
        print("Line {0} does not contain at least three columns: {1}".format(lineno, row))

コンマを数える最初のループは本当に必要ありません。一般に、ファイル I/O は、あらゆるコンピューティング アプリケーションのパフォーマンスを制限します。必要がない場合は、2 回実行しないでください。

また、一般的に言えば、常に完全なエラー メッセージを投稿します。Python が行番号とコード行を提供したことで、ここにいる人々が助けやすくなったと確信しています。

于 2013-02-25T13:47:43.180 に答える