【问题标题】:List index out of range while sorting in python在python中排序时列出索引超出范围
【发布时间】:2016-03-31 11:52:22
【问题描述】:

我正在尝试将 CSV 文件读入列表,然后根据列表的前两列对其进行排序(首先按第一列,如果第一列相同,则按第二列)。这就是我正在做的:

def sortcsvfiles(inputfilename,outputfilename):
    list1=[]
    row1=[]
    with open(inputfilename,'rt') as csvfile1:
        reader=csv.reader(csvfile1)
        cnt=0       
        for row in reader:
            if cnt==0:        #skip first row as it contains header information
                row1=row
                cnt+=1
                continue    
            list1.append((row)) 

        list1.sort(key=lambda ro: (int(ro[0]),int(ro[1])))

    list1.insert(0, row1)
    with open(outputfilename,'wt') as csvfile1:
        writer=csv.writer(csvfile1, lineterminator='\n')
        for row in list1:
            writer.writerow(row)

但我收到以下错误:

  File "C:\Users\50004182\Documents\temp.py", line 37, in <lambda>
    list1.sort(key=lambda ro: (int(ro[0]),int(ro[1])))
IndexError: list index out of range

我该如何解决这个问题?

【问题讨论】:

  • 请同时提供您的 CSV 文件的样本副本。

标签: python sorting csv


【解决方案1】:

您的文件中可能有一个空行。也许是最后一个。例如,您可以忽略空行:

def sortcsvfiles(inputfilename,outputfilename):
    with open(inputfilename,'rt') as csvfile:
        reader = csv.reader(csvfile)
        header = next(reader)
        data = [row for row in reader if row] # ignore empty lines
        data.sort(key=lambda ro: (int(ro[0]),int(ro[1])))

    with open(outputfilename,'wt') as csvfile:
        writer=csv.writer(csvfile, lineterminator='\n')
        writer.writerow(header)
        writer.writerows(data)

【讨论】:

    【解决方案2】:

    发生错误是因为您至少有一行没有 2 列。它可能有 1 甚至 0。

    您可以在添加行之前对此进行测试:

    if len(row) > 1:
        list1.append(row) 
    

    要对所有行进行排序但跳过第一个标题,您可以使用next() 函数(请参阅a previous answer of mine);也许使用sorted() 函数:

    def sortcsvfiles(inputfilename, outputfilename):
        with open(inputfilename,'rt') as csvfile1:
            reader = csv.reader(csvfile1)
            headers = next(reader, None)  # get one row, or None if there are no rows
            rows = sorted(
                (r for r in reader if len(r) > 1),
                key=lambda r: (int(r[0]), int(r[1])))
    
        with open(outputfilename,'wt') as csvfile1:
            writer = csv.writer(csvfile1, lineterminator='\n')
            if headers:
                writer.writerow(headers)
            writer.writerows(rows)
    

    我使用writer.writerows() 在一次调用中写入整个排序行列表。

    【讨论】:

    • 我认为没有任何行长度小于2。我尝试了您的解决方案,但仍然出现相同的错误。
    • @Noober:这是发生异常的唯一原因;如果r[0]r[1] 不存在。请注意,回溯显示异常发生在 lambda 中。
    • @Noober:请分享应用了我的更改的新异常的回溯(在pastie 中)。我非常怀疑我的代码会给出完全相同的异常。
    • 两个错误完全相同。这是粘贴链接-pastie.org/private/xjufbu45whc3nl95xzwaw
    • @Noober:这不是我的代码。你打电话给sorted list1。我在一个生成器表达式上调用了sorted(),它过滤掉了任何短于 2 个元素的行。你能分享一下抛出那个异常的代码吗?
    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多