问题
I am working with an Oracle EPM Product called Financial Data Quality Management Enterprise Edition (FDMEE). I have written a Jython script to parse a data file and push it to a custom table within the FDMEE product schema.
It works fine when I am pushing a subset of data file. But when I parse the entire data file, it fails with the error IndexError: index out of range: 7.
Following is the error message I receive :
File "\\vmhodvesip4\D$\SVESI7\Custom\FDMEEApps\BFRVN/data/scripts/event/BefImport.py", line 5, in <module>
if row[7]=='JAN':
IndexError: index out of range: 7
Following is the code I use :
import csv
recReader = csv.reader(open('D:/SVESI7/Custom/FDMEEApps/BFRVN/inbox/BF_Reven_Load/Test03big.txt'), delimiter='!')
for row in recReader:
if row[7]=='JAN':
period_num = '1'
elif row[7]=='FEB':
period_num = '2'
elif row[7]=='MAR':
period_num = '3'
elif row[7]=='APR':
period_num = 4
elif row[7]=='MAY':
period_num = 5
elif row[7]=='JUN':
period_num = 6
elif row[7]=='JUL':
period_num = 7
elif row[7]=='AUG':
period_num = 8
elif row[7]=='SEP':
period_num = 9
elif row[7]=='OCT':
period_num = 10
elif row[7]=='NOV':
period_num = 11
elif row[7]=='DEC':
period_num = 12
else:
period_num = 'skip'
if period_num != 'skip':
params1 = ['batch_plnapps_oi',row[7],period_num,'20' + row[1][-2:],row[2], row[3], row[4], row[5], row[6], row[8], row[9], row[10], row[11], round(row[12],12)]
ins_stmt1 = "insert into aif_open_interface(batch_name,period,period_num,year,col03,col04,col05,col06,col07,col09,col10,col11,col12,amount) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
fdmAPI.executeDML(ins_stmt1,params1,False)
fdmAPI.commitTransaction()
回答1:
There are obviously fewer than 8 columns for the affected row. Debug using a try/except
block:
for n, row in enumerate(recReader, start=1):
try:
month = row[7]
except:
print('Row {0}: {1}'.format(n, row))
As a bonus, here is a more efficient way to write your code:
months = {'JAN': 1, 'FEB': 2, 'MAR': 3, 'APR': 4, 'MAY': 5, 'JUN': 6,
'JUL': 7, 'AUG': 8, 'SEP': 9, 'OCT':10, 'NOV': 11, 'DEC': 12]
for row in recReader:
month = row[7]
period_num = months.get(month, None)
if period_num:
params1 = ['batch_plnapps_oi', row[7], period_num, '20' + row[1][-2:], row[2], row[3], row[4], row[5], row[6], row[8], row[9], row[10], row[11], round(row[12], 12)]
ins_stmt1 = "INSERT INTO aif_open_interface(batch_name, period, period_num, year, col03, col04, col05, col06, col07, col09, col10, col11, col12, amount) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
fdmAPI.executeDML(ins_stmt1, params1, False)
fdmAPI.commitTransaction()
回答2:
Without seeing your .csv we can't really help you too much, but...
- Ensure that every line in your csv has the correct format
- Make sure that the last line in your csv is not just whitespace.
- Look at the optional parameters in the documentation for csv.reader, specifically
newline=''
来源:https://stackoverflow.com/questions/32621595/indexerror-index-out-of-range-7