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