Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中排序时列表索引超出范围_Python_Sorting_Csv - Fatal编程技术网

在python中排序时列表索引超出范围

在python中排序时列表索引超出范围,python,sorting,csv,Python,Sorting,Csv,我试图将一个CSV文件读入一个列表,然后根据列表的前两列对其进行排序(首先按第一列排序,如果第一列相同,则按第二列排序)。这就是我正在做的: def sortcsvfiles(inputfilename,outputfilename): list1=[] row1=[] with open(inputfilename,'rt') as csvfile1: reader=csv.reader(csvfile1) cnt=0

我试图将一个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
文件“C:\Users\50004182\Documents\temp.py”,第37行,在
列表1.sort(key=lambda ro:(int(ro[0]),int(ro[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)

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

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)

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

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

if len(row) > 1:
    list1.append(row) 
要对所有行进行排序,但跳过第一个标题,可以使用
next()
函数(请参阅);使用
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()
在一次调用中写入整个排序行列表。

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

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

if len(row) > 1:
    list1.append(row) 
要对所有行进行排序,但跳过第一个标题,可以使用
next()
函数(请参阅);使用
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()
在一次调用中写入整个排序行列表。

请同时提供CSV文件的示例副本。请同时提供CSV文件的示例副本。我认为没有长度小于
2
的行。我尝试了你的解决方案,但仍然出现同样的错误。@Noober:这是发生异常的唯一原因;如果
r[0]
r[1]
不存在。请注意,回溯显示异常发生在lambda中。@Noober:请共享应用了我的更改的新异常的回溯(在a中)。我强烈怀疑我的代码是否会给出完全相同的异常。这两个错误完全相同。这是粘贴链接-@Noober:这不是我的代码。您在
list1
上调用了
sorted
。我在一个生成器表达式上调用了
sorted()
,该表达式过滤掉任何短于2个元素的行。您可以共享引发该异常的代码(再次在粘贴中)吗?我认为没有任何行的长度小于
2
。我尝试了你的解决方案,但仍然出现同样的错误。@Noober:这是发生异常的唯一原因;如果
r[0]
r[1]
不存在。请注意,回溯显示异常发生在lambda中。@Noober:请共享应用了我的更改的新异常的回溯(在a中)。我强烈怀疑我的代码是否会给出完全相同的异常。这两个错误完全相同。这是粘贴链接-@Noober:这不是我的代码。您在
list1
上调用了
sorted
。我在一个生成器表达式上调用了
sorted()
,该表达式过滤掉任何短于2个元素的行。你能分享引发这个异常的代码吗?