【问题标题】:I have to close a txt before iterate a second time? [duplicate]我必须在第二次迭代之前关闭一个 txt? [复制]
【发布时间】:2019-05-13 00:45:59
【问题描述】:

我有一个带有升序浮动的文本文件。我必须在这个文件中包含一个给定的浮点数来保留顺序。我不能使用列表,每个浮点数必须单独在内存中,并查看它与给定数字的比较情况。

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

我做了这个代码:

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

【问题讨论】:

  • 每行代码的开头都不需要&gt;。那是报价格式化程序,但您已经正确格式化为代码:)

标签: python file loops insertion


【解决方案1】:

当你阅读或遍历一个文件时,会有一个指针告诉 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 的风险。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-26
      • 2020-07-02
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      相关资源
      最近更新 更多