我必须在第二次迭代之前关闭一个 txt 吗?

I have to close a txt before iterate a second time?

我有一个文本文件,其中浮点数按升序排列。我必须在此文件中包含一个给定的浮点数以保留顺序。我无法使用列表,每个浮点数都必须单独存在于内存中,并查看它与给定数字的比较情况。

我试着打开文件,创建一个辅助文件并迭代主文件的行。首先,如果该行小于给定的数字,我在辅助文件中写入,然后我写入数字并再次迭代,这次写入大于数字的行。

我做了这个代码:

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文件只能迭代一次。

文件处理程序(open() 的结果)跟踪其在文件中的位置,因为它不会将文件保存在内存中。它将从当前位置 (handle.tell()) 开始读取您正在读取的字节数。

长话短说,您正在寻找 handle.seek(...),它可以跳转到文件中的任何位置。在这种情况下,您想 arq.seek(0) 跳转到文件的第一个字节。

当您阅读或遍历文件时,会有一个指针告诉您 python 您上次阅读的位置,可以将其视为实体书的书签。每次迭代,python 将书签移动到它刚刚阅读的行的末尾。一旦你遍历文件一次,你的书签就被放在文件的末尾。当代码尝试再次迭代时,它会从上次放置书签的位置开始。在您的情况下,这意味着它只是退出,因为没有更多行可读。

您可以使用 arq.seek(0) 将 'bookmark' 重置为开头:

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.