首页 新闻 会员 周边 捐助

list index out of range

0
悬赏园豆:5 [已解决问题] 解决于 2019-01-07 22:47

username=input('请输入您的注册用户名:')
password=input('请输入您的注册密码:')
with open('list_of_info',mode='w',encoding='utf-8') as f:
f.write('{}\n{}'.format(username,password))
print('恭喜您注册成功')
with open('list_of_info',mode='r+',encoding='utf-8') as f1:
print(f1.readlines()[0],type(f1.readlines()[0]))
count=0
count1=0
username_1=input('请输入您的登录用户名:').strip()
while count<3:
if username_1!=f1.readlines()[1]:
print('请输入的用户名不存在,请重新输入')
count+=1
else:
break
password_1=input('请输入您的登录密码:').strip()
while count<3:
if password_1!=f1.readlines()[1]:
print('您输入的密码错误,请重新输入')
count1=count1+1
else:
break
print('恭喜您登录成功')

运行结果如下:
请输入您的注册用户名:lk
请输入您的注册密码:123
恭喜您注册成功
Traceback (most recent call last):
File "F:/python/python学习/人工智能/第一阶段day2/练习.py", line 7, in <module>
print(f1.readlines()[0],type(f1.readlines()[0]))
IndexError: list index out of range

Process finished with exit code 1

print(f1.readlines()[0])能够成功运行,为何加了一个type后就报错呢。

舒畅123的主页 舒畅123 | 初学一级 | 园豆:194
提问于:2019-01-06 23:40
< >
分享
最佳答案
2

你在 第一次 f1.readlines() 的时候就已经取完了所有的值,当你第二次f1.readlines() 数据就没有值了。
open() 本身就是一个迭代器,只能不断向下取值。https://www.cnblogs.com/xiaobaiskill/p/8998714.html#6

如果你想要只要type类型的话,你可以先将 f1.readlines() 的数据保存在变量中,然后通过 type(变量第一个数据)

收获园豆:5
xiaobaiskill | 小虾三级 |园豆:1122 | 2019-01-07 11:45

谢谢大神的指点,按照您的意思,print(f1.readlines()[0],type(f1.readlines()[0]))中两个f1.readlines()[0]在执行的时候是有先后顺序吗。为何以前在列表中从没有遇到过这种情况呢?

舒畅123 | 园豆:194 (初学一级) | 2019-01-07 21:31

谢谢您,我按照您的方法,运行成功了,但是上面我的疑惑还是没有解开。

舒畅123 | 园豆:194 (初学一级) | 2019-01-07 21:47

@舒畅123: 知道迭代器,这个问题就很容易解开,迭代器和list 是两回事(list 是可迭代对象), list 你可以取其中的任意值,但是迭代器只能向后取值,不能取前值. with open( ) as f: 其中f 本身就是迭代器,你可以通过f.readline() 一次一次的迭代取值,但是你是取不到 已经取过的值的.也就是说一行数据取过一次之后就取不到第二次了,而f.readlines() 直接把所有的值都取出来了,当你第二次再取的时候就没有值了,因为已经取完了.
python 中为什么要有迭代器,其实是为了省内存,怎么省?举一个例子,比如说文件复制,打开文件通过迭代器取一行数据保存写入至另一个文件中,循环的一读一写,这样内存只会占用一行的数据,如果直接将文件的所有内容全部读到内存中,会导致电脑罢工.

xiaobaiskill | 园豆:1122 (小虾三级) | 2019-01-07 22:15

@舒畅123: python3 中文件的操作就是一个迭代器对象,你了解一下什么是可迭代对象和迭代器对象,自然会明白这个的. python3中不使用for 只使用while 的情况下list 可以通过下标取值,但是字典呢,如何取值呢? 迭代器可以让你知道 for 的工作原理.

xiaobaiskill | 园豆:1122 (小虾三级) | 2019-01-07 22:23

@xiaobaiskill: 非常感谢大神的指点,虽然我是初学者,但是也看得明白您的讲解。非常感谢您。

舒畅123 | 园豆:194 (初学一级) | 2019-01-07 22:32
其他回答(1)
0

IndexError: list index out of range
报这种错误2种可能:
1 list[index]index超出范围。
2 list是一个空的 没有一个元素,进行list[0]就会出现该错误。

ycyzharry | 园豆:25683 (高人七级) | 2019-01-07 11:27

谢谢您的关注,我只道这个的,可是print(f1.readlines()[0])能够运行成功,但是print(f1.readlines()[0],type(f1.readlines()[0]))就运行失败呢。

支持(0) 反对(0) 舒畅123 | 园豆:194 (初学一级) | 2019-01-07 21:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册