Python 索引器:索引超出范围:7
我正在使用一款名为Financial Data Quality Management Enterprise Edition(FDMEE)的Oracle EPM产品。我编写了一个Jython脚本来解析数据文件,并将其推送到FDMEE产品模式中的自定义表中 当我推送数据文件的子集时,它工作正常。但是当我解析整个数据文件时,它会失败,错误为indexer:index超出范围:7 以下是我收到的错误消息:Python 索引器:索引超出范围:7,python,python-2.7,jython-2.5,jython-2.7,Python,Python 2.7,Jython 2.5,Jython 2.7,我正在使用一款名为Financial Data Quality Management Enterprise Edition(FDMEE)的Oracle EPM产品。我编写了一个Jython脚本来解析数据文件,并将其推送到FDMEE产品模式中的自定义表中 当我推送数据文件的子集时,它工作正常。但是当我解析整个数据文件时,它会失败,错误为indexer:index超出范围:7 以下是我收到的错误消息: File "\\vmhodvesip4\D$\SVESI7\Custom\FDMEEApps\BF
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
没有看到你的.csv,我们真的帮不了你太多,但是
newline='
受影响行的列明显少于8列。使用
try/except
块进行调试:
for n, row in enumerate(recReader, start=1):
try:
month = row[7]
except:
print('Row {0}: {1}'.format(n, row))
作为奖励,这里有一种更有效的编写代码的方法:
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()
此错误报告您没有列表中的第8个元素。预期产量是多少?检查它并尝试回溯。此外,阅读Pandas文档[here]()并使用数据帧,它们在这方面更好。我没有太多时间查看您的代码,但我建议使用csv模块中的Dict_读取器,以便您可以按列名而不是索引查看列。试着这样做,您可能会在不知道问题的情况下找到解决方案hi@RicardoSilveira感谢您的评论,预期的结果是,它将数据从文件推送到产品数据库中自定义模式的表中,如果我使用数据的子集,代码执行得很好,但如果我使用的是较大的数据集(具有类似的数据结构/格式),则会给出索引器,同时也会查看pandas,谢谢您的参考。@Connor感谢您的参考Connor,现在查看Hi Vikram,谢谢您的建议。该文件具有正确的格式,并且不会以空格结尾(刚刚验证),如果数据集较小,它会将数据从文件加载到产品表,但无法加载相同格式的较大数据集。该文件显然没有正确的格式,否则不会出现此错误。错误表明有一行少于8个字段。@Barmar感谢Barmar/Vikram,这是一个相当大的文件,我从这个大文件中创建了大约7-8个单独的文件来进行测试,如果有格式不正确的行,让我看看验证整个文件的方法,此数据文件是从一个名为从头算的工具直接提取的,该工具在验证后转换文件,将让您知道更新。如果len(row)<8:print(row),为什么不将
添加到脚本中,以便您看到错误的行?感谢Alexander的编辑!测试代码,将让您知道更新。您应该在月份使用dict,而不是index()
。类似于months={'JAN':1,'FEB':2,…}
这样,您就可以对重新读取器中的行执行:period\u num=months.get(行[7],无)
<代码>索引()
每次都需要遍历列表才能获得索引,而dict有O(1)个查找。@I感谢Ian提供的信息,Ian以前没有使用过dict,让我试试dict这种方法,它会让您知道更新情况。而不是对每一行进行查询,还有一种更有效的方法可以批处理信息,然后只进行一次写入(假设您有足够的内存来读取文件)。但这是另一个问题。。。
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()