我有一个文本文件,其中的 float 按升序排列。我必须将给定的 float 包含到该文件中以保留顺序。我无法使用列表,每个浮点必须单独存在于内存中,并查看它与给定数字的比较如何。
我尝试打开文件,创建辅助文件并迭代主文件的行。首先,如果该行小于给定的数字,我在辅助文件中写入,然后写入该数字并再次迭代,这次写入大于该数字的行。
我做了这段代码:
arq = open("teste.txt", "r")
aux = open(" aux.txt", "w")
for linha in arq:
if float(linha) < float(6.00):
aux.write(linha+"\n")
aux.write(6.00+"\n")
for linha in arq:
if float(linha) > float(6.00):
aux.write(linha+"\n")
arq.close()
aux.close()
但是没有达到我预期的效果,而且我不知道为什么......只有第一次迭代(小于数字的行)起作用并且包含数字本身。
然后我关闭文件并在第一次迭代后再次打开,这一次一切都符合我的预期。
arq = open("teste.txt", "r")
aux = open(" aux.txt", "w")
for linha in arq:
if float(linha) < float(6.00):
aux.write(linha+"\n")
aux.write(6.00+"\n")
arq.close()
arq = open("teste.txt", "r")
for linha in arq:
if float(linha) > float(6.00):
aux.write(linha+"\n")
arq.close()
aux.close()
我不知道有什么区别。有人可以指点我吗?看起来我每次打开 txt 文件只能迭代一次。
最佳答案
当你读取或迭代一个文件时,有一个指针告诉 python 你上次读取的位置,把它想象成一本实体书的书签。每次迭代,python 都会将书签移动到它刚刚读取的行的末尾。一旦您遍历文件一次,您的书签就会被放置在文件的末尾。当代码尝试再次迭代时,它将从上次放置书签的位置开始。在您的情况下,这意味着它只是退出,因为没有更多的行可供读取。
您可以使用arq.seek(0)
将“书签”重置到开头:
arq = open("teste.txt", "r")
aux = open("aux.txt", "w")
for linha in arq:
if float(linha) < float(6.00):
aux.write(linha+"\n")
aux.write(6.00+"\n")
arq.seek(0)
for linha in arq:
if float(linha) > float(6.00):
aux.write(linha+"\n")
arq.close()
aux.close()
或者您可以使用 with
语句在完成迭代后自动关闭文件并删除书签:
with open("aux.txt", "w") as aux:
with open("teste.txt", "r") as arq:
for linha in arq:
if float(linha) < float(6.00):
aux.write(linha+"\n")
aux.write(6.00+"\n")
with open("teste.txt", "r") as arq:
for linha in arq:
if float(linha) > float(6.00):
aux.write(linha+"\n")
或者两者的组合,这将是最有效的:
with open("aux.txt", "w") as aux, open("teste.txt", "r") as arq:
for linha in arq:
if float(linha) < float(6.00):
aux.write(linha+"\n")
aux.write(6.00+"\n")
arq.seek(0)
for linha in arq:
if float(linha) > float(6.00):
aux.write(linha+"\n")
无论哪种方式,使用 with
都是很好的做法,因为您不会冒意外忘记关闭文件的风险,从而导致 all sorts of problems .
关于python - 我必须在第二次迭代之前关闭 txt 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53734108/