基本上我在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()
我收到了错误:
列出索引超出范围
答案 0 :(得分:2)
在rows
块中记录rows in reader
。您可能只是在csv的文件(或开头)末尾有一个空行。
这意味着该行的rows
数组将为空,rows[0]
或rows[2]
位可能会尝试访问不存在的列行:
for rows in reader:
print rows # check yourself before you wreck yourself
答案 1 :(得分:2)
使用您的代码
NumCommas = 0
File = open(InFileName)
for line in File:
if line.count(',') > NumCommas:
NumCommas = line.count(',')
您确定并记住输入文件所有行中一行中的最大逗号数。之后,您甚至没有使用该信息来验证您的输入。
杰克已经说明了一点:验证您的输入:
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是对任何计算应用程序的性能限制。如果你不必这样做,不要做两次。
另外,一般来说,总是发布完整的错误消息。我确信Python为您提供了行号和代码行,这使得这里的人们更容易提供帮助。