【问题标题】:IndexError: index out of range: 7IndexError:索引超出范围:7
【发布时间】:2015-09-17 02:16:48
【问题描述】:

我正在使用名为 Financial Data Quality Management Enterprise Edition (FDMEE) 的 Oracle EPM 产品。我编写了一个 Jython 脚本来解析数据文件并将其推送到 FDMEE 产品模式中的自定义表中。

当我推送数据文件的子集时它工作正常。但是当我解析整个数据文件时,它失败并出现错误 IndexError: index out of range: 7.

以下是我收到的错误消息:

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

以下是我使用的代码:

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()

【问题讨论】:

  • 此错误报告您没有列表的第 8 个元素。什么是预期的输出?检查它并尝试回溯。
  • 另外,请阅读 Pandas 文档 [此处] (pandas.pydata.org/pandas-docs/stable/generated/…) 并使用数据框,它们更适合此目的。
  • 我没有太多时间查看您的代码,但我建议您使用 csv 模块中的 Dict_Reader,以便您可以按列名而不是按索引查看列。试试这个,你可能会在不知道问题的情况下找到解决方案
  • 嗨@RicardoSilveira 感谢您的评论,预期的输出是,它将数据从文件推送到产品数据库中自定义模式中的表,如果我使用代码执行良好数据的子集,但如果我使用更大的数据集(具有相似的数据结构/格式),也会通过 pandas 给出 indexError,感谢您的参考。
  • @Connor 感谢 Connor 的参考,现在就来看看

标签: python python-2.7 jython-2.5 jython-2.7


【解决方案1】:

受影响的行明显少于 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()

【讨论】:

  • 感谢亚历山大的编辑!测试代码,会让你知道更新。
  • 你应该使用字典而不是index()。像months = {'JAN': 1, 'FEB': 2,...} 这样你就可以做for row in recReader: period_num = months.get(row[7], None)index() 每次都需要遍历列表来获取索引,而 dicts 需要 O(1) 查找。
  • @IanAuld 感谢 Ian 提供的信息,之前没有使用过 dict,让我试试 dict 的这种方法,会让你知道更新。
  • 除了对每一行进行查询之外,还有一种更有效的方法来批处理信息,然后只进行一次写入(假设您有足够的内存来读取文件)。但这是另一个问题......
【解决方案2】:

如果没有看到您的 .csv,我们真的无法为您提供太多帮助,但是...

  1. 确保 csv 中的每一行都具有正确的格式
  2. 确保 csv 中的最后一行不只是空格。
  3. 查看the documentation for csv.reader中的可选参数,具体是newline=''

【讨论】:

  • 嗨维克拉姆,感谢您的建议。该文件具有正确的格式,并且不以空格结尾(刚刚验证),如果数据集很小,它会将数据从文件加载到产品表,但无法加载相同格式的更大数据集跨度>
  • 该文件显然没有正确的格式,否则您不会收到此错误。该错误表明存在少于 8 个字段的行。
  • @Barmar 感谢 Barmar/Vikram,它是一个相当大的文件,我从这个大文件中创建了大约 7-8 个单独的文件来进行测试,让我看看验证整个文件的方法,如果有格式不正确的行,这个数据文件是直接从一个叫做 Ab Initio 的工具中提取出来的,它在验证后转换文件,会让你知道更新。
  • 为什么不直接在脚本中添加if len(row) &lt; 8: print(row) 以便看到错误的行?
猜你喜欢
  • 1970-01-01
  • 2021-01-15
  • 2016-06-28
  • 2019-11-25
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 2011-10-31
相关资源
最近更新 更多