Python 如何读取和替换同一文件中的行

Python 如何读取和替换同一文件中的行,python,Python,我有一个巨大的文本文件,有多行。我希望按顺序读取文件,并且每当我在任何一行中找到字符串时,都假定为“Apple” 我想替换整行,而不仅仅是字符串“Apple” 注意:“Apple”只是一行中包含多个其他字符的字符串。 将该行替换为“本店不再出售苹果” 我读到file.readlines()在读取大文件时效率不高。因此,请给我一些指导,告诉我如何在不使用readlines的情况下实现这一点。一种非常简单的方法是使用您的更改编写第二个文件,然后覆盖第一个文件 with open(input_file

我有一个巨大的文本文件,有多行。我希望按顺序读取文件,并且每当我在任何一行中找到字符串时,都假定为“Apple”

我想替换整行,而不仅仅是字符串“Apple”

注意:“Apple”只是一行中包含多个其他字符的字符串。 将该行替换为“本店不再出售苹果”


我读到
file.readlines()
在读取大文件时效率不高。因此,请给我一些指导,告诉我如何在不使用
readlines

的情况下实现这一点。一种非常简单的方法是使用您的更改编写第二个文件,然后覆盖第一个文件

with open(input_file, 'r') as ifile:
    with open(output_file, 'w') as ofile:
        for line in ifile:
            if 'Apple' in line:
                ofile.write('some other content')
            else:
                ofile.write(line)
然后删除输入文件并重命名输出文件


另一种方法是使用r+标志打开文件,并使用file.seek()在文件中移动。类似这样的情况(我没有测试过):

然而,这是不明智的,因为它容易出错。每次你重写一行的时候,你都在改变下一行的起始位置,所以我写的东西可能都不正确(如果替换的内容比原来的长,你有时可能会重写下一行的一部分)


如果文件很小,那么您应该将整个内容读入内存,如果文件很大,那么您应该使用临时文件

如果我们知道这个文件有多大,它可能会帮助我们推荐更好的策略。几百KB(对于一个刚开始编程的人来说通常是巨大的)和一个千兆字节的文件是完全不同的情况。谢谢Ian Mclaird的回复。该文件有600000行..,每行长度为4500字节。感谢Michael的回复。但是,我知道使用第二个文件选项。我只是想知道我们是否可以在不使用其他文件的情况下做同样的事情。如果行的长度改变,文件的大小也会改变。变更后的所有内容都会得到一个新的位置,必须重写。这需要在每一条变化的线路上发生。因为这样做效率很低,所以您应该在内存中处理小文件,并为大文件编写一个新文件
pos = 0
with open(filename, 'r+') as fi:
    while True:
        line = fi.readline()
        if line == '': 
            break
        if 'Apple' in line:
            fi.seek(pos)  # Return to beginning of the read-in line
            fi.write(line.replace("Apple", "Orange"))  # Write new line
            fi.seek(pos)  # Return to the beginning of the written line
            line = fi.readline()  # Read to the end of the line
        pos = fi.tell()  # Fetch new position in the file