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

标签 python file loops insertion

我有一个文本文件,其中的 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/

相关文章:

python - 将自定义函数应用于图像中每个像素的快速方法

python拆分字符串但保留分隔符

vb.net - 加密/解密文件出错

python - 在 Python 中,有没有比较简洁的方法来比较两个文本文件的内容是否相同?

java - 写入文件代码导致无限循环

c++ - 二维数组中的 Memset

Python生成和排序随机变量的4种情况出错

python - 调度 Python 脚本 - Linux

r - 在 R 中将大文件分区为小文件

python - BeautifulSoup xml获取类名值