两次调用随机行函数出现StopIteration错误的原因及解决
嘿,这个问题我太熟了!原因其实很简单——文件对象本质是一次性迭代器,第一次调用random_line(f)的时候,已经把文件里的内容从头到尾遍历完了,文件指针直接停在了文件末尾。第二次再调用的时候,next(afile)找不到下一行内容,自然就抛出StopIteration错误了。
下面给你几个实用的解决方案,按需选择就行:
方案1:每次调用时重新打开文件(适合大文件)
如果你的文件特别大,不想一次性加载到内存里,最稳妥的方式就是每次调用函数时重新打开文件。还可以用with语句自动管理文件关闭,避免资源泄漏:
import random def random_line(filename): with open(filename, 'r') as afile: line = next(afile) for num, aline in enumerate(afile): if random.randrange(num + 2): continue line = aline return line # 随便调用多少次都没问题 print(random_line("english.txt")) print(random_line("english.txt"))
方案2:预先把文件内容加载到列表(推荐,小文件首选)
如果文件体积不大,直接把所有行读到列表里,之后用random.choice()随机选取就行,代码更简洁,重复调用的效率也高得多:
import random # 一次性加载所有行到列表 with open("english.txt", 'r') as f: lines = f.readlines() # 想调用多少次就多少次 print(random.choice(lines).strip()) # strip()可以去掉行尾的换行符,按需选择 print(random.choice(lines).strip())
方案3:重置文件指针(复用同一个文件对象)
如果你一定要复用已经打开的文件对象,可以在每次调用前用seek(0)把文件指针移回开头:
import random def random_line(afile): line = next(afile) for num, aline in enumerate(afile): if random.randrange(num + 2): continue line = aline return line f = open("english.txt", 'r') print(random_line(f)) f.seek(0) # 把指针移回文件开头,准备下一次读取 print(random_line(f)) f.close()
内容的提问来源于stack exchange,提问作者user7986650
相关产品推荐
相关产品推荐

