gpt4 book ai didi

python - 谁能解释这个索引超出范围错误的根源?

转载 作者:太空狗 更新时间:2023-10-30 00:59:06 26 4
gpt4 key购买 nike

以下代码引发了一个我找不到解决方案的神秘错误。当我在一个更大的模块中测试它时它工作正常,所以不明白为什么这不起作用:

代码

import csv

with open('studentinfo.txt','a') as fo: #open the file in append mode (add to file, we don't wish to overwrite!)
studentfileWriter=csv.writer(fo) #fo = file out (this can be called anything you like)
id=input("Enter Student Id:")
firstname=input("Enter firstname:")
surname=input("Enter Surname:")
test1=input("Enter test1 score:")
test2=input("Enter test2 score:")
test3=input("Enter test3 score:")
studentfileWriter.writerow([id,firstname,surname,"Test1:"+test1,"Test2:"+test2,"Test3:"+test3])
print("Record has been written to file")


with open("studentinfo.txt", "r") as f:
reader = csv.reader(f)
sorted_list = list(reader) # turn the reader iterator into a list
sorted_list.sort(key=lambda x: x[2]) # use the third column as a sorting key
print("\n".join(str(row) for row in sorted_list)) # prettier print

错误信息

sorted_list.sort(key=lambda x: x[2])  # use the third column as a sorting key
IndexError: list index out of range

值得注意的是,当文件内容没有添加时,代码可以正常工作。在将学生添加到文件时,SORT 不起作用。

原始文件内容

001,Joe,Bloggs,Test1:99,Test2:100,Test3:1
002,Ash,Smith,Test1:20,Test2:20,Test3:100
003,Jonathan,Peter,Test1:99,Test2:33,Test3:44

添加测试学生的文件内容:

001,Joe,Bloggs,Test1:99,Test2:100,Test3:1
002,Ash,Smith,Test1:20,Test2:20,Test3:100
003,Jonathan,Peter,Test1:99,Test2:33,Test3:44
006,Mulch,Cart,Test1:99,Test2:22,Test3:11

结果错误发生在这个阶段(添加新学生时)。排序功能在其他方面工作正常。

更新和澄清:

出于教学目的,我需要它同时在 repl.it 和 IDLE 上工作>

如果有人可以发布 repl.it 作为答案(使用我上面的代码,有效),它在 IDLE 中使用 txt 文件实现时也有效,我将接受作为答案。

最佳答案

这里出现问题的原因是您没有正确地附加到 csv

在 Windows 上,csv 模块在运行 Windows 时存在错误/限制。如果您没有正确打开文件,它会在每一行添加额外的空行(实际上它会添加一个额外的 回车符 字符)。所以要修复它:

python 3:

with open('studentinfo.txt','a',newline='') as fo:

python 2:

with open('studentinfo.txt','ab') as fo:

所以 csv 模块在文件末尾添加了一个额外的 \r。再次读回时,它发出一个空行。

它在 repl.it 中运行良好,因为他们使用的是在 Linux 沙箱上运行的 python 引擎),但是 documentation仍然建议像我展示的那样打开文件。

(csv 模块的文档对此很清楚,即使它建议对读取模式执行相同的操作,而且我从来没有遇到过简单的 open("file .csv"))

另见我的一个老问题:portable way to write csv file in python 2 or python 3

如果文件末尾有双回车字符,您看不到它(使用 Notepad++ 和“显示所有符号”可以看到双 CRCR 字符)但是 csv.reader返回一个空行,当 sort 使用你的键函数来比较它时失败。

现在,如果您想对此保持稳健(因为其他人可以编辑您的数据库,例如,使用 excel csv 模式或其他糟糕的东西):

我会使用 filter(None,...) 过滤掉并排序并同时转换为列表,这会删除“虚假”(即空)行:

sorted_list = sorted(filter(None,reader),key=lambda x: x[2])

当然,如果一行只有 1 或 2 个项目,那也会失败。在那种情况下,放弃 filter 因为我们必须编写一个 lambda 而它不值得,有利于生成器理解:

sorted_list = sorted((x for x in reader if len(x)>2),key=lambda x: x[2])

关于python - 谁能解释这个索引超出范围错误的根源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45223037/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com