python报错:IndexError: list assignment index out of range

今天在完成一个文件操作作业,作业如下:

# 文件 -> 创建文件
# 往里面写入数据{写入一首古诗词}
# 创建完成后进行修改 发挥自己的创意,修改最后一行的诗句
# 修改完成重新存储到文件 

完成代码如下:
f=open("古诗.txt", "w+", encoding="utf-8")
f.writelines(["\t春晓,\n  春眠不觉晓,\n  处处蚊子咬"])
f.seek(0)
print(f.read())
txt_list = f.readlines()
txt_list[-1]='  处处闻啼鸟'
print(txt_list)
f.close()
f = open('古诗.txt', 'w+', encoding='utf-8')
f.writelines(txt_list)
f.seek(0)
print(f.read())
f.close()

在执行中,却报出一个错误:

 经过查找,发现该处英文表述的意思为:

索引错误:列表分配索引超出范围

这里只用到了一个列表索引,那就是txt_list[-1]=' 处处闻啼鸟'

列表的-1都超出范围,到底是怎么回事儿呢,让我们用debug调试来看一下这个列表到底是什么

这里可以看到,这个列表txt_list竟然是一个空列表,长度为0,难怪会连-1都会报错。

回去到编码中,发现可能的原因是什么呢?

为什么 txt_list = f.readlines()这句并没有将文件中的内容读取进去呢?

从f.seek(0) print(f.read())以及文件读取的操作推断,可能与光标指针的位置有关,因为上一行已经读取过全部内容,所以光标到了最后面,那么此时再读取,则只剩空列表了。

这里用f.seek(0)重新将光标归零,程序运行正常。

python报错:IndexError: list assignment index out of range_第1张图片

 这一个bug提醒我,在文件的操作中,要注意光标的位置,尤其在读取操作的时候,必要时通过调试或者打印中间变量的形式,来检验是否将列表中的问题赋予进去变量。变更后的程序如下:

f=open("古诗.txt", "w+", encoding="utf-8")
f.writelines(["\t春晓","\n  春眠不觉晓","\n  处处蚊子咬"])
f.seek(0)
print(f.read())
f.seek(0)
txt_list = f.readlines()
txt_list[-1]='  处处闻啼鸟'
print(txt_list)
f.close()
f = open('古诗.txt', 'w+', encoding='utf-8')
f.writelines(txt_list)
f.seek(0)
print(f.read())
f.close()

虽然实现了作业要求的功能,但是从写入的列表与最终执行的程序发现一个新的问题:

写入的列表为:["\t春晓","\n 春眠不觉晓","\n 处处蚊子咬"]

然后txt_list传入的列表却为['\t春晓\n', '  春眠不觉晓\n', '  处处蚊子咬'],并不能与原列表中的,隔开内容一一对应,目前暂时不了解具体的原因,如果有知道的,烦请解释一下。

你可能感兴趣的:(报错处理,python,bug)