Python 索引器:索引超出范围: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

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

当我推送数据文件的子集时,它工作正常。但是当我解析整个数据文件时,它会失败,错误为indexer:index超出范围: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

没有看到你的.csv,我们真的帮不了你太多,但是

  • 确保csv中的每一行都具有正确的格式
  • 确保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()