繁体   English   中英

Python readlines() 无法在 for 循环中输出错误

[英]Python readlines() doesn't function outputs bug in for loop

简介:我目前是 Python 初学者学习语法。 我遇到过 python 原生支持的读取和写入文件的概念。 在尝试循环读取和写入命令后,我想尝试一下并找出错误。 我想从名称文件中随机选择一个名称,然后将其写入一个新文件。 我的文件包含 19239 行名称,randrange(18238) 从 0 - 18238 生成,并且据说会随机读取 1 - 18239 之间的一行。问题是读写代码在没有 for 循环的情况下工作,但是不是 for 循环。

我的尝试:

from random import randrange
rdname = open("names.dat", "r")
wrmain = open("main.dat", "a")
rdmain = open("main.dat", "r")

for x in range(6):
    nm = rdname.readlines()[randrange(18238)]
    print(str(randrange(18238)) + ": " + nm)
    wrmain.write("\n" + nm)
...

错误代码:

Exception has occurred: IndexError
list index out of range

rdname.readlines()耗尽您的文件句柄。 第一次运行rdname.readlines()会为您提供行列表,但随后每次都会返回一个空列表。 显然,您无法访问空列表中的元素。 要解决此问题,请在循环之前将readlines()的结果分配给变量一次。

rdlines = rdname.readlines()
maxval = len(rdlines)
for x in range(6):
    randval = randrange(maxval)
    nm = rdlines[randval]
    print(str(randval) + ": " + nm)
    wrmain.write("\n" + nm)

此外,确保您的随机数只能达到列表的长度是一个好主意。 不需要对列表的长度进行硬编码len()函数会给你。

我强烈建议你看看如何调试小程序。 使用调试器单步调试代码非常有用,因为您可以看到每一行如何影响变量的值。 在这种情况下,如果您在每次迭代中查看nm的值,很明显为什么您会得到IndexError ,并且发现nmreadlines()上变成一个空列表将指向答案的方向.

祝你的编程之旅好运。

readlines()方法。 有一些非直觉的行为。 当您使用readlines()它会“转储”文件的全部内容并返回每行的字符串列表。 因此,第二次调用rdname.readlines()[randrange(18238)]rdname文件对象完全为空,实际上您有一个空列表。 因此,从功能[][randrange(18238)]您是在告诉程序在循环的第二次迭代中运行[][randrange(18238)]

我还冒昧地修复了随机数调用,因为您实现的方式意味着它会在选择名称nm = rdname.readlines()[randrange(18238)]并打印所选名称时调用 2 个不同的随机数和 linenumber print(str(randrange(18238)) + ": " + nm)

...
rdname = open("names.dat", "r")
wrmain = open("main.dat", "a")
rdmain = open("main.dat", "r")

rdname_list = rdname.readlines()

for x in range(6):
    rd_number = randrange(18238)
    nm = rdname_list[rd_number]
    print(str(rd_number) + ": " + nm)
    wrmain.write("\n" + nm)
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM