我正在编写一个程序,要求我多次遍历文件的每一行:
loops = 0
file = open("somefile.txt")
while loops < 5:
for line in file:
print(line)
loops = loops + 1
为了简洁起见,我假设我总是需要遍历文件并打印每行5次。该代码与我在程序中实现的较长版本具有相同的问题:文件只迭代一次。之后,print(line)
文件什么都不做。这是为什么?
答案 0 :(得分:2)
for loop in range(5):
with open('somefile.txt') as fin:
for line in fin:
print(fin)
这将重新打开文件五次。如果你愿意的话,你可以seek()
来开始。
答案 1 :(得分:1)
这是因为file = open("somefile.txt")
行在循环之前只出现一次。这会创建一个指向文件中某个位置的光标,因此当您到达第一个循环的末尾时,光标位于文件的末尾。把它移到循环中:
loops = 0
while loops < 5:
file = open("somefile.txt")
for line in file:
print(line)
loops = loops + 1
答案 2 :(得分:1)
Python文件对象是迭代器。与其他迭代器一样,它们只能在耗尽之前迭代一次。尝试再次迭代会导致迭代器立即引发StopIteration
(它没有任何东西可以产生的信号)。
那就是说,文件对象确实让你有点作弊。与大多数其他迭代器不同,您可以使用seek
方法回滚它们。然后你可以再次迭代他们的内容。
另一种选择是每次需要迭代时重新打开文件。这很简单,但是(忽略操作系统的磁盘缓存)重复读取文件可能有点浪费。
最后一个选项是将文件的全部内容读入程序开头的列表中,然后在列表上进行迭代,而不是直接在文件上进行迭代。这可能是最有效的选项,只要文件足够小以便一次在内存中拟合它就不是问题。
答案 3 :(得分:0)
for line in file
读取每一行一次。如果要从第一行重新开始,可以关闭并重新打开文件。
答案 4 :(得分:0)
当指针指向文件中的最后一行时迭代,所以尝试使用 file.seek(0)而不是在循环中一次又一次地打开文件
with open('a.txt','r+')as f:
for i in range(0,5):
for line in f:
print(line)
f.seek(0)
答案 5 :(得分:0)
当您遍历文件时,默认情况下将文件视为生成器表达式。如果您想逐行遍历文件多次,您可能希望先将文件转换为类似列表。
lines = open("somefile.txt").read().splitlines()
for line in lines:
print(line)